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