hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/bridge/br_forward.c
....@@ -1,14 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Forwarding decision
34 * Linux ethernet bridge
45 *
56 * Authors:
67 * Lennert Buytenhek <buytenh@gnu.org>
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU General Public License
10
- * as published by the Free Software Foundation; either version
11
- * 2 of the License, or (at your option) any later version.
128 */
139
1410 #include <linux/err.h>
....@@ -29,7 +25,7 @@
2925
3026 vg = nbp_vlan_group_rcu(p);
3127 return ((p->flags & BR_HAIRPIN_MODE) || skb->dev != p->dev) &&
32
- br_allowed_egress(vg, skb) && p->state == BR_STATE_FORWARDING &&
28
+ p->state == BR_STATE_FORWARDING && br_allowed_egress(vg, skb) &&
3329 nbp_switchdev_allowed_egress(p, skb) &&
3430 !br_skb_isolated(p, skb);
3531 }
....@@ -47,7 +43,7 @@
4743 skb->protocol == htons(ETH_P_8021AD))) {
4844 int depth;
4945
50
- if (!__vlan_get_protocol(skb, skb->protocol, &depth))
46
+ if (!vlan_get_protocol_and_depth(skb, skb->protocol, &depth))
5147 goto drop;
5248
5349 skb_set_network_header(skb, depth);
....@@ -173,6 +169,7 @@
173169 struct net_bridge_port *prev, struct net_bridge_port *p,
174170 struct sk_buff *skb, bool local_orig)
175171 {
172
+ u8 igmp_type = br_multicast_igmp_type(skb);
176173 int err;
177174
178175 if (!should_deliver(p, skb))
....@@ -184,8 +181,9 @@
184181 err = deliver_clone(prev, skb, local_orig);
185182 if (err)
186183 return ERR_PTR(err);
187
-
188184 out:
185
+ br_multicast_count(p->br, p, skb, igmp_type, BR_MCAST_DIR_TX);
186
+
189187 return p;
190188 }
191189
....@@ -193,7 +191,6 @@
193191 void br_flood(struct net_bridge *br, struct sk_buff *skb,
194192 enum br_pkt_type pkt_type, bool local_rcv, bool local_orig)
195193 {
196
- u8 igmp_type = br_multicast_igmp_type(skb);
197194 struct net_bridge_port *prev = NULL;
198195 struct net_bridge_port *p;
199196
....@@ -226,9 +223,6 @@
226223 prev = maybe_deliver(prev, p, skb, local_orig);
227224 if (IS_ERR(prev))
228225 goto out;
229
- if (prev == p)
230
- br_multicast_count(p->br, p, skb, igmp_type,
231
- BR_MCAST_DIR_TX);
232226 }
233227
234228 if (!prev)
....@@ -277,18 +271,26 @@
277271 bool local_rcv, bool local_orig)
278272 {
279273 struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev;
280
- u8 igmp_type = br_multicast_igmp_type(skb);
281274 struct net_bridge *br = netdev_priv(dev);
282275 struct net_bridge_port *prev = NULL;
283276 struct net_bridge_port_group *p;
277
+ bool allow_mode_include = true;
284278 struct hlist_node *rp;
285279
286280 rp = rcu_dereference(hlist_first_rcu(&br->router_list));
287
- p = mdst ? rcu_dereference(mdst->ports) : NULL;
281
+ if (mdst) {
282
+ p = rcu_dereference(mdst->ports);
283
+ if (br_multicast_should_handle_mode(br, mdst->addr.proto) &&
284
+ br_multicast_is_star_g(&mdst->addr))
285
+ allow_mode_include = false;
286
+ } else {
287
+ p = NULL;
288
+ }
289
+
288290 while (p || rp) {
289291 struct net_bridge_port *port, *lport, *rport;
290292
291
- lport = p ? p->port : NULL;
293
+ lport = p ? p->key.port : NULL;
292294 rport = hlist_entry_safe(rp, struct net_bridge_port, rlist);
293295
294296 if ((unsigned long)lport > (unsigned long)rport) {
....@@ -299,18 +301,18 @@
299301 local_orig);
300302 goto delivered;
301303 }
304
+ if ((!allow_mode_include &&
305
+ p->filter_mode == MCAST_INCLUDE) ||
306
+ (p->flags & MDB_PG_FLAGS_BLOCKED))
307
+ goto delivered;
302308 } else {
303309 port = rport;
304310 }
305311
306312 prev = maybe_deliver(prev, port, skb, local_orig);
307
-delivered:
308313 if (IS_ERR(prev))
309314 goto out;
310
- if (prev == port)
311
- br_multicast_count(port->br, port, skb, igmp_type,
312
- BR_MCAST_DIR_TX);
313
-
315
+delivered:
314316 if ((unsigned long)lport >= (unsigned long)port)
315317 p = rcu_dereference(p->next);
316318 if ((unsigned long)rport >= (unsigned long)port)