Commit 37c8e2b0 authored by David S. Miller's avatar David S. Miller

Merge branch 'switchdev-next'

Scott Feldman says:

====================
switchdev: documentation updates

Update the switchdev documentation to clarify that for IPV4 FIB object, the add
op is used for both adding and modifying the FIB entry on the device.

I found a few other white-space and grammer issues to fix, and to clarify the
static FDB ops.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9d1dabfb 7616dcbb
...@@ -114,11 +114,11 @@ would be sub-port 0 on port 1 on switch 1. ...@@ -114,11 +114,11 @@ would be sub-port 0 on port 1 on switch 1.
Switch ID Switch ID
^^^^^^^^^ ^^^^^^^^^
The switchdev driver must implement the switchdev op switchdev_port_attr_get for The switchdev driver must implement the switchdev op switchdev_port_attr_get
SWITCHDEV_ATTR_PORT_PARENT_ID for each port netdev, returning the same physical ID for SWITCHDEV_ATTR_PORT_PARENT_ID for each port netdev, returning the same
for each port of a switch. The ID must be unique between switches on the same physical ID for each port of a switch. The ID must be unique between switches
system. The ID does not need to be unique between switches on different on the same system. The ID does not need to be unique between switches on
systems. different systems.
The switch ID is used to locate ports on a switch and to know if aggregated The switch ID is used to locate ports on a switch and to know if aggregated
ports belong to the same switch. ports belong to the same switch.
...@@ -142,7 +142,7 @@ The port netdevs representing the physical switch ports can be organized into ...@@ -142,7 +142,7 @@ The port netdevs representing the physical switch ports can be organized into
higher-level switching constructs. The default construct is a standalone higher-level switching constructs. The default construct is a standalone
router port, used to offload L3 forwarding. Two or more ports can be bonded router port, used to offload L3 forwarding. Two or more ports can be bonded
together to form a LAG. Two or more ports (or LAGs) can be bridged to bridge together to form a LAG. Two or more ports (or LAGs) can be bridged to bridge
to L2 networks. VLANs can be applied to sub-divide L2 networks. L2-over-L3 L2 networks. VLANs can be applied to sub-divide L2 networks. L2-over-L3
tunnels can be built on ports. These constructs are built using standard Linux tunnels can be built on ports. These constructs are built using standard Linux
tools such as the bridge driver, the bonding/team drivers, and netlink-based tools such as the bridge driver, the bonding/team drivers, and netlink-based
tools such as iproute2. tools such as iproute2.
...@@ -177,6 +177,10 @@ entries are installed, for example, using iproute2 bridge cmd: ...@@ -177,6 +177,10 @@ entries are installed, for example, using iproute2 bridge cmd:
bridge fdb add ADDR dev DEV [vlan VID] [self] bridge fdb add ADDR dev DEV [vlan VID] [self]
The driver should use the helper switchdev_port_fdb_xxx ops for ndo_fdb_xxx
ops, and handle add/delete/dump of SWITCHDEV_OBJ_PORT_FDB object using
switchdev_port_obj_xxx ops.
XXX: what should be done if offloading this rule to hardware fails (for XXX: what should be done if offloading this rule to hardware fails (for
example, due to full capacity in hardware tables) ? example, due to full capacity in hardware tables) ?
...@@ -194,11 +198,11 @@ in turn, will notify the bridge driver using the switchdev notifier call: ...@@ -194,11 +198,11 @@ in turn, will notify the bridge driver using the switchdev notifier call:
err = call_switchdev_notifiers(val, dev, info); err = call_switchdev_notifiers(val, dev, info);
Where val is SWITCHDEV_FDB_ADD when learning and SWITCHDEV_FDB_DEL when forgetting, and Where val is SWITCHDEV_FDB_ADD when learning and SWITCHDEV_FDB_DEL when
info points to a struct switchdev_notifier_fdb_info. On SWITCHDEV_FDB_ADD, the bridge forgetting, and info points to a struct switchdev_notifier_fdb_info. On
driver will install the FDB entry into the bridge's FDB and mark the entry as SWITCHDEV_FDB_ADD, the bridge driver will install the FDB entry into the
NTF_EXT_LEARNED. The iproute2 bridge command will label these entries bridge's FDB and mark the entry as NTF_EXT_LEARNED. The iproute2 bridge
"offload": command will label these entries "offload":
$ bridge fdb $ bridge fdb
52:54:00:12:35:01 dev sw1p1 master br0 permanent 52:54:00:12:35:01 dev sw1p1 master br0 permanent
...@@ -229,18 +233,18 @@ the bridge's FDB. It's possible, but not optimal, to enable learning on the ...@@ -229,18 +233,18 @@ the bridge's FDB. It's possible, but not optimal, to enable learning on the
device port and on the bridge port, and disable learning_sync. device port and on the bridge port, and disable learning_sync.
To support learning and learning_sync port attributes, the driver implements To support learning and learning_sync port attributes, the driver implements
switchdev op switchdev_port_attr_get/set for SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS. The driver switchdev op switchdev_port_attr_get/set for SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS.
should initialize the attributes to the hardware defaults. The driver should initialize the attributes to the hardware defaults.
FDB Ageing FDB Ageing
^^^^^^^^^^ ^^^^^^^^^^
There are two FDB ageing models supported: 1) ageing by the device, and 2) There are two FDB ageing models supported: 1) ageing by the device, and 2)
ageing by the kernel. Ageing by the device is preferred if many FDB entries ageing by the kernel. Ageing by the device is preferred if many FDB entries
are supported. The driver calls call_switchdev_notifiers(SWITCHDEV_FDB_DEL, ...) to are supported. The driver calls call_switchdev_notifiers(SWITCHDEV_FDB_DEL,
age out the FDB entry. In this model, ageing by the kernel should be turned ...) to age out the FDB entry. In this model, ageing by the kernel should be
off. XXX: how to turn off ageing in kernel on a per-port basis or otherwise turned off. XXX: how to turn off ageing in kernel on a per-port basis or
prevent the kernel from ageing out the FDB entry? otherwise prevent the kernel from ageing out the FDB entry?
In the kernel ageing model, the standard bridge ageing mechanism is used to age In the kernel ageing model, the standard bridge ageing mechanism is used to age
out stale FDB entries. To keep an FDB entry "alive", the driver should refresh out stale FDB entries. To keep an FDB entry "alive", the driver should refresh
...@@ -262,8 +266,8 @@ STP State Change on Port ...@@ -262,8 +266,8 @@ STP State Change on Port
Internally or with a third-party STP protocol implementation (e.g. mstpd), the Internally or with a third-party STP protocol implementation (e.g. mstpd), the
bridge driver maintains the STP state for ports, and will notify the switch bridge driver maintains the STP state for ports, and will notify the switch
driver of STP state change on a port using the switchdev op switchdev_attr_port_set for driver of STP state change on a port using the switchdev op
SWITCHDEV_ATTR_PORT_STP_UPDATE. switchdev_attr_port_set for SWITCHDEV_ATTR_PORT_STP_UPDATE.
State is one of BR_STATE_*. The switch driver can use STP state updates to State is one of BR_STATE_*. The switch driver can use STP state updates to
update ingress packet filter list for the port. For example, if port is update ingress packet filter list for the port. For example, if port is
...@@ -296,33 +300,38 @@ IGMP Snooping ...@@ -296,33 +300,38 @@ IGMP Snooping
XXX: complete this section XXX: complete this section
L3 routing L3 Routing Offload
---------- ------------------
Offloading L3 routing requires that device be programmed with FIB entries from Offloading L3 routing requires that device be programmed with FIB entries from
the kernel, with the device doing the FIB lookup and forwarding. The device the kernel, with the device doing the FIB lookup and forwarding. The device
does a longest prefix match (LPM) on FIB entries matching route prefix and does a longest prefix match (LPM) on FIB entries matching route prefix and
forwards the packet to the matching FIB entry's nexthop(s) egress ports. To forwards the packet to the matching FIB entry's nexthop(s) egress ports.
program the device, the switchdev driver is called with add/delete ops for IPv4
and IPv6 FIB entries. For IPv4, the driver implements switchdev ops: To program the device, the driver implements support for
SWITCHDEV_OBJ_IPV[4|6]_FIB object using switchdev_port_obj_xxx ops.
int (*switchdev_fib_ipv4_add)(struct net_device *dev, switchdev_port_obj_add is used for both adding a new FIB entry to the device,
__be32 dst, int dst_len, or modifying an existing entry on the device.
struct fib_info *fi,
u8 tos, u8 type, XXX: Currently, only SWITCHDEV_OBJ_IPV4_FIB objects are supported.
u32 nlflags, u32 tb_id);
SWITCHDEV_OBJ_IPV4_FIB object passes:
int (*switchdev_fib_ipv4_del)(struct net_device *dev,
__be32 dst, int dst_len, struct switchdev_obj_ipv4_fib { /* IPV4_FIB */
struct fib_info *fi, u32 dst;
u8 tos, u8 type, int dst_len;
u32 tb_id); struct fib_info *fi;
u8 tos;
to add/delete IPv4 dst/dest_len prefix on table tb_id. The *fi structure holds u8 type;
details on the route and route's nexthops. *dev is one of the port netdevs u32 nlflags;
mentioned in the routes next hop list. If the output port netdevs referenced u32 tb_id;
in the route's nexthop list don't all have the same switch ID, the driver is } ipv4_fib;
not called to add/delete the FIB entry.
to add/modify/delete IPv4 dst/dest_len prefix on table tb_id. The *fi
structure holds details on the route and route's nexthops. *dev is one of the
port netdevs mentioned in the routes next hop list. If the output port netdevs
referenced in the route's nexthop list don't all have the same switch ID, the
driver is not called to add/modify/delete the FIB entry.
Routes offloaded to the device are labeled with "offload" in the ip route Routes offloaded to the device are labeled with "offload" in the ip route
listing: listing:
...@@ -340,7 +349,7 @@ listing: ...@@ -340,7 +349,7 @@ listing:
12.0.0.4 via 11.0.0.9 dev sw1p2 proto zebra metric 20 offload 12.0.0.4 via 11.0.0.9 dev sw1p2 proto zebra metric 20 offload
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.15 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.15
XXX: add/del IPv6 FIB API XXX: add/mod/del IPv6 FIB API
Nexthop Resolution Nexthop Resolution
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
......
...@@ -803,7 +803,7 @@ static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi) ...@@ -803,7 +803,7 @@ static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi)
} }
/** /**
* switchdev_fib_ipv4_add - Add IPv4 route entry to switch * switchdev_fib_ipv4_add - Add/modify switch IPv4 route entry
* *
* @dst: route's IPv4 destination address * @dst: route's IPv4 destination address
* @dst_len: destination address length (prefix length) * @dst_len: destination address length (prefix length)
...@@ -813,7 +813,7 @@ static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi) ...@@ -813,7 +813,7 @@ static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi)
* @nlflags: netlink flags passed in (NLM_F_*) * @nlflags: netlink flags passed in (NLM_F_*)
* @tb_id: route table ID * @tb_id: route table ID
* *
* Add IPv4 route entry to switch device. * Add/modify switch IPv4 route entry.
*/ */
int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi, int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
u8 tos, u8 type, u32 nlflags, u32 tb_id) u8 tos, u8 type, u32 nlflags, u32 tb_id)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment