1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- From: Pablo Neira Ayuso <[email protected]>
- Date: Wed, 24 Mar 2021 02:30:34 +0100
- Subject: [PATCH] net: bridge: resolve forwarding path for bridge devices
- Add .ndo_fill_forward_path for bridge devices.
- Signed-off-by: Pablo Neira Ayuso <[email protected]>
- ---
- --- a/include/linux/netdevice.h
- +++ b/include/linux/netdevice.h
- @@ -830,6 +830,7 @@ typedef u16 (*select_queue_fallback_t)(s
- enum net_device_path_type {
- DEV_PATH_ETHERNET = 0,
- DEV_PATH_VLAN,
- + DEV_PATH_BRIDGE,
- };
-
- struct net_device_path {
- --- a/net/bridge/br_device.c
- +++ b/net/bridge/br_device.c
- @@ -398,6 +398,32 @@ static int br_del_slave(struct net_devic
- return br_del_if(br, slave_dev);
- }
-
- +static int br_fill_forward_path(struct net_device_path_ctx *ctx,
- + struct net_device_path *path)
- +{
- + struct net_bridge_fdb_entry *f;
- + struct net_bridge_port *dst;
- + struct net_bridge *br;
- +
- + if (netif_is_bridge_port(ctx->dev))
- + return -1;
- +
- + br = netdev_priv(ctx->dev);
- + f = br_fdb_find_rcu(br, ctx->daddr, 0);
- + if (!f || !f->dst)
- + return -1;
- +
- + dst = READ_ONCE(f->dst);
- + if (!dst)
- + return -1;
- +
- + path->type = DEV_PATH_BRIDGE;
- + path->dev = dst->br->dev;
- + ctx->dev = dst->dev;
- +
- + return 0;
- +}
- +
- static const struct ethtool_ops br_ethtool_ops = {
- .get_drvinfo = br_getinfo,
- .get_link = ethtool_op_get_link,
- @@ -432,6 +458,7 @@ static const struct net_device_ops br_ne
- .ndo_bridge_setlink = br_setlink,
- .ndo_bridge_dellink = br_dellink,
- .ndo_features_check = passthru_features_check,
- + .ndo_fill_forward_path = br_fill_forward_path,
- };
-
- static struct device_type br_type = {
|