| Switch (and switch-ish) device drivers HOWTO | |
| =========================== | |
| Please note that the word "switch" is here used in very generic meaning. | |
| This include devices supporting L2/L3 but also various flow offloading chips, | |
| including switches embedded into SR-IOV NICs. | |
| Lets describe a topology a bit. Imagine the following example: | |
| +----------------------------+ +---------------+ | |
| | SOME switch chip | | CPU | | |
| +----------------------------+ +---------------+ | |
| port1 port2 port3 port4 MNGMNT | PCI-E | | |
| | | | | | +---------------+ | |
| PHY PHY | | | | NIC0 NIC1 | |
| | | | | | | | |
| | | +- PCI-E -+ | | | |
| | +------- MII -------+ | | |
| +------------- MII ------------+ | |
| In this example, there are two independent lines between the switch silicon | |
| and CPU. NIC0 and NIC1 drivers are not aware of a switch presence. They are | |
| separate from the switch driver. SOME switch chip is by managed by a driver | |
| via PCI-E device MNGMNT. Note that MNGMNT device, NIC0 and NIC1 may be | |
| connected to some other type of bus. | |
| Now, for the previous example show the representation in kernel: | |
| +----------------------------+ +---------------+ | |
| | SOME switch chip | | CPU | | |
| +----------------------------+ +---------------+ | |
| sw0p0 sw0p1 sw0p2 sw0p3 MNGMNT | PCI-E | | |
| | | | | | +---------------+ | |
| PHY PHY | | | | eth0 eth1 | |
| | | | | | | | |
| | | +- PCI-E -+ | | | |
| | +------- MII -------+ | | |
| +------------- MII ------------+ | |
| Lets call the example switch driver for SOME switch chip "SOMEswitch". This | |
| driver takes care of PCI-E device MNGMNT. There is a netdevice instance sw0pX | |
| created for each port of a switch. These netdevices are instances | |
| of "SOMEswitch" driver. sw0pX netdevices serve as a "representation" | |
| of the switch chip. eth0 and eth1 are instances of some other existing driver. | |
| The only difference of the switch-port netdevice from the ordinary netdevice | |
| is that is implements couple more NDOs: | |
| ndo_switch_parent_id_get - This returns the same ID for two port netdevices | |
| of the same physical switch chip. This is | |
| mandatory to be implemented by all switch drivers | |
| and serves the caller for recognition of a port | |
| netdevice. | |
| ndo_switch_parent_* - Functions that serve for a manipulation of the switch | |
| chip itself (it can be though of as a "parent" of the | |
| port, therefore the name). They are not port-specific. | |
| Caller might use arbitrary port netdevice of the same | |
| switch and it will make no difference. | |
| ndo_switch_port_* - Functions that serve for a port-specific manipulation. |