Patch "net: mscc: ocelot: allow forwarding from bridge ports to the tag_8021q CPU port" has been added to the 5.13-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: mscc: ocelot: allow forwarding from bridge ports to the tag_8021q CPU port

to the 5.13-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-mscc-ocelot-allow-forwarding-from-bridge-ports-t.patch
and it can be found in the queue-5.13 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 1df8e344f9436042bfb7365bf3d6d9d280bc53f9
Author: Vladimir Oltean <vladimir.oltean@xxxxxxx>
Date:   Tue Aug 17 19:04:25 2021 +0300

    net: mscc: ocelot: allow forwarding from bridge ports to the tag_8021q CPU port
    
    [ Upstream commit c1930148a3941f891ddbd76fceaa4e10a957ccf2 ]
    
    Currently we are unable to ping a bridge on top of a felix switch which
    uses the ocelot-8021q tagger. The packets are dropped on the ingress of
    the user port and the 'drop_local' counter increments (the counter which
    denotes drops due to no valid destinations).
    
    Dumping the PGID tables, it becomes clear that the PGID_SRC of the user
    port is zero, so it has no valid destinations.
    
    But looking at the code, the cpu_fwd_mask (the bit mask of DSA tag_8021q
    ports) is clearly missing from the forwarding mask of ports that are
    under a bridge. So this has always been broken.
    
    Looking at the version history of the patch, in v7
    https://patchwork.kernel.org/project/netdevbpf/patch/20210125220333.1004365-12-olteanv@xxxxxxxxx/
    the code looked like this:
    
            /* Standalone ports forward only to DSA tag_8021q CPU ports */
            unsigned long mask = cpu_fwd_mask;
    
    (...)
            } else if (ocelot->bridge_fwd_mask & BIT(port)) {
                    mask |= ocelot->bridge_fwd_mask & ~BIT(port);
    
    while in v8 (the merged version)
    https://patchwork.kernel.org/project/netdevbpf/patch/20210129010009.3959398-12-olteanv@xxxxxxxxx/
    it looked like this:
    
            unsigned long mask;
    
    (...)
            } else if (ocelot->bridge_fwd_mask & BIT(port)) {
                    mask = ocelot->bridge_fwd_mask & ~BIT(port);
    
    So the breakage was introduced between v7 and v8 of the patch.
    
    Fixes: e21268efbe26 ("net: dsa: felix: perform switch setup for tag_8021q")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@xxxxxxx>
    Link: https://lore.kernel.org/r/20210817160425.3702809-1-vladimir.oltean@xxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c
index adfb9781799e..2948d731a1c1 100644
--- a/drivers/net/ethernet/mscc/ocelot.c
+++ b/drivers/net/ethernet/mscc/ocelot.c
@@ -1334,6 +1334,7 @@ void ocelot_apply_bridge_fwd_mask(struct ocelot *ocelot)
 			struct net_device *bond = ocelot_port->bond;
 
 			mask = ocelot_get_bridge_fwd_mask(ocelot, bridge);
+			mask |= cpu_fwd_mask;
 			mask &= ~BIT(port);
 			if (bond) {
 				mask &= ~ocelot_get_bond_mask(ocelot, bond,



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux