| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Mahesh Bandewar <maheshb@google.com> |
| Date: Fri, 12 May 2017 17:03:39 -0700 |
| Subject: ipv6: avoid dad-failures for addresses with NODAD |
| |
| From: Mahesh Bandewar <maheshb@google.com> |
| |
| |
| [ Upstream commit 66eb9f86e50547ec2a8ff7a75997066a74ef584b ] |
| |
| 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> |
| Acked-by: David Ahern <dsahern@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/addrconf.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/net/ipv6/addrconf.c |
| +++ b/net/ipv6/addrconf.c |
| @@ -988,7 +988,10 @@ ipv6_add_addr(struct inet6_dev *idev, co |
| 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; |