Factor out port flooding code into its own helper, it will be used by later
changes to flood to specific port VLANs. No functional changes intended.

Signed-off-by: Nikolay Aleksandrov <[email protected]>
---
 net/bridge/br_forward.c | 77 +++++++++++++++++++++++------------------
 1 file changed, 43 insertions(+), 34 deletions(-)

diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
index 31d54125b441..a696c6c128e3 100644
--- a/net/bridge/br_forward.c
+++ b/net/bridge/br_forward.c
@@ -219,6 +219,48 @@ static void br_flood_finish(struct net_bridge_port *prev, 
struct sk_buff *skb,
                __br_forward(prev, skb, local_orig);
 }
 
+static void br_flood_port(struct net_bridge_port **prev,
+                         struct net_bridge_port *p, struct sk_buff *skb,
+                         enum br_pkt_type pkt_type, bool local_orig, u16 vid)
+{
+       /* Do not flood unicast traffic to ports that turn it off, nor
+        * other traffic if flood off, except for traffic we originate
+        */
+       switch (pkt_type) {
+       case BR_PKT_UNICAST:
+               if (!test_bit(BR_FLOOD_BIT, &p->flags))
+                       return;
+               break;
+       case BR_PKT_MULTICAST:
+               if (!test_bit(BR_MCAST_FLOOD_BIT, &p->flags) &&
+                   skb->dev != p->br->dev)
+                       return;
+               break;
+       case BR_PKT_BROADCAST:
+               if (!test_bit(BR_BCAST_FLOOD_BIT, &p->flags) &&
+                   skb->dev != p->br->dev)
+                       return;
+               break;
+       }
+
+       /* Do not flood to ports that enable proxy ARP */
+       if (test_bit(BR_PROXYARP_BIT, &p->flags))
+               return;
+       if (BR_INPUT_SKB_CB(skb)->proxyarp_replied) {
+               if (test_bit(BR_PROXYARP_WIFI_BIT, &p->flags))
+                       return;
+               /* For gratuitous ARPs/NAs, check neigh_forward_grat.
+                * For regular ARPs/NDs, check only neigh_suppress.
+                */
+               if (br_is_neigh_suppress_enabled(p, vid) &&
+                   (!BR_INPUT_SKB_CB(skb)->grat_arp ||
+                    !br_is_neigh_forward_grat_enabled(p, vid)))
+                       return;
+       }
+
+       *prev = maybe_deliver(*prev, p, skb, local_orig);
+}
+
 /* called under rcu_read_lock */
 void br_flood(struct net_bridge *br, struct sk_buff *skb,
              enum br_pkt_type pkt_type, bool local_rcv, bool local_orig,
@@ -230,40 +272,7 @@ void br_flood(struct net_bridge *br, struct sk_buff *skb,
        br_tc_skb_miss_set(skb, pkt_type != BR_PKT_BROADCAST);
 
        list_for_each_entry_rcu(p, &br->port_list, list) {
-               /* Do not flood unicast traffic to ports that turn it off, nor
-                * other traffic if flood off, except for traffic we originate
-                */
-               switch (pkt_type) {
-               case BR_PKT_UNICAST:
-                       if (!test_bit(BR_FLOOD_BIT, &p->flags))
-                               continue;
-                       break;
-               case BR_PKT_MULTICAST:
-                       if (!test_bit(BR_MCAST_FLOOD_BIT, &p->flags) && 
skb->dev != br->dev)
-                               continue;
-                       break;
-               case BR_PKT_BROADCAST:
-                       if (!test_bit(BR_BCAST_FLOOD_BIT, &p->flags) && 
skb->dev != br->dev)
-                               continue;
-                       break;
-               }
-
-               /* Do not flood to ports that enable proxy ARP */
-               if (test_bit(BR_PROXYARP_BIT, &p->flags))
-                       continue;
-               if (BR_INPUT_SKB_CB(skb)->proxyarp_replied) {
-                       if (test_bit(BR_PROXYARP_WIFI_BIT, &p->flags))
-                               continue;
-                       /* For gratuitous ARPs/NAs, check neigh_forward_grat.
-                        * For regular ARPs/NDs, check only neigh_suppress.
-                        */
-                       if (br_is_neigh_suppress_enabled(p, vid) &&
-                           (!BR_INPUT_SKB_CB(skb)->grat_arp ||
-                            !br_is_neigh_forward_grat_enabled(p, vid)))
-                               continue;
-               }
-
-               prev = maybe_deliver(prev, p, skb, local_orig);
+               br_flood_port(&prev, p, skb, pkt_type, local_orig, vid);
                if (IS_ERR(prev))
                        break;
        }
-- 
2.47.3


Reply via email to