Received: by 10.223.176.5 with SMTP id f5csp698211wra; Fri, 9 Feb 2018 05:53:37 -0800 (PST) X-Google-Smtp-Source: AH8x224sd5VAzIVPO7geZLhc+//SKzSQxFzu5oZUMxOsLpvOQtzte28Gok7JVS0MqGgpl4li/T60 X-Received: by 10.98.198.143 with SMTP id x15mr2938585pfk.22.1518184417539; Fri, 09 Feb 2018 05:53:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518184417; cv=none; d=google.com; s=arc-20160816; b=zYMyJMhpJSNeJv/BDBuzGTb6UM6zRWVV5dmApZx55g1CxEsw/xM8N4v8CPPw7AP/DU xhvK2CPdP+nrReDb3AydCuPqnZgrgOly2mNOWiQ2VMTFv2YwQce8iAnyykraOoSxVwaI +2eq/SWdNdALeaSFPqumr1NpSWwJCeI1fkJud550iPWSEtA3b2xsLerS2CBhfN6lwWfA 7+hBG1FxyLdrx8FZsh+XQDjgh0GmfvTpuM9IIsxqxWmP3zeOAJm9npSHA9/0KiNiwnfp 6FtWhd4BDZ3J5c4pXceC96RcwDmB1BnNS51Zi7TiFZlRZm1vRUrQzRIdaKzfSqxvi6vC w2rw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=tfhqt+cJ+N65P3Q4Bmtv0E/wtoy25Q8A8Ho8Qo55wzk=; b=xkq8RAX2QNtNAVKG35P9hS/yw8w9euCOzb54/YwLg9ZxYgKGHRbBDQef+tUVjar9f5 O8DBIQwEfIZd5rM68cElmM1pg1J+Px2li1gfTPfTpPF4GfgViyaN7Kj1ihhkq2l2WgOI /CIjUu8sXdCRWeQh2ZgCuYJyNE8wDKXCbg6TNtPd6EQFvasxU6pdUg1HYiKjzINfM8tE GyoYBvauwronbXouREHcRTAtnLC6TqEhVOuHxLzCeQ338XLpd+iecpFYDRKz286iuEyM WJcDY22X4ezMdASfDJAW3BWAajm/C8JcHi9KL89MTuwIlFkzy3iJUiFZwEBUI+rs3tyN 33pA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f74si1055745pfa.365.2018.02.09.05.53.23; Fri, 09 Feb 2018 05:53:37 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753438AbeBINqR (ORCPT + 99 others); Fri, 9 Feb 2018 08:46:17 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:52584 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753360AbeBINqP (ORCPT ); Fri, 9 Feb 2018 08:46:15 -0500 Received: from localhost (LFbn-1-12258-90.w90-92.abo.wanadoo.fr [90.92.71.90]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 34D0C1130; Fri, 9 Feb 2018 13:46:14 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vivek Venkatraman , David Ahern , "David S. Miller" Subject: [PATCH 4.15 11/23] net: ipv6: send unsolicited NA after DAD Date: Fri, 9 Feb 2018 14:40:09 +0100 Message-Id: <20180209133938.946399194@linuxfoundation.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180209133938.366024920@linuxfoundation.org> References: <20180209133938.366024920@linuxfoundation.org> User-Agent: quilt/0.65 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.15-stable review patch. If anyone has any objections, please let me know. ------------------ From: David Ahern [ Upstream commit c76fe2d98c726224a975a0d0198c3fb50406d325 ] Unsolicited IPv6 neighbor advertisements should be sent after DAD completes. Update ndisc_send_unsol_na to skip tentative, non-optimistic addresses and have those sent by addrconf_dad_completed after DAD. Fixes: 4a6e3c5def13c ("net: ipv6: send unsolicited NA on admin up") Reported-by: Vivek Venkatraman Signed-off-by: David Ahern Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/ipv6/addrconf.c | 30 ++++++++++++++++++++++++++---- net/ipv6/ndisc.c | 5 +++++ 2 files changed, 31 insertions(+), 4 deletions(-) --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -186,7 +186,8 @@ static struct rt6_info *addrconf_get_pre static void addrconf_dad_start(struct inet6_ifaddr *ifp); static void addrconf_dad_work(struct work_struct *w); -static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id); +static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, + bool send_na); static void addrconf_dad_run(struct inet6_dev *idev); static void addrconf_rs_timer(struct timer_list *t); static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); @@ -3833,12 +3834,17 @@ static void addrconf_dad_begin(struct in idev->cnf.accept_dad < 1) || !(ifp->flags&IFA_F_TENTATIVE) || ifp->flags & IFA_F_NODAD) { + bool send_na = false; + + if (ifp->flags & IFA_F_TENTATIVE && + !(ifp->flags & IFA_F_OPTIMISTIC)) + send_na = true; bump_id = ifp->flags & IFA_F_TENTATIVE; ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); spin_unlock(&ifp->lock); read_unlock_bh(&idev->lock); - addrconf_dad_completed(ifp, bump_id); + addrconf_dad_completed(ifp, bump_id, send_na); return; } @@ -3967,16 +3973,21 @@ static void addrconf_dad_work(struct wor } if (ifp->dad_probes == 0) { + bool send_na = false; + /* * DAD was successful */ + if (ifp->flags & IFA_F_TENTATIVE && + !(ifp->flags & IFA_F_OPTIMISTIC)) + send_na = true; bump_id = ifp->flags & IFA_F_TENTATIVE; ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); spin_unlock(&ifp->lock); write_unlock_bh(&idev->lock); - addrconf_dad_completed(ifp, bump_id); + addrconf_dad_completed(ifp, bump_id, send_na); goto out; } @@ -4014,7 +4025,8 @@ static bool ipv6_lonely_lladdr(struct in return true; } -static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id) +static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, + bool send_na) { struct net_device *dev = ifp->idev->dev; struct in6_addr lladdr; @@ -4046,6 +4058,16 @@ static void addrconf_dad_completed(struc if (send_mld) ipv6_mc_dad_complete(ifp->idev); + /* send unsolicited NA if enabled */ + if (send_na && + (ifp->idev->cnf.ndisc_notify || + dev_net(dev)->ipv6.devconf_all->ndisc_notify)) { + ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr, + /*router=*/ !!ifp->idev->cnf.forwarding, + /*solicited=*/ false, /*override=*/ true, + /*inc_opt=*/ true); + } + if (send_rs) { /* * If a host as already performed a random delay --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -566,6 +566,11 @@ static void ndisc_send_unsol_na(struct n read_lock_bh(&idev->lock); list_for_each_entry(ifa, &idev->addr_list, if_list) { + /* skip tentative addresses until dad completes */ + if (ifa->flags & IFA_F_TENTATIVE && + !(ifa->flags & IFA_F_OPTIMISTIC)) + continue; + ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr, /*router=*/ !!idev->cnf.forwarding, /*solicited=*/ false, /*override=*/ true,