switchdev: add swdev ops
Subsystems (5)
v2 cover switchdev: add swdev ops
From: Scott Feldman <[email protected]>
v2:
- Per Simon's review, squash some of the dependent commits into one to make series git bisect safe.
v1:
Per discussions at netconf, move switchdev ndo ops to a new swdev_ops to keep ndo namespace clean and maintain switchdev-related ops into one place.
There are no functional changes here; just shuffling ops around for better organization.
Scott Feldman (3):
switchdev: add swdev ops
switchdev: use new swdev ops
netdev: remove ndo ops for switchdev
drivers/net/ethernet/rocker/rocker.c | 64 +++++++++++++++++++--------------- include/linux/netdevice.h | 41 ++-------------------- include/net/switchdev.h | 38 ++++++++++++++++++++ net/dsa/slave.c | 8 +++-- net/switchdev/switchdev.c | 42 +++++++++++----------- 5 files changed, 104 insertions(+), 89 deletions(-)
Signature · 1 line
1.7.10.4
PATCH v2 1/3 switchdev: add swdev ops
From: Scott Feldman <[email protected]>
As discussed at netconf, introduce swdev_ops as first step to move switchdev ops from ndo to swdev. This will keep switchdev from cluttering up ndo ops space.
--- include/linux/netdevice.h | 3 +++ include/net/switchdev.h | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+)
include/linux/netdevice.h +3 -0
@@ -1577,6 +1577,9 @@ struct net_device {const struct net_device_ops *netdev_ops;const struct ethtool_ops *ethtool_ops;const struct forwarding_accel_ops *fwd_ops; +#ifdef CONFIG_NET_SWITCHDEV +const struct swdev_ops *swdev_ops; +#endif const struct header_ops *header_ops;
include/net/switchdev.h +38 -0
@@ -14,6 +14,44 @@#include <linux/netdevice.h> #include <linux/notifier.h> +struct fib_info ; + +/** +* struct switchdev_ops - switchdev operations +* +* int (*swdev_parent_id_get)(struct net_device *dev, +* struct netdev_phys_item_id *psid); +* Called to get an ID of the switch chip this port is part of. +* If driver implements this, it indicates that it represents a port +* of a switch chip. +* +* int (*swdev_port_stp_update)(struct net_device *dev, u8 state); +* Called to notify switch device port of bridge port STP +* state change. +* +* int (*swdev_fib_ipv4_add)(struct net_device *dev, __be32 dst, +* int dst_len, struct fib_info *fi, +* u8 tos, u8 type, u32 nlflags, u32 tb_id); +* Called to add/modify IPv4 route to switch device. +* +* int (*swdev_fib_ipv4_del)(struct net_device *dev, __be32 dst, +* int dst_len, struct fib_info *fi, +* u8 tos, u8 type, u32 tb_id); +* Called to delete IPv4 route from switch device. +*/ +struct swdev_ops { +int (*swdev_parent_id_get)(struct net_device *dev, +struct netdev_phys_item_id *psid); +int (*swdev_port_stp_update)(struct net_device *dev,u8 state); +int (*swdev_fib_ipv4_add)(struct net_device *dev,__be32 dst, +int dst_len,struct fib_info *fi, +u8 tos,u8 type,u32 nlflags, +u32 tb_id); +int (*swdev_fib_ipv4_del)(struct net_device *dev,__be32 dst, +int dst_len,struct fib_info *fi, +u8 tos,u8 type,u32 tb_id); +}; +enum netdev_switch_notifier_type {NETDEV_SWITCH_FDB_ADD =1 ,NETDEV_SWITCH_FDB_DEL ,
Signature · 1 line
1.7.10.4
On Sun, 2015-03-15 at 18:45 -0700, [email protected] wrote:
[...]
Quoted 14 lines
+/**
+ * structswitchdev_ops- switchdev operations
+ *
+ * int (*swdev_parent_id_get)(structnet_device*dev,
+ * structnetdev_phys_item_id*psid);
+ * Called to get an ID of the switch chip this port is part of.
+ * If driver implements this, it indicates that it represents a port
+ * of a switch chip.
+ *
+ * int (*swdev_port_stp_update)(structnet_device*dev, u8 state);
+ * Called to notify switch device port of bridge port STP
+ * state change.
+ *
+ * int (*swdev_fib_ipv4_add)(structnet_device*dev,__be32dst,
Quoted 8 lines
+ * int
dst_len, structfib_info*fi,
+ * u8 tos, u8 type, u32 nlflags, u32tb_id);
+ * Called to add/modify IPv4 route to switch device.
+ *
+ * int (*swdev_fib_ipv4_del)(structnet_device*dev,__be32dst,
+ * intdst_len, structfib_info*fi,
+ * u8 tos, u8 type, u32tb_id);
+ * Called to delete IPv4 route from switch device.
[...]
This isn't correct kernel-doc syntax.
Ben.
Signature · 2 lines
Ben Hutchings All extremists should be taken out and shot.
Quoted 24 lines · Ben Hutchings
On Sun, 2015-03-15 at 18:45 -0700, [email protected] wrote:
[...]Quoted 8 lines
+/**
+ * structswitchdev_ops- switchdev operations
+ *
+ * int (*swdev_parent_id_get)(structnet_device*dev,
+ * structnetdev_phys_item_id*psid);+ * Called to get an ID of the switch chip this port is part of. + * If driver implements this, it indicates that it represents a port + * of a switch chip.Quoted 14 lines
+ *
+ * int (*swdev_port_stp_update)(structnet_device*dev, u8 state);
+ * Called to notify switch device port of bridge port STP
+ * state change.
+ *
+ * int (*swdev_fib_ipv4_add)(structnet_device*dev,__be32dst,
+ * intdst_len, structfib_info*fi,
+ * u8 tos, u8 type, u32 nlflags, u32tb_id);
+ * Called to add/modify IPv4 route to switch device.
+ *
+ * int (*swdev_fib_ipv4_del)(structnet_device*dev,__be32dst,
+ * intdst_len, structfib_info*fi,
+ * u8 tos, u8 type, u32tb_id);
+ * Called to delete IPv4 route from switch device.
Quoted 3 lines
[...]
This isn't correct kernel-doc syntax.
It was a cut-and-paste from netdevice.h. Give me an example of correct syntax, and I'll fix these.
-scott
Quoted 25 lines · Scott Feldman
Quoted 24 lines · Ben Hutchings
On Sun, 2015-03-15 at 18:45 -0700, [email protected] wrote:
[...]Quoted 22 lines
+/**
+ * structswitchdev_ops- switchdev operations
+ *
+ * int (*swdev_parent_id_get)(structnet_device*dev,
+ * structnetdev_phys_item_id*psid);+ * Called to get an ID of the switch chip this port is part of. + * If driver implements this, it indicates that it represents a port + * of a switch chip.+ *
+ * int (*swdev_port_stp_update)(structnet_device*dev, u8 state);
+ * Called to notify switch device port of bridge port STP
+ * state change.
+ *
+ * int (*swdev_fib_ipv4_add)(structnet_device*dev,__be32dst,
+ * intdst_len, structfib_info*fi,
+ * u8 tos, u8 type, u32 nlflags, u32tb_id);
+ * Called to add/modify IPv4 route to switch device.
+ *
+ * int (*swdev_fib_ipv4_del)(structnet_device*dev,__be32dst,
+ * intdst_len, structfib_info*fi,
+ * u8 tos, u8 type, u32tb_id);
+ * Called to delete IPv4 route from switch device.
Quoted 6 lines
Quoted 3 lines
[...]
This isn't correct kernel-doc syntax.
It was a cut-and-paste from
netdevice.h. Give me an example of correct syntax, and I'll fix these.
/**
* struct switchdev_ops - switchdev operations
* @swdev_parent_id_get: Called to get an ID of the switch chip this
* port is part of. If driver implements this, it indicates that
* it represents a port of a switch chip.
* ...
*/
Ben.
Signature · 2 lines
Ben Hutchings If you seem to know what you are doing, you'll be given more to do.
PATCH v2 2/3 switchdev: use new swdev ops
In reply to [email protected]From: Scott Feldman <[email protected]>
Move swdev wrappers over to new swdev ops (from previous ndo ops). No functional changes to the implementation.
rocker: move to new swdev ops
dsa: move to new swdev ops
--- drivers/net/ethernet/rocker/rocker.c | 64 +++++++++++++++++++--------------- net/dsa/slave.c | 8 +++-- net/switchdev/switchdev.c | 42 +++++++++++----------- 3 files changed, 63 insertions(+), 51 deletions(-)
drivers/net/ethernet/rocker/rocker.c +36 -28
@@ -4131,8 +4131,26 @@ static int rocker_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, rocker_port->brport_flags, mask); } -static int rocker_port_switch_parent_id_get (struct net_device *dev, -struct netdev_phys_item_id *psid) +static const struct net_device_ops rocker_port_netdev_ops = { + .ndo_open = rocker_port_open, + .ndo_stop = rocker_port_stop, + .ndo_start_xmit = rocker_port_xmit, + .ndo_set_mac_address = rocker_port_set_mac_address, + .ndo_vlan_rx_add_vid = rocker_port_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = rocker_port_vlan_rx_kill_vid, + .ndo_fdb_add = rocker_port_fdb_add, + .ndo_fdb_del = rocker_port_fdb_del, + .ndo_fdb_dump = rocker_port_fdb_dump, + .ndo_bridge_setlink = rocker_port_bridge_setlink, + .ndo_bridge_getlink = rocker_port_bridge_getlink, +}; + +/******************** +* swdev interface +********************/ + +static int rocker_port_swdev_parent_id_get (struct net_device *dev, +struct netdev_phys_item_id *psid) {struct rocker_port *rocker_port =netdev_priv (dev);struct rocker *rocker = rocker_port->rocker;
@@ -4142,18 +4160,18 @@ static int rocker_port_switch_parent_id_get(struct net_device *dev,return 0 ; } -static int rocker_port_switch_port_stp_update (struct net_device *dev,u8 state) +static int rocker_port_swdev_port_stp_update (struct net_device *dev,u8 state) {struct rocker_port *rocker_port =netdev_priv (dev);return rocker_port_stp_update (rocker_port, state); } -static int rocker_port_switch_fib_ipv4_add (struct net_device *dev, -__be32 dst,int dst_len, -struct fib_info *fi, -u8 tos,u8 type, -u32 nlflags,u32 tb_id) +static int rocker_port_swdev_fib_ipv4_add (struct net_device *dev, +__be32 dst,int dst_len, +struct fib_info *fi, +u8 tos,u8 type, +u32 nlflags,u32 tb_id) {struct rocker_port *rocker_port =netdev_priv (dev);int flags =0 ;
@@ -4162,10 +4180,10 @@ static int rocker_port_switch_fib_ipv4_add(struct net_device *dev, fi, tb_id, flags); } -static int rocker_port_switch_fib_ipv4_del (struct net_device *dev, -__be32 dst,int dst_len, -struct fib_info *fi, -u8 tos,u8 type,u32 tb_id) +static int rocker_port_swdev_fib_ipv4_del (struct net_device *dev, +__be32 dst,int dst_len, +struct fib_info *fi, +u8 tos,u8 type,u32 tb_id) {struct rocker_port *rocker_port =netdev_priv (dev);int flags =ROCKER_OP_FLAG_REMOVE ;
@@ -4174,22 +4192,11 @@ static int rocker_port_switch_fib_ipv4_del(struct net_device *dev, fi, tb_id, flags); } -static const struct net_device_ops rocker_port_netdev_ops = { - .ndo_open = rocker_port_open, - .ndo_stop = rocker_port_stop, - .ndo_start_xmit = rocker_port_xmit, - .ndo_set_mac_address = rocker_port_set_mac_address, - .ndo_vlan_rx_add_vid = rocker_port_vlan_rx_add_vid, - .ndo_vlan_rx_kill_vid = rocker_port_vlan_rx_kill_vid, - .ndo_fdb_add = rocker_port_fdb_add, - .ndo_fdb_del = rocker_port_fdb_del, - .ndo_fdb_dump = rocker_port_fdb_dump, - .ndo_bridge_setlink = rocker_port_bridge_setlink, - .ndo_bridge_getlink = rocker_port_bridge_getlink, - .ndo_switch_parent_id_get = rocker_port_switch_parent_id_get, - .ndo_switch_port_stp_update = rocker_port_switch_port_stp_update, - .ndo_switch_fib_ipv4_add = rocker_port_switch_fib_ipv4_add, - .ndo_switch_fib_ipv4_del = rocker_port_switch_fib_ipv4_del, +static const struct swdev_ops rocker_port_swdev_ops = { + .swdev_parent_id_get = rocker_port_swdev_parent_id_get, + .swdev_port_stp_update = rocker_port_swdev_port_stp_update, + .swdev_fib_ipv4_add = rocker_port_swdev_fib_ipv4_add, + .swdev_fib_ipv4_del = rocker_port_swdev_fib_ipv4_del, };/********************
@@ -4544,6 +4551,7 @@ static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)rocker_port_dev_addr_init (rocker, rocker_port); dev->netdev_ops = &rocker_port_netdev_ops; dev->ethtool_ops = &rocker_port_ethtool_ops; + dev->swdev_ops = &rocker_port_swdev_ops;netif_napi_add (dev, &rocker_port->napi_tx, rocker_port_poll_tx,NAPI_POLL_WEIGHT ); netif_napi_add(dev, &rocker_port->napi_rx, rocker_port_poll_rx,
net/dsa/slave.c +6 -2
@@ -572,8 +572,11 @@ static const struct net_device_ops dsa_slave_netdev_ops = { .ndo_set_rx_mode = dsa_slave_set_rx_mode, .ndo_set_mac_address = dsa_slave_set_mac_address, .ndo_do_ioctl = dsa_slave_ioctl, - .ndo_switch_parent_id_get = dsa_slave_parent_id_get, - .ndo_switch_port_stp_update = dsa_slave_stp_update, +}; + +static const struct swdev_ops dsa_slave_swdev_ops = { + .swdev_parent_id_get = dsa_slave_parent_id_get, + .swdev_port_stp_update = dsa_slave_stp_update, };static void dsa_slave_adjust_link (struct net_device *dev)
@@ -755,6 +758,7 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,eth_hw_addr_inherit (slave_dev, master); slave_dev->tx_queue_len =0 ; slave_dev->netdev_ops = &dsa_slave_netdev_ops; + slave_dev->swdev_ops = &dsa_slave_swdev_ops;SET_NETDEV_DEV (slave_dev, parent); slave_dev->dev.of_node = ds->pd->port_dn[port];
net/switchdev/switchdev.c +21 -21
98 lines not on this page · raw message
Signature · 1 line
1.7.10.4
PATCH v2 3/3 netdev: remove ndo ops for switchdev
In reply to [email protected]From: Scott Feldman <[email protected]>
--- include/linux/netdevice.h | 38 -------------------------------------- 1 file changed, 38 deletions(-)
include/linux/netdevice.h +0 -38
@@ -768,8 +768,6 @@ struct netdev_phys_item_id {typedef u16 (*select_queue_fallback_t )(struct net_device *dev,struct sk_buff *skb); -struct fib_info ; -/* * This structure defines the management hooks for network devices. * The following hooks can be defined; unless noted otherwise, they are
@@ -1024,23 +1022,6 @@ struct fib_info;* be otherwise expressed by feature flags. The check is called with * the set of features that the stack has calculated and it returns * those the driver believes to be appropriate. -* -* int (*ndo_switch_parent_id_get)(struct net_device *dev, -* struct netdev_phys_item_id *psid); -* Called to get an ID of the switch chip this port is part of. -* If driver implements this, it indicates that it represents a port -* of a switch chip. -* int (*ndo_switch_port_stp_update)(struct net_device *dev, u8 state); -* Called to notify switch device port of bridge port STP -* state change. -* int (*ndo_sw_parent_fib_ipv4_add)(struct net_device *dev, __be32 dst, -* int dst_len, struct fib_info *fi, -* u8 tos, u8 type, u32 nlflags, u32 tb_id); -* Called to add/modify IPv4 route to switch device. -* int (*ndo_sw_parent_fib_ipv4_del)(struct net_device *dev, __be32 dst, -* int dst_len, struct fib_info *fi, -* u8 tos, u8 type, u32 tb_id); -* Called to delete IPv4 route from switch device. */ struct net_device_ops {int (*ndo_init)(struct net_device *dev);
@@ -1197,25 +1178,6 @@ struct net_device_ops {netdev_features_t (*ndo_features_check) (struct sk_buff *skb,struct net_device *dev,netdev_features_t features); -#ifdef CONFIG_NET_SWITCHDEV -int (*ndo_switch_parent_id_get)(struct net_device *dev, -struct netdev_phys_item_id *psid); -int (*ndo_switch_port_stp_update)(struct net_device *dev, -u8 state); -int (*ndo_switch_fib_ipv4_add)(struct net_device *dev, -__be32 dst, -int dst_len, -struct fib_info *fi, -u8 tos,u8 type, -u32 nlflags, -u32 tb_id); -int (*ndo_switch_fib_ipv4_del)(struct net_device *dev, -__be32 dst, -int dst_len, -struct fib_info *fi, -u8 tos,u8 type, -u32 tb_id); -#endif };/**
Signature · 1 line
1.7.10.4
David Miller
maintainerFrom: [email protected]
Date: Sun, 15 Mar 2015 18:45:18 -0700
Quoted 5 lines
v2:
- Per Simon's review, squash some of the dependent commits into one to make series git bisect safe.
Quoted 7 lines
v1:
Per discussions at netconf, move switchdev ndo ops to a new
swdev_opsto keep ndo namespace clean and maintain switchdev-related ops into one place.There are no functional changes here; just shuffling ops around for better organization.
This looks a lot better, series applied.
David Miller
maintainerFrom: David Miller <[email protected]>
Date: Sun, 15 Mar 2015 21:51:31 -0400 (EDT)
Quoted 10 lines
From: [email protected]
Date: Sun, 15 Mar 2015 18:45:18 -0700Quoted 7 lines
v2:
- Per Simon's review, squash some of the dependent commits into one to make series git bisect safe.
v1:
Quoted 7 lines
Quoted 5 lines
Per discussions at netconf, move switchdev ndo ops to a new
swdev_opsto keep ndo namespace clean and maintain switchdev-related ops into one place.There are no functional changes here; just shuffling ops around for better organization.
This looks a lot better, series applied.
Actually, reverted.
DSA doesn't build, I think you need to add a missing include or something.
net/dsa/slave.c:577:21: error: variable ‘dsa_slave_swdev_ops’ has initializer but incomplete type
static const struct swdev_ops dsa_slave_swdev_ops = {
^net/dsa/slave.c:578:2: error: unknown field ‘swdev_parent_id_get’ specified in initializer
.swdev_parent_id_get = dsa_slave_parent_id_get,
^