OpenWrt – Diff between revs 2 and 3

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
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;