aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/addrconf.h3
-rw-r--r--net/ipv6/addrconf.c4
-rw-r--r--net/ipv6/mcast.c18
3 files changed, 15 insertions, 10 deletions
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index f68eaf574d7e..c7b181cb47a6 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -86,6 +86,9 @@ extern int ipv6_dev_get_saddr(struct net *net,
86 const struct in6_addr *daddr, 86 const struct in6_addr *daddr,
87 unsigned int srcprefs, 87 unsigned int srcprefs,
88 struct in6_addr *saddr); 88 struct in6_addr *saddr);
89extern int __ipv6_get_lladdr(struct inet6_dev *idev,
90 struct in6_addr *addr,
91 unsigned char banned_flags);
89extern int ipv6_get_lladdr(struct net_device *dev, 92extern int ipv6_get_lladdr(struct net_device *dev,
90 struct in6_addr *addr, 93 struct in6_addr *addr,
91 unsigned char banned_flags); 94 unsigned char banned_flags);
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 12dd2fec045c..75fd93bdd0d3 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1444,8 +1444,8 @@ try_nextdev:
1444} 1444}
1445EXPORT_SYMBOL(ipv6_dev_get_saddr); 1445EXPORT_SYMBOL(ipv6_dev_get_saddr);
1446 1446
1447static int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, 1447int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr,
1448 unsigned char banned_flags) 1448 unsigned char banned_flags)
1449{ 1449{
1450 struct inet6_ifaddr *ifp; 1450 struct inet6_ifaddr *ifp;
1451 int err = -EADDRNOTAVAIL; 1451 int err = -EADDRNOTAVAIL;
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index 502c877cbf10..99cd65c715cd 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -1351,8 +1351,9 @@ static void ip6_mc_hdr(struct sock *sk, struct sk_buff *skb,
1351 hdr->daddr = *daddr; 1351 hdr->daddr = *daddr;
1352} 1352}
1353 1353
1354static struct sk_buff *mld_newpack(struct net_device *dev, int size) 1354static struct sk_buff *mld_newpack(struct inet6_dev *idev, int size)
1355{ 1355{
1356 struct net_device *dev = idev->dev;
1356 struct net *net = dev_net(dev); 1357 struct net *net = dev_net(dev);
1357 struct sock *sk = net->ipv6.igmp_sk; 1358 struct sock *sk = net->ipv6.igmp_sk;
1358 struct sk_buff *skb; 1359 struct sk_buff *skb;
@@ -1377,7 +1378,7 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
1377 1378
1378 skb_reserve(skb, hlen); 1379 skb_reserve(skb, hlen);
1379 1380
1380 if (ipv6_get_lladdr(dev, &addr_buf, IFA_F_TENTATIVE)) { 1381 if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) {
1381 /* <draft-ietf-magma-mld-source-05.txt>: 1382 /* <draft-ietf-magma-mld-source-05.txt>:
1382 * use unspecified address as the source address 1383 * use unspecified address as the source address
1383 * when a valid link-local address is not available. 1384 * when a valid link-local address is not available.
@@ -1474,7 +1475,7 @@ static struct sk_buff *add_grhead(struct sk_buff *skb, struct ifmcaddr6 *pmc,
1474 struct mld2_grec *pgr; 1475 struct mld2_grec *pgr;
1475 1476
1476 if (!skb) 1477 if (!skb)
1477 skb = mld_newpack(dev, dev->mtu); 1478 skb = mld_newpack(pmc->idev, dev->mtu);
1478 if (!skb) 1479 if (!skb)
1479 return NULL; 1480 return NULL;
1480 pgr = (struct mld2_grec *)skb_put(skb, sizeof(struct mld2_grec)); 1481 pgr = (struct mld2_grec *)skb_put(skb, sizeof(struct mld2_grec));
@@ -1494,7 +1495,8 @@ static struct sk_buff *add_grhead(struct sk_buff *skb, struct ifmcaddr6 *pmc,
1494static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc, 1495static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
1495 int type, int gdeleted, int sdeleted) 1496 int type, int gdeleted, int sdeleted)
1496{ 1497{
1497 struct net_device *dev = pmc->idev->dev; 1498 struct inet6_dev *idev = pmc->idev;
1499 struct net_device *dev = idev->dev;
1498 struct mld2_report *pmr; 1500 struct mld2_report *pmr;
1499 struct mld2_grec *pgr = NULL; 1501 struct mld2_grec *pgr = NULL;
1500 struct ip6_sf_list *psf, *psf_next, *psf_prev, **psf_list; 1502 struct ip6_sf_list *psf, *psf_next, *psf_prev, **psf_list;
@@ -1523,7 +1525,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
1523 AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) { 1525 AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
1524 if (skb) 1526 if (skb)
1525 mld_sendpack(skb); 1527 mld_sendpack(skb);
1526 skb = mld_newpack(dev, dev->mtu); 1528 skb = mld_newpack(idev, dev->mtu);
1527 } 1529 }
1528 } 1530 }
1529 first = 1; 1531 first = 1;
@@ -1550,7 +1552,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
1550 pgr->grec_nsrcs = htons(scount); 1552 pgr->grec_nsrcs = htons(scount);
1551 if (skb) 1553 if (skb)
1552 mld_sendpack(skb); 1554 mld_sendpack(skb);
1553 skb = mld_newpack(dev, dev->mtu); 1555 skb = mld_newpack(idev, dev->mtu);
1554 first = 1; 1556 first = 1;
1555 scount = 0; 1557 scount = 0;
1556 } 1558 }
@@ -1605,8 +1607,8 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
1605 struct sk_buff *skb = NULL; 1607 struct sk_buff *skb = NULL;
1606 int type; 1608 int type;
1607 1609
1610 read_lock_bh(&idev->lock);
1608 if (!pmc) { 1611 if (!pmc) {
1609 read_lock_bh(&idev->lock);
1610 for (pmc=idev->mc_list; pmc; pmc=pmc->next) { 1612 for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
1611 if (pmc->mca_flags & MAF_NOREPORT) 1613 if (pmc->mca_flags & MAF_NOREPORT)
1612 continue; 1614 continue;
@@ -1618,7 +1620,6 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
1618 skb = add_grec(skb, pmc, type, 0, 0); 1620 skb = add_grec(skb, pmc, type, 0, 0);
1619 spin_unlock_bh(&pmc->mca_lock); 1621 spin_unlock_bh(&pmc->mca_lock);
1620 } 1622 }
1621 read_unlock_bh(&idev->lock);
1622 } else { 1623 } else {
1623 spin_lock_bh(&pmc->mca_lock); 1624 spin_lock_bh(&pmc->mca_lock);
1624 if (pmc->mca_sfcount[MCAST_EXCLUDE]) 1625 if (pmc->mca_sfcount[MCAST_EXCLUDE])
@@ -1628,6 +1629,7 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
1628 skb = add_grec(skb, pmc, type, 0, 0); 1629 skb = add_grec(skb, pmc, type, 0, 0);
1629 spin_unlock_bh(&pmc->mca_lock); 1630 spin_unlock_bh(&pmc->mca_lock);
1630 } 1631 }
1632 read_unlock_bh(&idev->lock);
1631 if (skb) 1633 if (skb)
1632 mld_sendpack(skb); 1634 mld_sendpack(skb);
1633} 1635}