diff options
-rw-r--r-- | include/net/addrconf.h | 3 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
-rw-r--r-- | net/ipv6/mcast.c | 18 |
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); |
89 | extern int __ipv6_get_lladdr(struct inet6_dev *idev, | ||
90 | struct in6_addr *addr, | ||
91 | unsigned char banned_flags); | ||
89 | extern int ipv6_get_lladdr(struct net_device *dev, | 92 | extern 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 | } |
1445 | EXPORT_SYMBOL(ipv6_dev_get_saddr); | 1445 | EXPORT_SYMBOL(ipv6_dev_get_saddr); |
1446 | 1446 | ||
1447 | static int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, | 1447 | int __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 | ||
1354 | static struct sk_buff *mld_newpack(struct net_device *dev, int size) | 1354 | static 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, | |||
1494 | static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc, | 1495 | static 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 | } |