switchdev: add swdev ops
Subsystems (5)
v3 cover switchdev: add swdev ops
From: Scott Feldman <[email protected]>
v3:
- Fix missing include for DSA build
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 | 9 +++-- net/switchdev/switchdev.c | 42 +++++++++++----------- 5 files changed, 105 insertions(+), 89 deletions(-)
Signature · 1 line
1.7.10.4
PATCH v3 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
PATCH v3 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 | 9 +++-- net/switchdev/switchdev.c | 42 +++++++++++----------- 3 files changed, 64 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 +7 -2
@@ -16,6 +16,7 @@#include <linux/of_net.h> #include <linux/of_mdio.h> #include <net/rtnetlink.h> +#include <net/switchdev.h> #include <linux/if_bridge.h> #include "dsa_priv.h"
@@ -572,8 +573,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 +759,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 v3 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
From: [email protected]
Date: Sun, 15 Mar 2015 21:07:13 -0700
Quoted 9 lines
v3:
- Fix missing include for DSA build
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.
It builds, ship it! :-)
Applied, thanks.