ipv6: resend MLD report if a link-local address completes DAD
RFC3590/RFC3810 specifies we should resend MLD reports as soon as a valid link-local address is available. We now use the valid_ll_addr_cnt to check if it is necessary to resend a new report. Changes since Flavio Leitner's version: a) adapt for valid_ll_addr_cnt b) resend first reports directly in the path and just arm the timer for mc_qrv-1 resends. Reported-by: Flavio Leitner <fleitner@redhat.com> Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org> Cc: David Stevens <dlstevens@us.ibm.com> Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: Flavio Leitner <fbl@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Esse commit está contido em:

commit de
David S. Miller

pai
1ec047eb47
commit
b173ee488d
@@ -3277,7 +3277,7 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
|
||||
{
|
||||
struct net_device *dev = ifp->idev->dev;
|
||||
struct in6_addr lladdr;
|
||||
bool send_rs;
|
||||
bool send_rs, send_mld;
|
||||
|
||||
addrconf_del_dad_timer(ifp);
|
||||
|
||||
@@ -3293,14 +3293,21 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
|
||||
|
||||
read_lock_bh(&ifp->idev->lock);
|
||||
spin_lock(&ifp->lock);
|
||||
send_rs = ipv6_accept_ra(ifp->idev) &&
|
||||
send_mld = ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL &&
|
||||
ifp->idev->valid_ll_addr_cnt == 1;
|
||||
send_rs = send_mld &&
|
||||
ipv6_accept_ra(ifp->idev) &&
|
||||
ifp->idev->cnf.rtr_solicits > 0 &&
|
||||
(dev->flags&IFF_LOOPBACK) == 0 &&
|
||||
ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL &&
|
||||
ifp->idev->valid_ll_addr_cnt == 1;
|
||||
(dev->flags&IFF_LOOPBACK) == 0;
|
||||
spin_unlock(&ifp->lock);
|
||||
read_unlock_bh(&ifp->idev->lock);
|
||||
|
||||
/* While dad is in progress mld report's source address is in6_addrany.
|
||||
* Resend with proper ll now.
|
||||
*/
|
||||
if (send_mld)
|
||||
ipv6_mc_dad_complete(ifp->idev);
|
||||
|
||||
if (send_rs) {
|
||||
/*
|
||||
* If a host as already performed a random delay
|
||||
|
Referência em uma nova issue
Block a user