-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
net: introduce generic switch devices support
The goal of this is to provide a possibility to support various switch chips. Drivers should implement relevant ndos to do so. Now there is only one ndo defined: - for getting physical switch id is in place. Note that user can use random port netdevice to access the switch. Signed-off-by: Jiri Pirko <[email protected]> Reviewed-by: Thomas Graf <[email protected]> Acked-by: Andy Gospodarek <[email protected]> Signed-off-by: David S. Miller <[email protected]>
- Loading branch information
Showing
9 changed files
with
161 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9059,6 +9059,13 @@ F: lib/swiotlb.c | |
F: arch/*/kernel/pci-swiotlb.c | ||
F: include/linux/swiotlb.h | ||
|
||
SWITCHDEV | ||
M: Jiri Pirko <[email protected]> | ||
L: [email protected] | ||
S: Supported | ||
F: net/switchdev/ | ||
F: include/net/switchdev.h | ||
|
||
SYNOPSYS ARC ARCHITECTURE | ||
M: Vineet Gupta <[email protected]> | ||
S: Supported | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* | ||
* include/net/switchdev.h - Switch device API | ||
* Copyright (c) 2014 Jiri Pirko <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
*/ | ||
#ifndef _LINUX_SWITCHDEV_H_ | ||
#define _LINUX_SWITCHDEV_H_ | ||
|
||
#include <linux/netdevice.h> | ||
|
||
#ifdef CONFIG_NET_SWITCHDEV | ||
|
||
int netdev_switch_parent_id_get(struct net_device *dev, | ||
struct netdev_phys_item_id *psid); | ||
|
||
#else | ||
|
||
static inline int netdev_switch_parent_id_get(struct net_device *dev, | ||
struct netdev_phys_item_id *psid) | ||
{ | ||
return -EOPNOTSUPP; | ||
} | ||
|
||
#endif | ||
|
||
#endif /* _LINUX_SWITCHDEV_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# | ||
# Configuration for Switch device support | ||
# | ||
|
||
config NET_SWITCHDEV | ||
boolean "Switch (and switch-ish) device support (EXPERIMENTAL)" | ||
depends on INET | ||
---help--- | ||
This module provides glue between core networking code and device | ||
drivers in order to support hardware switch chips in very generic | ||
meaning of the word "switch". This include devices supporting L2/L3 but | ||
also various flow offloading chips, including switches embedded into | ||
SR-IOV NICs. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
# | ||
# Makefile for the Switch device API | ||
# | ||
|
||
obj-$(CONFIG_NET_SWITCHDEV) += switchdev.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/* | ||
* net/switchdev/switchdev.c - Switch device API | ||
* Copyright (c) 2014 Jiri Pirko <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/types.h> | ||
#include <linux/init.h> | ||
#include <linux/netdevice.h> | ||
#include <net/switchdev.h> | ||
|
||
/** | ||
* netdev_switch_parent_id_get - Get ID of a switch | ||
* @dev: port device | ||
* @psid: switch ID | ||
* | ||
* Get ID of a switch this port is part of. | ||
*/ | ||
int netdev_switch_parent_id_get(struct net_device *dev, | ||
struct netdev_phys_item_id *psid) | ||
{ | ||
const struct net_device_ops *ops = dev->netdev_ops; | ||
|
||
if (!ops->ndo_switch_parent_id_get) | ||
return -EOPNOTSUPP; | ||
return ops->ndo_switch_parent_id_get(dev, psid); | ||
} | ||
EXPORT_SYMBOL(netdev_switch_parent_id_get); |