mcast.c (9acd9f3ae92d0dc0ca7504fb48c1040e8bbc39fe) | mcast.c (f3ee4010e84452aa133e5163e6cfabc52b194e94) |
---|---|
1/* 2 * Multicast support for IPv6 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * $Id: mcast.c,v 1.40 2002/02/08 03:57:19 davem Exp $ --- 1752 unchanged lines hidden (view full) --- 1761 1762static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) 1763{ 1764 struct net *net = dev_net(dev); 1765 struct sock *sk = net->ipv6.igmp_sk; 1766 struct inet6_dev *idev; 1767 struct sk_buff *skb; 1768 struct icmp6hdr *hdr; | 1/* 2 * Multicast support for IPv6 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * $Id: mcast.c,v 1.40 2002/02/08 03:57:19 davem Exp $ --- 1752 unchanged lines hidden (view full) --- 1761 1762static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) 1763{ 1764 struct net *net = dev_net(dev); 1765 struct sock *sk = net->ipv6.igmp_sk; 1766 struct inet6_dev *idev; 1767 struct sk_buff *skb; 1768 struct icmp6hdr *hdr; |
1769 struct in6_addr *snd_addr; | 1769 const struct in6_addr *snd_addr; |
1770 struct in6_addr *addrp; 1771 struct in6_addr addr_buf; | 1770 struct in6_addr *addrp; 1771 struct in6_addr addr_buf; |
1772 struct in6_addr all_routers; | |
1773 int err, len, payload_len, full_len; 1774 u8 ra[8] = { IPPROTO_ICMPV6, 0, 1775 IPV6_TLV_ROUTERALERT, 2, 0, 0, 1776 IPV6_TLV_PADN, 0 }; 1777 struct flowi fl; 1778 1779 rcu_read_lock(); 1780 IP6_INC_STATS(__in6_dev_get(dev), 1781 IPSTATS_MIB_OUTREQUESTS); 1782 rcu_read_unlock(); | 1772 int err, len, payload_len, full_len; 1773 u8 ra[8] = { IPPROTO_ICMPV6, 0, 1774 IPV6_TLV_ROUTERALERT, 2, 0, 0, 1775 IPV6_TLV_PADN, 0 }; 1776 struct flowi fl; 1777 1778 rcu_read_lock(); 1779 IP6_INC_STATS(__in6_dev_get(dev), 1780 IPSTATS_MIB_OUTREQUESTS); 1781 rcu_read_unlock(); |
1783 snd_addr = addr; 1784 if (type == ICMPV6_MGM_REDUCTION) { 1785 snd_addr = &all_routers; 1786 ipv6_addr_all_routers(&all_routers); 1787 } | 1782 if (type == ICMPV6_MGM_REDUCTION) 1783 snd_addr = &in6addr_linklocal_allrouters; 1784 else 1785 snd_addr = addr; |
1788 1789 len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); 1790 payload_len = len + sizeof(ra); 1791 full_len = sizeof(struct ipv6hdr) + payload_len; 1792 1793 skb = sock_alloc_send_skb(sk, LL_RESERVED_SPACE(dev) + full_len, 1, &err); 1794 1795 if (skb == NULL) { --- 508 unchanged lines hidden (view full) --- 2304 2305/* 2306 * Device is about to be destroyed: clean up. 2307 */ 2308 2309void ipv6_mc_destroy_dev(struct inet6_dev *idev) 2310{ 2311 struct ifmcaddr6 *i; | 1786 1787 len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); 1788 payload_len = len + sizeof(ra); 1789 full_len = sizeof(struct ipv6hdr) + payload_len; 1790 1791 skb = sock_alloc_send_skb(sk, LL_RESERVED_SPACE(dev) + full_len, 1, &err); 1792 1793 if (skb == NULL) { --- 508 unchanged lines hidden (view full) --- 2302 2303/* 2304 * Device is about to be destroyed: clean up. 2305 */ 2306 2307void ipv6_mc_destroy_dev(struct inet6_dev *idev) 2308{ 2309 struct ifmcaddr6 *i; |
2312 struct in6_addr maddr; | |
2313 2314 /* Deactivate timers */ 2315 ipv6_mc_down(idev); 2316 2317 /* Delete all-nodes address. */ | 2310 2311 /* Deactivate timers */ 2312 ipv6_mc_down(idev); 2313 2314 /* Delete all-nodes address. */ |
2318 ipv6_addr_all_nodes(&maddr); 2319 | |
2320 /* We cannot call ipv6_dev_mc_dec() directly, our caller in 2321 * addrconf.c has NULL'd out dev->ip6_ptr so in6_dev_get() will 2322 * fail. 2323 */ | 2315 /* We cannot call ipv6_dev_mc_dec() directly, our caller in 2316 * addrconf.c has NULL'd out dev->ip6_ptr so in6_dev_get() will 2317 * fail. 2318 */ |
2324 __ipv6_dev_mc_dec(idev, &maddr); | 2319 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allnodes); |
2325 | 2320 |
2326 if (idev->cnf.forwarding) { 2327 ipv6_addr_all_routers(&maddr); 2328 __ipv6_dev_mc_dec(idev, &maddr); 2329 } | 2321 if (idev->cnf.forwarding) 2322 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allrouters); |
2330 2331 write_lock_bh(&idev->lock); 2332 while ((i = idev->mc_list) != NULL) { 2333 idev->mc_list = i->next; 2334 write_unlock_bh(&idev->lock); 2335 2336 igmp6_group_dropped(i); 2337 ma_put(i); --- 380 unchanged lines hidden --- | 2323 2324 write_lock_bh(&idev->lock); 2325 while ((i = idev->mc_list) != NULL) { 2326 idev->mc_list = i->next; 2327 write_unlock_bh(&idev->lock); 2328 2329 igmp6_group_dropped(i); 2330 ma_put(i); --- 380 unchanged lines hidden --- |