lkml.org 
[lkml]   [2021]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 121/156] net: bridge: sync fdb to new unicast-filtering ports
    Date
    From: Wolfgang Bumiller <w.bumiller@proxmox.com>

    commit a019abd8022061b917da767cd1a66ed823724eab upstream.

    Since commit 2796d0c648c9 ("bridge: Automatically manage
    port promiscuous mode.")
    bridges with `vlan_filtering 1` and only 1 auto-port don't
    set IFF_PROMISC for unicast-filtering-capable ports.

    Normally on port changes `br_manage_promisc` is called to
    update the promisc flags and unicast filters if necessary,
    but it cannot distinguish between *new* ports and ones
    losing their promisc flag, and new ports end up not
    receiving the MAC address list.

    Fix this by calling `br_fdb_sync_static` in `br_add_if`
    after the port promisc flags are updated and the unicast
    filter was supposed to have been filled.

    Fixes: 2796d0c648c9 ("bridge: Automatically manage port promiscuous mode.")
    Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
    Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/bridge/br_if.c | 17 ++++++++++++++++-
    1 file changed, 16 insertions(+), 1 deletion(-)

    --- a/net/bridge/br_if.c
    +++ b/net/bridge/br_if.c
    @@ -562,7 +562,7 @@ int br_add_if(struct net_bridge *br, str
    struct net_bridge_port *p;
    int err = 0;
    unsigned br_hr, dev_hr;
    - bool changed_addr;
    + bool changed_addr, fdb_synced = false;

    /* Don't allow bridging non-ethernet like devices. */
    if ((dev->flags & IFF_LOOPBACK) ||
    @@ -652,6 +652,19 @@ int br_add_if(struct net_bridge *br, str
    list_add_rcu(&p->list, &br->port_list);

    nbp_update_port_count(br);
    + if (!br_promisc_port(p) && (p->dev->priv_flags & IFF_UNICAST_FLT)) {
    + /* When updating the port count we also update all ports'
    + * promiscuous mode.
    + * A port leaving promiscuous mode normally gets the bridge's
    + * fdb synced to the unicast filter (if supported), however,
    + * `br_port_clear_promisc` does not distinguish between
    + * non-promiscuous ports and *new* ports, so we need to
    + * sync explicitly here.
    + */
    + fdb_synced = br_fdb_sync_static(br, p) == 0;
    + if (!fdb_synced)
    + netdev_err(dev, "failed to sync bridge static fdb addresses to this port\n");
    + }

    netdev_update_features(br->dev);

    @@ -701,6 +714,8 @@ int br_add_if(struct net_bridge *br, str
    return 0;

    err7:
    + if (fdb_synced)
    + br_fdb_unsync_static(br, p);
    list_del_rcu(&p->list);
    br_fdb_delete_by_port(br, p, 0, 1);
    nbp_update_port_count(br);

    \
     
     \ /
      Last update: 2021-07-22 19:35    [W:4.160 / U:0.524 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site