Factor out the common flood completion handling shared by br_flood and br_multicast_flood into a new helper - br_flood_finish. No functional changes intended.
Signed-off-by: Nikolay Aleksandrov <[email protected]> --- net/bridge/br_forward.c | 65 ++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index 46c762ca5177..31d54125b441 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c @@ -197,12 +197,33 @@ static struct net_bridge_port *maybe_deliver( return p; } +static void br_flood_finish(struct net_bridge_port *prev, struct sk_buff *skb, + bool local_rcv, bool local_orig) +{ + enum skb_drop_reason reason = SKB_DROP_REASON_NO_TX_TARGET; + + if (IS_ERR_OR_NULL(prev)) { + if (IS_ERR(prev)) { + reason = PTR_ERR(prev) == -ENOMEM ? SKB_DROP_REASON_NOMEM : + SKB_DROP_REASON_NOT_SPECIFIED; + } + + if (!local_rcv) + kfree_skb_reason(skb, reason); + return; + } + + if (local_rcv) + deliver_clone(prev, skb, local_orig); + else + __br_forward(prev, 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, u16 vid) { - enum skb_drop_reason reason = SKB_DROP_REASON_NO_TX_TARGET; struct net_bridge_port *prev = NULL; struct net_bridge_port *p; @@ -243,25 +264,11 @@ void br_flood(struct net_bridge *br, struct sk_buff *skb, } prev = maybe_deliver(prev, p, skb, local_orig); - if (IS_ERR(prev)) { - reason = PTR_ERR(prev) == -ENOMEM ? SKB_DROP_REASON_NOMEM : - SKB_DROP_REASON_NOT_SPECIFIED; - goto out; - } + if (IS_ERR(prev)) + break; } - if (!prev) - goto out; - - if (local_rcv) - deliver_clone(prev, skb, local_orig); - else - __br_forward(prev, skb, local_orig); - return; - -out: - if (!local_rcv) - kfree_skb_reason(skb, reason); + br_flood_finish(prev, skb, local_rcv, local_orig); } #ifdef CONFIG_BRIDGE_IGMP_SNOOPING @@ -301,7 +308,6 @@ void br_multicast_flood(struct net_bridge_mdb_entry *mdst, struct net_bridge_mcast *brmctx, bool local_rcv, bool local_orig) { - enum skb_drop_reason reason = SKB_DROP_REASON_NO_TX_TARGET; struct net_bridge_port *prev = NULL; struct net_bridge_port_group *p; bool allow_mode_include = true; @@ -343,11 +349,9 @@ void br_multicast_flood(struct net_bridge_mdb_entry *mdst, } prev = maybe_deliver(prev, port, skb, local_orig); - if (IS_ERR(prev)) { - reason = PTR_ERR(prev) == -ENOMEM ? SKB_DROP_REASON_NOMEM : - SKB_DROP_REASON_NOT_SPECIFIED; - goto out; - } + if (IS_ERR(prev)) + break; + delivered: if ((unsigned long)lport >= (unsigned long)port) p = rcu_dereference(p->next); @@ -355,17 +359,6 @@ void br_multicast_flood(struct net_bridge_mdb_entry *mdst, rp = rcu_dereference(hlist_next_rcu(rp)); } - if (!prev) - goto out; - - if (local_rcv) - deliver_clone(prev, skb, local_orig); - else - __br_forward(prev, skb, local_orig); - return; - -out: - if (!local_rcv) - kfree_skb_reason(skb, reason); + br_flood_finish(prev, skb, local_rcv, local_orig); } #endif -- 2.47.3
