OpenWrt – Diff between revs 2 and 3
?pathlinks?
Rev 2 | Rev 3 | |||
---|---|---|---|---|
Line 49... | Line 49... | |||
49 | __IFLA_BRPORT_MAX |
49 | __IFLA_BRPORT_MAX |
|
50 | }; |
50 | }; |
|
51 | #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) |
51 | #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) |
|
52 | --- a/net/bridge/br_forward.c |
52 | --- a/net/bridge/br_forward.c |
|
53 | +++ b/net/bridge/br_forward.c |
53 | +++ b/net/bridge/br_forward.c |
|
54 | @@ -173,6 +173,29 @@ out: |
54 | @@ -174,6 +174,29 @@ out: |
|
55 | return p; |
55 | return p; |
|
56 | } |
56 | } |
|
Line 57... | Line 57... | |||
57 | |
57 | |
|
58 | +static void maybe_deliver_addr(struct net_bridge_port *p, struct sk_buff *skb, |
58 | +static void maybe_deliver_addr(struct net_bridge_port *p, struct sk_buff *skb, |
|
Line 79... | Line 79... | |||
79 | +} |
79 | +} |
|
80 | + |
80 | + |
|
81 | /* called under rcu_read_lock */ |
81 | /* called under rcu_read_lock */ |
|
82 | void br_flood(struct net_bridge *br, struct sk_buff *skb, |
82 | void br_flood(struct net_bridge *br, struct sk_buff *skb, |
|
83 | enum br_pkt_type pkt_type, bool local_rcv, bool local_orig) |
83 | enum br_pkt_type pkt_type, bool local_rcv, bool local_orig) |
|
84 | @@ -241,10 +264,20 @@ void br_multicast_flood(struct net_bridg |
84 | @@ -242,10 +265,20 @@ void br_multicast_flood(struct net_bridg |
|
85 | rport = rp ? hlist_entry(rp, struct net_bridge_port, rlist) : |
85 | rport = rp ? hlist_entry(rp, struct net_bridge_port, rlist) : |
|
86 | NULL; |
86 | NULL; |
|
Line 87... | Line 87... | |||
87 | |
87 | |
|
88 | - port = (unsigned long)lport > (unsigned long)rport ? |
88 | - port = (unsigned long)lport > (unsigned long)rport ? |
|
Line 283... | Line 283... | |||
283 | + &grec->grec_mca, vid, |
283 | + &grec->grec_mca, vid, |
|
284 | + src); |
284 | + src); |
|
285 | if (err) |
285 | if (err) |
|
286 | break; |
286 | break; |
|
287 | } |
287 | } |
|
288 | @@ -1465,7 +1502,8 @@ br_multicast_leave_group(struct net_brid |
288 | @@ -1458,7 +1495,8 @@ br_multicast_leave_group(struct net_brid |
|
289 | struct net_bridge_port *port, |
289 | struct net_bridge_port *port, |
|
290 | struct br_ip *group, |
290 | struct br_ip *group, |
|
291 | struct bridge_mcast_other_query *other_query, |
291 | struct bridge_mcast_other_query *other_query, |
|
292 | - struct bridge_mcast_own_query *own_query) |
292 | - struct bridge_mcast_own_query *own_query) |
|
293 | + struct bridge_mcast_own_query *own_query, |
293 | + struct bridge_mcast_own_query *own_query, |
|
294 | + const unsigned char *src) |
294 | + const unsigned char *src) |
|
295 | { |
295 | { |
|
296 | struct net_bridge_mdb_htable *mdb; |
296 | struct net_bridge_mdb_htable *mdb; |
|
297 | struct net_bridge_mdb_entry *mp; |
297 | struct net_bridge_mdb_entry *mp; |
|
298 | @@ -1489,7 +1527,7 @@ br_multicast_leave_group(struct net_brid |
298 | @@ -1482,7 +1520,7 @@ br_multicast_leave_group(struct net_brid |
|
299 | for (pp = &mp->ports; |
299 | for (pp = &mp->ports; |
|
300 | (p = mlock_dereference(*pp, br)) != NULL; |
300 | (p = mlock_dereference(*pp, br)) != NULL; |
|
301 | pp = &p->next) { |
301 | pp = &p->next) { |
|
302 | - if (p->port != port) |
302 | - if (p->port != port) |
|
303 | + if (!br_port_group_equal(p, port, src)) |
303 | + if (!br_port_group_equal(p, port, src)) |
|
304 | continue; |
304 | continue; |
|
Line 305... | Line 305... | |||
305 | |
305 | |
|
306 | rcu_assign_pointer(*pp, p->next); |
306 | rcu_assign_pointer(*pp, p->next); |
|
307 | @@ -1520,7 +1558,7 @@ br_multicast_leave_group(struct net_brid |
307 | @@ -1513,7 +1551,7 @@ br_multicast_leave_group(struct net_brid |
|
308 | for (p = mlock_dereference(mp->ports, br); |
308 | for (p = mlock_dereference(mp->ports, br); |
|
309 | p != NULL; |
309 | p != NULL; |
|
310 | p = mlock_dereference(p->next, br)) { |
310 | p = mlock_dereference(p->next, br)) { |
|
311 | - if (p->port != port) |
311 | - if (p->port != port) |
|
312 | + if (!br_port_group_equal(p, port, src)) |
312 | + if (!br_port_group_equal(p, port, src)) |
|
Line 313... | Line 313... | |||
313 | continue; |
313 | continue; |
|
314 | |
314 | |
|
315 | if (!hlist_unhashed(&p->mglist) && |
315 | if (!hlist_unhashed(&p->mglist) && |
|
316 | @@ -1571,7 +1609,8 @@ out: |
316 | @@ -1564,7 +1602,8 @@ out: |
|
317 | static void br_ip4_multicast_leave_group(struct net_bridge *br, |
317 | static void br_ip4_multicast_leave_group(struct net_bridge *br, |
|
318 | struct net_bridge_port *port, |
318 | struct net_bridge_port *port, |
|
319 | __be32 group, |
319 | __be32 group, |
|
320 | - __u16 vid) |
320 | - __u16 vid) |
|
321 | + __u16 vid, |
321 | + __u16 vid, |
|
322 | + const unsigned char *src) |
322 | + const unsigned char *src) |
|
323 | { |
323 | { |
|
324 | struct br_ip br_group; |
324 | struct br_ip br_group; |
|
325 | struct bridge_mcast_own_query *own_query; |
325 | struct bridge_mcast_own_query *own_query; |
|
Line 326... | Line 326... | |||
326 | @@ -1586,14 +1625,15 @@ static void br_ip4_multicast_leave_group |
326 | @@ -1579,14 +1618,15 @@ static void br_ip4_multicast_leave_group |
|
327 | br_group.vid = vid; |
327 | br_group.vid = vid; |
|
328 | |
328 | |
|
Line 339... | Line 339... | |||
339 | + __u16 vid, |
339 | + __u16 vid, |
|
340 | + const unsigned char *src) |
340 | + const unsigned char *src) |
|
341 | { |
341 | { |
|
342 | struct br_ip br_group; |
342 | struct br_ip br_group; |
|
343 | struct bridge_mcast_own_query *own_query; |
343 | struct bridge_mcast_own_query *own_query; |
|
344 | @@ -1608,7 +1648,7 @@ static void br_ip6_multicast_leave_group |
344 | @@ -1601,7 +1641,7 @@ static void br_ip6_multicast_leave_group |
|
345 | br_group.vid = vid; |
345 | br_group.vid = vid; |
|
Line 346... | Line 346... | |||
346 | |
346 | |
|
347 | br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query, |
347 | br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query, |
|
348 | - own_query); |
348 | - own_query); |
|
349 | + own_query, src); |
349 | + own_query, src); |
|
350 | } |
350 | } |
|
Line 351... | Line 351... | |||
351 | #endif |
351 | #endif |
|
352 | |
352 | |
|
353 | @@ -1651,6 +1691,7 @@ static int br_multicast_ipv4_rcv(struct |
353 | @@ -1644,6 +1684,7 @@ static int br_multicast_ipv4_rcv(struct |
|
354 | u16 vid) |
354 | u16 vid) |
|
355 | { |
355 | { |
|
356 | struct sk_buff *skb_trimmed = NULL; |
356 | struct sk_buff *skb_trimmed = NULL; |
|
357 | + const unsigned char *src; |
357 | + const unsigned char *src; |
|
Line 358... | Line 358... | |||
358 | struct igmphdr *ih; |
358 | struct igmphdr *ih; |
|
359 | int err; |
359 | int err; |
|
Line 360... | Line 360... | |||
360 | |
360 | |
|
361 | @@ -1666,13 +1707,14 @@ static int br_multicast_ipv4_rcv(struct |
361 | @@ -1659,13 +1700,14 @@ static int br_multicast_ipv4_rcv(struct |
|
362 | } |
362 | } |
|
Line 372... | Line 372... | |||
372 | - err = br_ip4_multicast_add_group(br, port, ih->group, vid); |
372 | - err = br_ip4_multicast_add_group(br, port, ih->group, vid); |
|
373 | + err = br_ip4_multicast_add_group(br, port, ih->group, vid, src); |
373 | + err = br_ip4_multicast_add_group(br, port, ih->group, vid, src); |
|
374 | break; |
374 | break; |
|
375 | case IGMPV3_HOST_MEMBERSHIP_REPORT: |
375 | case IGMPV3_HOST_MEMBERSHIP_REPORT: |
|
376 | err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid); |
376 | err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid); |
|
377 | @@ -1681,7 +1723,7 @@ static int br_multicast_ipv4_rcv(struct |
377 | @@ -1674,7 +1716,7 @@ static int br_multicast_ipv4_rcv(struct |
|
378 | err = br_ip4_multicast_query(br, port, skb_trimmed, vid); |
378 | err = br_ip4_multicast_query(br, port, skb_trimmed, vid); |
|
379 | break; |
379 | break; |
|
380 | case IGMP_HOST_LEAVE_MESSAGE: |
380 | case IGMP_HOST_LEAVE_MESSAGE: |
|
381 | - br_ip4_multicast_leave_group(br, port, ih->group, vid); |
381 | - br_ip4_multicast_leave_group(br, port, ih->group, vid); |
|
382 | + br_ip4_multicast_leave_group(br, port, ih->group, vid, src); |
382 | + br_ip4_multicast_leave_group(br, port, ih->group, vid, src); |
|
383 | break; |
383 | break; |
|
384 | } |
384 | } |
|
Line 385... | Line 385... | |||
385 | |
385 | |
|
386 | @@ -1701,6 +1743,7 @@ static int br_multicast_ipv6_rcv(struct |
386 | @@ -1694,6 +1736,7 @@ static int br_multicast_ipv6_rcv(struct |
|
387 | u16 vid) |
387 | u16 vid) |
|
388 | { |
388 | { |
|
389 | struct sk_buff *skb_trimmed = NULL; |
389 | struct sk_buff *skb_trimmed = NULL; |
|
390 | + const unsigned char *src; |
390 | + const unsigned char *src; |
|
391 | struct mld_msg *mld; |
391 | struct mld_msg *mld; |
|
Line 392... | Line 392... | |||
392 | int err; |
392 | int err; |
|
Line 393... | Line 393... | |||
393 | |
393 | |
|
394 | @@ -1720,8 +1763,10 @@ static int br_multicast_ipv6_rcv(struct |
394 | @@ -1713,8 +1756,10 @@ static int br_multicast_ipv6_rcv(struct |
|
395 | |
395 | |
|
396 | switch (mld->mld_type) { |
396 | switch (mld->mld_type) { |
|
Line 401... | Line 401... | |||
401 | + err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid, |
401 | + err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid, |
|
402 | + src); |
402 | + src); |
|
403 | break; |
403 | break; |
|
404 | case ICMPV6_MLD2_REPORT: |
404 | case ICMPV6_MLD2_REPORT: |
|
405 | err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid); |
405 | err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid); |
|
406 | @@ -1730,7 +1775,8 @@ static int br_multicast_ipv6_rcv(struct |
406 | @@ -1723,7 +1768,8 @@ static int br_multicast_ipv6_rcv(struct |
|
407 | err = br_ip6_multicast_query(br, port, skb_trimmed, vid); |
407 | err = br_ip6_multicast_query(br, port, skb_trimmed, vid); |
|
408 | break; |
408 | break; |
|
409 | case ICMPV6_MGM_REDUCTION: |
409 | case ICMPV6_MGM_REDUCTION: |
|
410 | - br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid); |
410 | - br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid); |
|
411 | + src = eth_hdr(skb)->h_source; |
411 | + src = eth_hdr(skb)->h_source; |