59 lines · 2.9 KB · Text
RawDownload
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 siliconand CPU. NIC0 and NIC1 drivers are not aware of a switch presence. They areseparate from the switch driver. SOME switch chip is by managed by a drivervia PCI-E device MNGMNT. Note that MNGMNT device, NIC0 and NIC1 may beconnected 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". Thisdriver takes care of PCI-E device MNGMNT. There is a netdevice instance sw0pXcreated for each port of a switch. These netdevices are instancesof "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 netdeviceis 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.