aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv6/addrconf.c4
-rw-r--r--net/ipv6/mcast.c19
2 files changed, 12 insertions, 11 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 7df04d294924..e93fa62089f8 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -2745,7 +2745,6 @@ static void addrconf_dad_timer(unsigned long data)
2745{ 2745{
2746 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data; 2746 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data;
2747 struct inet6_dev *idev = ifp->idev; 2747 struct inet6_dev *idev = ifp->idev;
2748 struct in6_addr unspec;
2749 struct in6_addr mcaddr; 2748 struct in6_addr mcaddr;
2750 2749
2751 read_lock_bh(&idev->lock); 2750 read_lock_bh(&idev->lock);
@@ -2774,9 +2773,8 @@ static void addrconf_dad_timer(unsigned long data)
2774 read_unlock_bh(&idev->lock); 2773 read_unlock_bh(&idev->lock);
2775 2774
2776 /* send a neighbour solicitation for our addr */ 2775 /* send a neighbour solicitation for our addr */
2777 memset(&unspec, 0, sizeof(unspec));
2778 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); 2776 addrconf_addr_solict_mult(&ifp->addr, &mcaddr);
2779 ndisc_send_ns(ifp->idev->dev, NULL, &ifp->addr, &mcaddr, &unspec); 2777 ndisc_send_ns(ifp->idev->dev, NULL, &ifp->addr, &mcaddr, &in6addr_any);
2780out: 2778out:
2781 in6_ifa_put(ifp); 2779 in6_ifa_put(ifp);
2782} 2780}
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index c2dc2e2b6c07..54f91efdae58 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -1404,6 +1404,7 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
1404 struct sk_buff *skb; 1404 struct sk_buff *skb;
1405 struct mld2_report *pmr; 1405 struct mld2_report *pmr;
1406 struct in6_addr addr_buf; 1406 struct in6_addr addr_buf;
1407 const struct in6_addr *saddr;
1407 int err; 1408 int err;
1408 u8 ra[8] = { IPPROTO_ICMPV6, 0, 1409 u8 ra[8] = { IPPROTO_ICMPV6, 0,
1409 IPV6_TLV_ROUTERALERT, 2, 0, 0, 1410 IPV6_TLV_ROUTERALERT, 2, 0, 0,
@@ -1422,10 +1423,11 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
1422 * use unspecified address as the source address 1423 * use unspecified address as the source address
1423 * when a valid link-local address is not available. 1424 * when a valid link-local address is not available.
1424 */ 1425 */
1425 memset(&addr_buf, 0, sizeof(addr_buf)); 1426 saddr = &in6addr_any;
1426 } 1427 } else
1428 saddr = &addr_buf;
1427 1429
1428 ip6_nd_hdr(sk, skb, dev, &addr_buf, &mld2_all_mcr, NEXTHDR_HOP, 0); 1430 ip6_nd_hdr(sk, skb, dev, saddr, &mld2_all_mcr, NEXTHDR_HOP, 0);
1429 1431
1430 memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra)); 1432 memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra));
1431 1433
@@ -1766,7 +1768,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
1766 struct inet6_dev *idev; 1768 struct inet6_dev *idev;
1767 struct sk_buff *skb; 1769 struct sk_buff *skb;
1768 struct icmp6hdr *hdr; 1770 struct icmp6hdr *hdr;
1769 const struct in6_addr *snd_addr; 1771 const struct in6_addr *snd_addr, *saddr;
1770 struct in6_addr *addrp; 1772 struct in6_addr *addrp;
1771 struct in6_addr addr_buf; 1773 struct in6_addr addr_buf;
1772 int err, len, payload_len, full_len; 1774 int err, len, payload_len, full_len;
@@ -1805,10 +1807,11 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
1805 * use unspecified address as the source address 1807 * use unspecified address as the source address
1806 * when a valid link-local address is not available. 1808 * when a valid link-local address is not available.
1807 */ 1809 */
1808 memset(&addr_buf, 0, sizeof(addr_buf)); 1810 saddr = &in6addr_any;
1809 } 1811 } else
1812 saddr = &addr_buf;
1810 1813
1811 ip6_nd_hdr(sk, skb, dev, &addr_buf, snd_addr, NEXTHDR_HOP, payload_len); 1814 ip6_nd_hdr(sk, skb, dev, saddr, snd_addr, NEXTHDR_HOP, payload_len);
1812 1815
1813 memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra)); 1816 memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra));
1814 1817
@@ -1819,7 +1822,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
1819 addrp = (struct in6_addr *) skb_put(skb, sizeof(struct in6_addr)); 1822 addrp = (struct in6_addr *) skb_put(skb, sizeof(struct in6_addr));
1820 ipv6_addr_copy(addrp, addr); 1823 ipv6_addr_copy(addrp, addr);
1821 1824
1822 hdr->icmp6_cksum = csum_ipv6_magic(&addr_buf, snd_addr, len, 1825 hdr->icmp6_cksum = csum_ipv6_magic(saddr, snd_addr, len,
1823 IPPROTO_ICMPV6, 1826 IPPROTO_ICMPV6,
1824 csum_partial((__u8 *) hdr, len, 0)); 1827 csum_partial((__u8 *) hdr, len, 0));
1825 1828