mcast.c (f68ec0c24755e5cdb779be6240925f2175311d84) mcast.c (3bd653c8455bc7991bae77968702b31c8f5df883)
1/*
2 * Multicast support for IPv6
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
8 * Based on linux/ipv4/igmp.c and linux/ipv4/ip_sockglue.c

--- 1432 unchanged lines hidden (view full) ---

1441 struct mld2_report *pmr =
1442 (struct mld2_report *)skb_transport_header(skb);
1443 int payload_len, mldlen;
1444 struct inet6_dev *idev = in6_dev_get(skb->dev);
1445 struct net *net = dev_net(skb->dev);
1446 int err;
1447 struct flowi fl;
1448
1/*
2 * Multicast support for IPv6
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
8 * Based on linux/ipv4/igmp.c and linux/ipv4/ip_sockglue.c

--- 1432 unchanged lines hidden (view full) ---

1441 struct mld2_report *pmr =
1442 (struct mld2_report *)skb_transport_header(skb);
1443 int payload_len, mldlen;
1444 struct inet6_dev *idev = in6_dev_get(skb->dev);
1445 struct net *net = dev_net(skb->dev);
1446 int err;
1447 struct flowi fl;
1448
1449 IP6_INC_STATS(idev, IPSTATS_MIB_OUTREQUESTS);
1449 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTREQUESTS);
1450 payload_len = (skb->tail - skb->network_header) - sizeof(*pip6);
1451 mldlen = skb->tail - skb->transport_header;
1452 pip6->payload_len = htons(payload_len);
1453
1454 pmr->csum = csum_ipv6_magic(&pip6->saddr, &pip6->daddr, mldlen,
1455 IPPROTO_ICMPV6, csum_partial(skb_transport_header(skb),
1456 mldlen, 0));
1457

--- 308 unchanged lines hidden (view full) ---

1766 struct in6_addr addr_buf;
1767 int err, len, payload_len, full_len;
1768 u8 ra[8] = { IPPROTO_ICMPV6, 0,
1769 IPV6_TLV_ROUTERALERT, 2, 0, 0,
1770 IPV6_TLV_PADN, 0 };
1771 struct flowi fl;
1772
1773 rcu_read_lock();
1450 payload_len = (skb->tail - skb->network_header) - sizeof(*pip6);
1451 mldlen = skb->tail - skb->transport_header;
1452 pip6->payload_len = htons(payload_len);
1453
1454 pmr->csum = csum_ipv6_magic(&pip6->saddr, &pip6->daddr, mldlen,
1455 IPPROTO_ICMPV6, csum_partial(skb_transport_header(skb),
1456 mldlen, 0));
1457

--- 308 unchanged lines hidden (view full) ---

1766 struct in6_addr addr_buf;
1767 int err, len, payload_len, full_len;
1768 u8 ra[8] = { IPPROTO_ICMPV6, 0,
1769 IPV6_TLV_ROUTERALERT, 2, 0, 0,
1770 IPV6_TLV_PADN, 0 };
1771 struct flowi fl;
1772
1773 rcu_read_lock();
1774 IP6_INC_STATS(__in6_dev_get(dev),
1774 IP6_INC_STATS(net, __in6_dev_get(dev),
1775 IPSTATS_MIB_OUTREQUESTS);
1776 rcu_read_unlock();
1777 if (type == ICMPV6_MGM_REDUCTION)
1778 snd_addr = &in6addr_linklocal_allrouters;
1779 else
1780 snd_addr = addr;
1781
1782 len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr);
1783 payload_len = len + sizeof(ra);
1784 full_len = sizeof(struct ipv6hdr) + payload_len;
1785
1786 skb = sock_alloc_send_skb(sk, LL_ALLOCATED_SPACE(dev) + full_len, 1, &err);
1787
1788 if (skb == NULL) {
1789 rcu_read_lock();
1775 IPSTATS_MIB_OUTREQUESTS);
1776 rcu_read_unlock();
1777 if (type == ICMPV6_MGM_REDUCTION)
1778 snd_addr = &in6addr_linklocal_allrouters;
1779 else
1780 snd_addr = addr;
1781
1782 len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr);
1783 payload_len = len + sizeof(ra);
1784 full_len = sizeof(struct ipv6hdr) + payload_len;
1785
1786 skb = sock_alloc_send_skb(sk, LL_ALLOCATED_SPACE(dev) + full_len, 1, &err);
1787
1788 if (skb == NULL) {
1789 rcu_read_lock();
1790 IP6_INC_STATS(__in6_dev_get(dev),
1790 IP6_INC_STATS(net, __in6_dev_get(dev),
1791 IPSTATS_MIB_OUTDISCARDS);
1792 rcu_read_unlock();
1793 return;
1794 }
1795
1796 skb_reserve(skb, LL_RESERVED_SPACE(dev));
1797
1798 if (ipv6_get_lladdr(dev, &addr_buf, IFA_F_TENTATIVE)) {

--- 37 unchanged lines hidden (view full) ---

1836 goto err_out;
1837
1838 err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dev,
1839 dst_output);
1840out:
1841 if (!err) {
1842 ICMP6MSGOUT_INC_STATS(idev, type);
1843 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS);
1791 IPSTATS_MIB_OUTDISCARDS);
1792 rcu_read_unlock();
1793 return;
1794 }
1795
1796 skb_reserve(skb, LL_RESERVED_SPACE(dev));
1797
1798 if (ipv6_get_lladdr(dev, &addr_buf, IFA_F_TENTATIVE)) {

--- 37 unchanged lines hidden (view full) ---

1836 goto err_out;
1837
1838 err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dev,
1839 dst_output);
1840out:
1841 if (!err) {
1842 ICMP6MSGOUT_INC_STATS(idev, type);
1843 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS);
1844 IP6_INC_STATS(idev, IPSTATS_MIB_OUTMCASTPKTS);
1844 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTMCASTPKTS);
1845 } else
1845 } else
1846 IP6_INC_STATS(idev, IPSTATS_MIB_OUTDISCARDS);
1846 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
1847
1848 if (likely(idev != NULL))
1849 in6_dev_put(idev);
1850 return;
1851
1852err_out:
1853 kfree_skb(skb);
1854 goto out;

--- 852 unchanged lines hidden ---
1847
1848 if (likely(idev != NULL))
1849 in6_dev_put(idev);
1850 return;
1851
1852err_out:
1853 kfree_skb(skb);
1854 goto out;

--- 852 unchanged lines hidden ---