Patch "net: mscc: ocelot: fix forwarding from BLOCKING ports remaining enabled" has been added to the 5.14-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: fix forwarding from BLOCKING ports remaining enabled

to the 5.14-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-fix-forwarding-from-blocking-ports-r.patch
and it can be found in the queue-5.14 subdirectory.

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



commit abda04aac4792a6f6935caa46097f35617fb9e66
Author: Vladimir Oltean <vladimir.oltean@xxxxxxx>
Date:   Wed Sep 22 19:03:38 2021 -0700

    net: mscc: ocelot: fix forwarding from BLOCKING ports remaining enabled
    
    [ Upstream commit acc64f52afac15e9e44d9b5253271346841786e0 ]
    
    The blamed commit made the fatally incorrect assumption that ports which
    aren't in the FORWARDING STP state should not have packets forwarded
    towards them, and that is all that needs to be done.
    
    However, that logic alone permits BLOCKING ports to forward to
    FORWARDING ports, which of course allows packet storms to occur when
    there is an L2 loop.
    
    The ocelot_get_bridge_fwd_mask should not only ask "what can the bridge
    do for you", but "what can you do for the bridge". This way, only
    FORWARDING ports forward to the other FORWARDING ports from the same
    bridging domain, and we are still compatible with the idea of multiple
    bridges.
    
    Fixes: df291e54ccca ("net: ocelot: support multiple bridges")
    Suggested-by: Colin Foster <colin.foster@xxxxxxxxxxxxxxxx>
    Reported-by: Colin Foster <colin.foster@xxxxxxxxxxxxxxxx>
    Signed-off-by: Vladimir Oltean <vladimir.oltean@xxxxxxx>
    Signed-off-by: Colin Foster <colin.foster@xxxxxxxxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c
index 2948d731a1c1..512dff955166 100644
--- a/drivers/net/ethernet/mscc/ocelot.c
+++ b/drivers/net/ethernet/mscc/ocelot.c
@@ -1260,14 +1260,19 @@ static u32 ocelot_get_bond_mask(struct ocelot *ocelot, struct net_device *bond,
 	return mask;
 }
 
-static u32 ocelot_get_bridge_fwd_mask(struct ocelot *ocelot,
+static u32 ocelot_get_bridge_fwd_mask(struct ocelot *ocelot, int src_port,
 				      struct net_device *bridge)
 {
+	struct ocelot_port *ocelot_port = ocelot->ports[src_port];
 	u32 mask = 0;
 	int port;
 
+	if (!ocelot_port || ocelot_port->bridge != bridge ||
+	    ocelot_port->stp_state != BR_STATE_FORWARDING)
+		return 0;
+
 	for (port = 0; port < ocelot->num_phys_ports; port++) {
-		struct ocelot_port *ocelot_port = ocelot->ports[port];
+		ocelot_port = ocelot->ports[port];
 
 		if (!ocelot_port)
 			continue;
@@ -1333,7 +1338,7 @@ void ocelot_apply_bridge_fwd_mask(struct ocelot *ocelot)
 			struct net_device *bridge = ocelot_port->bridge;
 			struct net_device *bond = ocelot_port->bond;
 
-			mask = ocelot_get_bridge_fwd_mask(ocelot, bridge);
+			mask = ocelot_get_bridge_fwd_mask(ocelot, port, bridge);
 			mask |= cpu_fwd_mask;
 			mask &= ~BIT(port);
 			if (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