| 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. |