Message ID | 20170513000339.15843-1-mahesh@bandewar.net |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On 5/12/17 6:03 PM, Mahesh Bandewar wrote: > From: Mahesh Bandewar <maheshb@google.com> > > Every address gets added with TENTATIVE flag even for the addresses with > IFA_F_NODAD flag and dad-work is scheduled for them. During this DAD process > we realize it's an address with NODAD and complete the process without > sending any probe. However the TENTATIVE flags stays on the > address for sometime enough to cause misinterpretation when we receive a NS. > While processing NS, if the address has TENTATIVE flag, we mark it DADFAILED > and endup with an address that was originally configured as NODAD with > DADFAILED. > > We can't avoid scheduling dad_work for addresses with NODAD but we can > avoid adding TENTATIVE flag to avoid this racy situation. > > Signed-off-by: Mahesh Bandewar <maheshb@google.com> > --- > net/ipv6/addrconf.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c > index b09ac38d8dc4..53f2dc092023 100644 > --- a/net/ipv6/addrconf.c > +++ b/net/ipv6/addrconf.c > @@ -1022,7 +1022,10 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, > INIT_HLIST_NODE(&ifa->addr_lst); > ifa->scope = scope; > ifa->prefix_len = pfxlen; > - ifa->flags = flags | IFA_F_TENTATIVE; > + ifa->flags = flags; > + /* No need to add the TENTATIVE flag for addresses with NODAD */ > + if (!(flags & IFA_F_NODAD)) > + ifa->flags |= IFA_F_TENTATIVE; > ifa->valid_lft = valid_lft; > ifa->prefered_lft = prefered_lft; > ifa->cstamp = ifa->tstamp = jiffies; > LGTM. Acked-by: David Ahern <dsahern@gmail.com>
From: Mahesh Bandewar <mahesh@bandewar.net> Date: Fri, 12 May 2017 17:03:39 -0700 > From: Mahesh Bandewar <maheshb@google.com> > > Every address gets added with TENTATIVE flag even for the addresses with > IFA_F_NODAD flag and dad-work is scheduled for them. During this DAD process > we realize it's an address with NODAD and complete the process without > sending any probe. However the TENTATIVE flags stays on the > address for sometime enough to cause misinterpretation when we receive a NS. > While processing NS, if the address has TENTATIVE flag, we mark it DADFAILED > and endup with an address that was originally configured as NODAD with > DADFAILED. > > We can't avoid scheduling dad_work for addresses with NODAD but we can > avoid adding TENTATIVE flag to avoid this racy situation. > > Signed-off-by: Mahesh Bandewar <maheshb@google.com> This doesn't apply cleanly to the net tree, please respin. Thank you.
From: David Miller <davem@davemloft.net> Date: Mon, 15 May 2017 14:26:55 -0400 (EDT) > From: Mahesh Bandewar <mahesh@bandewar.net> > Date: Fri, 12 May 2017 17:03:39 -0700 > >> From: Mahesh Bandewar <maheshb@google.com> >> >> Every address gets added with TENTATIVE flag even for the addresses with >> IFA_F_NODAD flag and dad-work is scheduled for them. During this DAD process >> we realize it's an address with NODAD and complete the process without >> sending any probe. However the TENTATIVE flags stays on the >> address for sometime enough to cause misinterpretation when we receive a NS. >> While processing NS, if the address has TENTATIVE flag, we mark it DADFAILED >> and endup with an address that was originally configured as NODAD with >> DADFAILED. >> >> We can't avoid scheduling dad_work for addresses with NODAD but we can >> avoid adding TENTATIVE flag to avoid this racy situation. >> >> Signed-off-by: Mahesh Bandewar <maheshb@google.com> > > This doesn't apply cleanly to the net tree, please respin. Ignore this, I was trying to apply the wrong patch. Applied, thank you.
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index b09ac38d8dc4..53f2dc092023 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -1022,7 +1022,10 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, INIT_HLIST_NODE(&ifa->addr_lst); ifa->scope = scope; ifa->prefix_len = pfxlen; - ifa->flags = flags | IFA_F_TENTATIVE; + ifa->flags = flags; + /* No need to add the TENTATIVE flag for addresses with NODAD */ + if (!(flags & IFA_F_NODAD)) + ifa->flags |= IFA_F_TENTATIVE; ifa->valid_lft = valid_lft; ifa->prefered_lft = prefered_lft; ifa->cstamp = ifa->tstamp = jiffies;