equal
deleted
inserted
replaced
301 } |
301 } |
302 } else |
302 } else |
303 dev = dev_get_by_index(net, ifindex); |
303 dev = dev_get_by_index(net, ifindex); |
304 |
304 |
305 if (!dev) |
305 if (!dev) |
306 return NULL; |
306 goto nodev; |
307 idev = in6_dev_get(dev); |
307 idev = in6_dev_get(dev); |
308 if (!idev) { |
308 if (!idev) |
309 dev_put(dev); |
309 goto release; |
310 return NULL; |
|
311 } |
|
312 read_lock_bh(&idev->lock); |
310 read_lock_bh(&idev->lock); |
313 if (idev->dead) { |
311 if (idev->dead) |
314 read_unlock_bh(&idev->lock); |
312 goto unlock_release; |
315 in6_dev_put(idev); |
313 |
316 dev_put(dev); |
|
317 return NULL; |
|
318 } |
|
319 return idev; |
314 return idev; |
|
315 |
|
316 unlock_release: |
|
317 read_unlock_bh(&idev->lock); |
|
318 in6_dev_put(idev); |
|
319 release: |
|
320 dev_put(dev); |
|
321 nodev: |
|
322 return NULL; |
320 } |
323 } |
321 |
324 |
322 void ipv6_sock_mc_close(struct sock *sk) |
325 void ipv6_sock_mc_close(struct sock *sk) |
323 { |
326 { |
324 struct ipv6_pinfo *np = inet6_sk(sk); |
327 struct ipv6_pinfo *np = inet6_sk(sk); |
1464 |
1467 |
1465 icmpv6_flow_init(net->ipv6.igmp_sk, &fl, ICMPV6_MLD2_REPORT, |
1468 icmpv6_flow_init(net->ipv6.igmp_sk, &fl, ICMPV6_MLD2_REPORT, |
1466 &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, |
1469 &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, |
1467 skb->dev->ifindex); |
1470 skb->dev->ifindex); |
1468 |
1471 |
1469 err = xfrm_lookup(&skb->dst, &fl, NULL, 0); |
1472 err = xfrm_lookup(net, &skb->dst, &fl, NULL, 0); |
1470 if (err) |
1473 if (err) |
1471 goto err_out; |
1474 goto err_out; |
1472 |
1475 |
1473 err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dev, |
1476 err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dev, |
1474 dst_output); |
1477 dst_output); |
1815 addrp = (struct in6_addr *) skb_put(skb, sizeof(struct in6_addr)); |
1818 addrp = (struct in6_addr *) skb_put(skb, sizeof(struct in6_addr)); |
1816 ipv6_addr_copy(addrp, addr); |
1819 ipv6_addr_copy(addrp, addr); |
1817 |
1820 |
1818 hdr->icmp6_cksum = csum_ipv6_magic(saddr, snd_addr, len, |
1821 hdr->icmp6_cksum = csum_ipv6_magic(saddr, snd_addr, len, |
1819 IPPROTO_ICMPV6, |
1822 IPPROTO_ICMPV6, |
1820 csum_partial((__u8 *) hdr, len, 0)); |
1823 csum_partial(hdr, len, 0)); |
1821 |
1824 |
1822 idev = in6_dev_get(skb->dev); |
1825 idev = in6_dev_get(skb->dev); |
1823 |
1826 |
1824 skb->dst = icmp6_dst_alloc(skb->dev, NULL, &ipv6_hdr(skb)->daddr); |
1827 skb->dst = icmp6_dst_alloc(skb->dev, NULL, &ipv6_hdr(skb)->daddr); |
1825 if (!skb->dst) { |
1828 if (!skb->dst) { |
1829 |
1832 |
1830 icmpv6_flow_init(sk, &fl, type, |
1833 icmpv6_flow_init(sk, &fl, type, |
1831 &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, |
1834 &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, |
1832 skb->dev->ifindex); |
1835 skb->dev->ifindex); |
1833 |
1836 |
1834 err = xfrm_lookup(&skb->dst, &fl, NULL, 0); |
1837 err = xfrm_lookup(net, &skb->dst, &fl, NULL, 0); |
1835 if (err) |
1838 if (err) |
1836 goto err_out; |
1839 goto err_out; |
1837 |
1840 |
1838 err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dev, |
1841 err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dev, |
1839 dst_output); |
1842 dst_output); |
2428 { |
2431 { |
2429 struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; |
2432 struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; |
2430 struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); |
2433 struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); |
2431 |
2434 |
2432 seq_printf(seq, |
2435 seq_printf(seq, |
2433 "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", |
2436 "%-4d %-15s %pi6 %5d %08X %ld\n", |
2434 state->dev->ifindex, state->dev->name, |
2437 state->dev->ifindex, state->dev->name, |
2435 NIP6(im->mca_addr), |
2438 &im->mca_addr, |
2436 im->mca_users, im->mca_flags, |
2439 im->mca_users, im->mca_flags, |
2437 (im->mca_flags&MAF_TIMER_RUNNING) ? |
2440 (im->mca_flags&MAF_TIMER_RUNNING) ? |
2438 jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); |
2441 jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); |
2439 return 0; |
2442 return 0; |
2440 } |
2443 } |
2589 "%32s %32s %6s %6s\n", "Idx", |
2592 "%32s %32s %6s %6s\n", "Idx", |
2590 "Device", "Multicast Address", |
2593 "Device", "Multicast Address", |
2591 "Source Address", "INC", "EXC"); |
2594 "Source Address", "INC", "EXC"); |
2592 } else { |
2595 } else { |
2593 seq_printf(seq, |
2596 seq_printf(seq, |
2594 "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", |
2597 "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", |
2595 state->dev->ifindex, state->dev->name, |
2598 state->dev->ifindex, state->dev->name, |
2596 NIP6(state->im->mca_addr), |
2599 &state->im->mca_addr, |
2597 NIP6(psf->sf_addr), |
2600 &psf->sf_addr, |
2598 psf->sf_count[MCAST_INCLUDE], |
2601 psf->sf_count[MCAST_INCLUDE], |
2599 psf->sf_count[MCAST_EXCLUDE]); |
2602 psf->sf_count[MCAST_EXCLUDE]); |
2600 } |
2603 } |
2601 return 0; |
2604 return 0; |
2602 } |
2605 } |