• V
    net: mscc: ocelot: allow unregistered IP multicast flooding · 18ed5877
    Vladimir Oltean 提交于
    stable inclusion
    from stable-v5.10.128
    commit 2d10984d99ac2b652b4f31efd2e059957f1fa51f
    category: bugfix
    bugzilla: https://gitee.com/openeuler/kernel/issues/I5YM2H
    
    Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=2d10984d99ac2b652b4f31efd2e059957f1fa51f
    
    --------------------------------
    
    Flooding of unregistered IP multicast has been broken (both to other
    switch ports and to the CPU) since the ocelot driver introduction, and
    up until commit 4cf35a2b ("net: mscc: ocelot: fix broken IP
    multicast flooding"), a bug fix for commit 421741ea ("net: mscc:
    ocelot: offload bridge port flags to device") from v5.12.
    
    The driver used to set PGID_MCIPV4 and PGID_MCIPV6 to the empty port
    mask (0), which made unregistered IPv4/IPv6 multicast go nowhere, and
    without ever modifying that port mask at runtime.
    
    The expectation is that such packets are treated as broadcast, and
    flooded according to the forwarding domain (to the CPU if the port is
    standalone, or to the CPU and other bridged ports, if under a bridge).
    
    Since the aforementioned commit, the limitation has been lifted by
    responding to SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS events emitted by the
    bridge. As for host flooding, DSA synthesizes another call to
    ocelot_port_bridge_flags() on the NPI port which ensures that the CPU
    gets the unregistered multicast traffic it might need, for example for
    smcroute to work between standalone ports.
    
    But between v4.18 and v5.12, IP multicast flooding has remained unfixed.
    
    Delete the inexplicable premature optimization of clearing PGID_MCIPV4
    and PGID_MCIPV6 as part of the init sequence, and allow unregistered IP
    multicast to be flooded freely according to the forwarding domain
    established by PGID_SRC, by explicitly programming PGID_MCIPV4 and
    PGID_MCIPV6 towards all physical ports plus the CPU port module.
    
    Fixes: a556c76a ("net: mscc: Add initial Ocelot switch support")
    Cc: stable@kernel.org
    Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    Reviewed-by: NWei Li <liwei391@huawei.com>
    18ed5877
ocelot.c 44.0 KB