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 ---