| Supported Targets | ESP32 |
| ----------------- | ----- |
# KSZ8863 Managed Switch Example
## Overview
This example demonstrates initialization and basic usage of KSZ8863 driver in **Managed Switch Mode**. See the README.md file in the upper level directories to learn more about this mode.
## How to use example
You need one ESP32 with KSZ8863 and two PC's (or other Ethernet capable devices). Connect the network as shown in figure below, configure PC#1 as DHCP server and PC#2 as DHCP client.

The work flow of the example is then as follows:
1. Install the KSZ8863 Ethernet driver in ESP32.
2. Wait for a DHCP leases in ESP32 and PC#2.
3. If get IP addresses successfully, then you will be able to ping the ESP32 device and PC#2 from PC#1 (and vice versa).
4. You will be able to receive **different "L2 Test messages"** in each of PC#1 and PC#2 (use ``Wireshark`` or ``tcpdump``).
### Configure the project
Configure pin assignment, control interface and RMII REFCLK as per your board needs.
```
idf.py menuconfig
```
For more information, see help associated with each option in ESP-IDF Configuration tool.
### Build, Flash, and Run
Build the project and flash it to the board, then run monitor tool to view serial output:
```
idf.py -p PORT build flash monitor
```
(Replace PORT with the name of the serial port to use.)
(To exit the serial monitor, type ``Ctrl-]``.)
See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects.
## Example Output
**ESP32 with KSZ8863 output:**
```bash
I (455) switch_example: Ethernet Link Up
I (465) switch_example: Ethernet HW Addr 8c:4b:14:0a:14:63
I (2555) switch_example: Ethernet Started
I (2555) switch_example: Ethernet Link Up Port 1
I (2555) switch_example: Ethernet HW Addr 8c:4b:14:0a:14:63
I (4555) switch_example: Ethernet Started
I (4555) switch_example: Ethernet Link Up Port 2
I (4555) switch_example: Ethernet HW Addr 8c:4b:14:0a:14:63
I (4565) switch_example: Dynamic MAC Table content:
I (4565) switch_example: valid entries 3
I (4565) switch_example: port 1
I (4575) switch_example: 00 e0 4c 68 01 ac
I (4575) switch_example: port 2
I (4575) switch_example: 70 85 c2 d3 ea 18
I (4585) switch_example: port 3
I (4585) switch_example: 8c 4b 14 0a 14 63
I (5905) esp_netif_handlers: eth ip: 192.168.20.105, mask: 255.255.255.0, gw: 192.168.20.1
I (5905) switch_example: Ethernet Got IP Address
I (5905) switch_example: ~~~~~~~~~~~
I (5905) switch_example: ETHIP:192.168.20.105
I (5915) switch_example: ETHMASK:255.255.255.0
I (5915) switch_example: ETHGW:192.168.20.1
I (5925) switch_example: ~~~~~~~~~~~
```
**PC#2 output (on Linux OS):**
```bash
$ ip a
...
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 70:85:c2:d3:ea:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.116/24 brd 192.168.20.255 scope global dynamic noprefixroute enp4s0
valid_lft 346sec preferred_lft 346sec
inet6 fe80::4efa:2bae:e58c:231e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
...
```
Now you can ping your ESP32 in PC#1 terminal by entering `ping 192.168.20.105` and PC#2 in PC#1 terminal by entering `ping 192.168.20.116` (it depends on the actual IP address you get).
You can also check the received test message in PC#1 or PC#2 as follows (on Linux OS):
```bash
$ sudo tcpdump -i enp4s0
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on enp4s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
11:20:29.820931 8c:4b:14:0a:14:63 (oui Unknown) > Broadcast, ethertype Unknown (0x7000), length 60:
0x0000: 0000 5468 6973 2069 7320 4553 5033 3220 ..This.is.ESP32.
0x0010: 4c32 2054 4150 2074 6573 7420 6d73 6720 L2.TAP.test.msg.
0x0020: 6672 6f6d 2050 6f72 743a 2032 0000 from.Port:.2..
```
Note: replace "enp4s0" with actual name of your Ethernet interface.
To create a project from this example, run:
idf.py create-project-from-example "espressif/ksz8863=0.2.7:switch_mode"