Commit | Line | Data |
---|---|---|
007f790c JP |
1 | Switch (and switch-ish) device drivers HOWTO |
2 | =========================== | |
3 | ||
4 | Please note that the word "switch" is here used in very generic meaning. | |
5 | This include devices supporting L2/L3 but also various flow offloading chips, | |
6 | including switches embedded into SR-IOV NICs. | |
7 | ||
8 | Lets describe a topology a bit. Imagine the following example: | |
9 | ||
10 | +----------------------------+ +---------------+ | |
11 | | SOME switch chip | | CPU | | |
12 | +----------------------------+ +---------------+ | |
13 | port1 port2 port3 port4 MNGMNT | PCI-E | | |
14 | | | | | | +---------------+ | |
15 | PHY PHY | | | | NIC0 NIC1 | |
16 | | | | | | | | |
17 | | | +- PCI-E -+ | | | |
18 | | +------- MII -------+ | | |
19 | +------------- MII ------------+ | |
20 | ||
21 | In this example, there are two independent lines between the switch silicon | |
22 | and CPU. NIC0 and NIC1 drivers are not aware of a switch presence. They are | |
23 | separate from the switch driver. SOME switch chip is by managed by a driver | |
24 | via PCI-E device MNGMNT. Note that MNGMNT device, NIC0 and NIC1 may be | |
25 | connected to some other type of bus. | |
26 | ||
27 | Now, for the previous example show the representation in kernel: | |
28 | ||
29 | +----------------------------+ +---------------+ | |
30 | | SOME switch chip | | CPU | | |
31 | +----------------------------+ +---------------+ | |
32 | sw0p0 sw0p1 sw0p2 sw0p3 MNGMNT | PCI-E | | |
33 | | | | | | +---------------+ | |
34 | PHY PHY | | | | eth0 eth1 | |
35 | | | | | | | | |
36 | | | +- PCI-E -+ | | | |
37 | | +------- MII -------+ | | |
38 | +------------- MII ------------+ | |
39 | ||
40 | Lets call the example switch driver for SOME switch chip "SOMEswitch". This | |
41 | driver takes care of PCI-E device MNGMNT. There is a netdevice instance sw0pX | |
42 | created for each port of a switch. These netdevices are instances | |
43 | of "SOMEswitch" driver. sw0pX netdevices serve as a "representation" | |
44 | of the switch chip. eth0 and eth1 are instances of some other existing driver. | |
45 | ||
46 | The only difference of the switch-port netdevice from the ordinary netdevice | |
47 | is that is implements couple more NDOs: | |
48 | ||
49 | ndo_switch_parent_id_get - This returns the same ID for two port netdevices | |
50 | of the same physical switch chip. This is | |
51 | mandatory to be implemented by all switch drivers | |
52 | and serves the caller for recognition of a port | |
53 | netdevice. | |
54 | ndo_switch_parent_* - Functions that serve for a manipulation of the switch | |
55 | chip itself (it can be though of as a "parent" of the | |
56 | port, therefore the name). They are not port-specific. | |
57 | Caller might use arbitrary port netdevice of the same | |
58 | switch and it will make no difference. | |
59 | ndo_switch_port_* - Functions that serve for a port-specific manipulation. |