|
@@ -1351,8 +1351,9 @@ static void ip6_mc_hdr(struct sock *sk, struct sk_buff *skb,
|
|
|
hdr->daddr = *daddr;
|
|
|
}
|
|
|
|
|
|
-static struct sk_buff *mld_newpack(struct net_device *dev, int size)
|
|
|
+static struct sk_buff *mld_newpack(struct inet6_dev *idev, int size)
|
|
|
{
|
|
|
+ struct net_device *dev = idev->dev;
|
|
|
struct net *net = dev_net(dev);
|
|
|
struct sock *sk = net->ipv6.igmp_sk;
|
|
|
struct sk_buff *skb;
|
|
@@ -1377,7 +1378,7 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
|
|
|
|
|
|
skb_reserve(skb, hlen);
|
|
|
|
|
|
- if (ipv6_get_lladdr(dev, &addr_buf, IFA_F_TENTATIVE)) {
|
|
|
+ if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) {
|
|
|
/* <draft-ietf-magma-mld-source-05.txt>:
|
|
|
* use unspecified address as the source address
|
|
|
* 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,
|
|
|
struct mld2_grec *pgr;
|
|
|
|
|
|
if (!skb)
|
|
|
- skb = mld_newpack(dev, dev->mtu);
|
|
|
+ skb = mld_newpack(pmc->idev, dev->mtu);
|
|
|
if (!skb)
|
|
|
return NULL;
|
|
|
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,
|
|
|
static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
|
|
|
int type, int gdeleted, int sdeleted)
|
|
|
{
|
|
|
- struct net_device *dev = pmc->idev->dev;
|
|
|
+ struct inet6_dev *idev = pmc->idev;
|
|
|
+ struct net_device *dev = idev->dev;
|
|
|
struct mld2_report *pmr;
|
|
|
struct mld2_grec *pgr = NULL;
|
|
|
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,
|
|
|
AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
|
|
|
if (skb)
|
|
|
mld_sendpack(skb);
|
|
|
- skb = mld_newpack(dev, dev->mtu);
|
|
|
+ skb = mld_newpack(idev, dev->mtu);
|
|
|
}
|
|
|
}
|
|
|
first = 1;
|
|
@@ -1550,7 +1552,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
|
|
|
pgr->grec_nsrcs = htons(scount);
|
|
|
if (skb)
|
|
|
mld_sendpack(skb);
|
|
|
- skb = mld_newpack(dev, dev->mtu);
|
|
|
+ skb = mld_newpack(idev, dev->mtu);
|
|
|
first = 1;
|
|
|
scount = 0;
|
|
|
}
|
|
@@ -1605,8 +1607,8 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
|
|
|
struct sk_buff *skb = NULL;
|
|
|
int type;
|
|
|
|
|
|
+ read_lock_bh(&idev->lock);
|
|
|
if (!pmc) {
|
|
|
- read_lock_bh(&idev->lock);
|
|
|
for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
|
|
|
if (pmc->mca_flags & MAF_NOREPORT)
|
|
|
continue;
|
|
@@ -1618,7 +1620,6 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
|
|
|
skb = add_grec(skb, pmc, type, 0, 0);
|
|
|
spin_unlock_bh(&pmc->mca_lock);
|
|
|
}
|
|
|
- read_unlock_bh(&idev->lock);
|
|
|
} else {
|
|
|
spin_lock_bh(&pmc->mca_lock);
|
|
|
if (pmc->mca_sfcount[MCAST_EXCLUDE])
|
|
@@ -1628,6 +1629,7 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
|
|
|
skb = add_grec(skb, pmc, type, 0, 0);
|
|
|
spin_unlock_bh(&pmc->mca_lock);
|
|
|
}
|
|
|
+ read_unlock_bh(&idev->lock);
|
|
|
if (skb)
|
|
|
mld_sendpack(skb);
|
|
|
}
|