diff options
Diffstat (limited to 'net/ipv4/igmp.c')
-rw-r--r-- | net/ipv4/igmp.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index e0e77e297de3..1fd3d9ce8398 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -321,14 +321,12 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size) | |||
321 | } | 321 | } |
322 | igmp_skb_size(skb) = size; | 322 | igmp_skb_size(skb) = size; |
323 | 323 | ||
324 | { | 324 | rt = ip_route_output_ports(net, NULL, IGMPV3_ALL_MCR, 0, |
325 | struct flowi fl = { .oif = dev->ifindex, | 325 | 0, 0, |
326 | .fl4_dst = IGMPV3_ALL_MCR, | 326 | IPPROTO_IGMP, 0, dev->ifindex); |
327 | .proto = IPPROTO_IGMP }; | 327 | if (IS_ERR(rt)) { |
328 | if (ip_route_output_key(net, &rt, &fl)) { | 328 | kfree_skb(skb); |
329 | kfree_skb(skb); | 329 | return NULL; |
330 | return NULL; | ||
331 | } | ||
332 | } | 330 | } |
333 | if (rt->rt_src == 0) { | 331 | if (rt->rt_src == 0) { |
334 | kfree_skb(skb); | 332 | kfree_skb(skb); |
@@ -666,13 +664,12 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, | |||
666 | else | 664 | else |
667 | dst = group; | 665 | dst = group; |
668 | 666 | ||
669 | { | 667 | rt = ip_route_output_ports(net, NULL, dst, 0, |
670 | struct flowi fl = { .oif = dev->ifindex, | 668 | 0, 0, |
671 | .fl4_dst = dst, | 669 | IPPROTO_IGMP, 0, dev->ifindex); |
672 | .proto = IPPROTO_IGMP }; | 670 | if (IS_ERR(rt)) |
673 | if (ip_route_output_key(net, &rt, &fl)) | 671 | return -1; |
674 | return -1; | 672 | |
675 | } | ||
676 | if (rt->rt_src == 0) { | 673 | if (rt->rt_src == 0) { |
677 | ip_rt_put(rt); | 674 | ip_rt_put(rt); |
678 | return -1; | 675 | return -1; |
@@ -1439,8 +1436,6 @@ void ip_mc_destroy_dev(struct in_device *in_dev) | |||
1439 | /* RTNL is locked */ | 1436 | /* RTNL is locked */ |
1440 | static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr) | 1437 | static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr) |
1441 | { | 1438 | { |
1442 | struct flowi fl = { .fl4_dst = imr->imr_multiaddr.s_addr }; | ||
1443 | struct rtable *rt; | ||
1444 | struct net_device *dev = NULL; | 1439 | struct net_device *dev = NULL; |
1445 | struct in_device *idev = NULL; | 1440 | struct in_device *idev = NULL; |
1446 | 1441 | ||
@@ -1454,9 +1449,14 @@ static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr) | |||
1454 | return NULL; | 1449 | return NULL; |
1455 | } | 1450 | } |
1456 | 1451 | ||
1457 | if (!dev && !ip_route_output_key(net, &rt, &fl)) { | 1452 | if (!dev) { |
1458 | dev = rt->dst.dev; | 1453 | struct rtable *rt = ip_route_output(net, |
1459 | ip_rt_put(rt); | 1454 | imr->imr_multiaddr.s_addr, |
1455 | 0, 0, 0); | ||
1456 | if (!IS_ERR(rt)) { | ||
1457 | dev = rt->dst.dev; | ||
1458 | ip_rt_put(rt); | ||
1459 | } | ||
1460 | } | 1460 | } |
1461 | if (dev) { | 1461 | if (dev) { |
1462 | imr->imr_ifindex = dev->ifindex; | 1462 | imr->imr_ifindex = dev->ifindex; |
@@ -2329,13 +2329,13 @@ void ip_mc_drop_socket(struct sock *sk) | |||
2329 | rtnl_unlock(); | 2329 | rtnl_unlock(); |
2330 | } | 2330 | } |
2331 | 2331 | ||
2332 | int ip_check_mc(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u16 proto) | 2332 | /* called with rcu_read_lock() */ |
2333 | int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u16 proto) | ||
2333 | { | 2334 | { |
2334 | struct ip_mc_list *im; | 2335 | struct ip_mc_list *im; |
2335 | struct ip_sf_list *psf; | 2336 | struct ip_sf_list *psf; |
2336 | int rv = 0; | 2337 | int rv = 0; |
2337 | 2338 | ||
2338 | rcu_read_lock(); | ||
2339 | for_each_pmc_rcu(in_dev, im) { | 2339 | for_each_pmc_rcu(in_dev, im) { |
2340 | if (im->multiaddr == mc_addr) | 2340 | if (im->multiaddr == mc_addr) |
2341 | break; | 2341 | break; |
@@ -2357,7 +2357,6 @@ int ip_check_mc(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u16 p | |||
2357 | } else | 2357 | } else |
2358 | rv = 1; /* unspecified source; tentatively allow */ | 2358 | rv = 1; /* unspecified source; tentatively allow */ |
2359 | } | 2359 | } |
2360 | rcu_read_unlock(); | ||
2361 | return rv; | 2360 | return rv; |
2362 | } | 2361 | } |
2363 | 2362 | ||