60 lines
		
	
	
	
		
			2.9 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
	
		
			2.9 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								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.
							 |