Message ID | 20241013185509.4430-6-ericwouds@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | bridge-fastpath and related improvements | expand |
On 13/10/2024 21:55, Eric Woudstra wrote: > If handed a bridge port, use the bridge master to fill the forward path. > > Signed-off-by: Eric Woudstra <ericwouds@gmail.com> > --- > net/bridge/br_device.c | 20 +++++++++++++++----- > 1 file changed, 15 insertions(+), 5 deletions(-) > > diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c > index 26b79feb385d..e242e091b4a6 100644 > --- a/net/bridge/br_device.c > +++ b/net/bridge/br_device.c > @@ -384,15 +384,25 @@ 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_port *src, *dst; > + struct net_device *br_dev; reverse xmas tree order > struct net_bridge *br; > > - if (netif_is_bridge_port(ctx->dev)) > - return -1; > + if (netif_is_bridge_port(ctx->dev)) { > + br_dev = netdev_master_upper_dev_get_rcu((struct net_device *)ctx->dev); > + if (!br_dev) > + return -1; > + > + br = netdev_priv(br_dev); > > - br = netdev_priv(ctx->dev); > + src = br_port_get_rcu(ctx->dev); > > - br_vlan_fill_forward_path_pvid(br, ctx, path); > + br_vlan_fill_forward_path_pvid(br, src, ctx, path); > + } else { > + br = netdev_priv(ctx->dev); > + > + br_vlan_fill_forward_path_pvid(br, NULL, ctx, path); > + } > > f = br_fdb_find_rcu(br, ctx->daddr, path->bridge.vlan_id); > if (!f)
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 26b79feb385d..e242e091b4a6 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -384,15 +384,25 @@ 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_port *src, *dst; + struct net_device *br_dev; struct net_bridge *br; - if (netif_is_bridge_port(ctx->dev)) - return -1; + if (netif_is_bridge_port(ctx->dev)) { + br_dev = netdev_master_upper_dev_get_rcu((struct net_device *)ctx->dev); + if (!br_dev) + return -1; + + br = netdev_priv(br_dev); - br = netdev_priv(ctx->dev); + src = br_port_get_rcu(ctx->dev); - br_vlan_fill_forward_path_pvid(br, ctx, path); + br_vlan_fill_forward_path_pvid(br, src, ctx, path); + } else { + br = netdev_priv(ctx->dev); + + br_vlan_fill_forward_path_pvid(br, NULL, ctx, path); + } f = br_fdb_find_rcu(br, ctx->daddr, path->bridge.vlan_id); if (!f)
If handed a bridge port, use the bridge master to fill the forward path. Signed-off-by: Eric Woudstra <ericwouds@gmail.com> --- net/bridge/br_device.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)