stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org,
	Hannes Frederic Sowa <hannes@stressinduktion.org>,
	Paolo Abeni <pabeni@redhat.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 4.8 11/45] ipv6: bump genid when the IFA_F_TENTATIVE flag is clear
Date: Fri,  9 Dec 2016 17:20:40 +0100	[thread overview]
Message-ID: <20161209161755.373590326@linuxfoundation.org> (raw)
In-Reply-To: <20161209161754.912203877@linuxfoundation.org>

4.8-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Paolo Abeni <pabeni@redhat.com>


[ Upstream commit 764d3be6e415b40056834bfd29b994dc3f837606 ]

When an ipv6 address has the tentative flag set, it can't be
used as source for egress traffic, while the associated route,
if any, can be looked up and even stored into some dst_cache.

In the latter scenario, the source ipv6 address selected and
stored in the cache is most probably wrong (e.g. with
link-local scope) and the entity using the dst_cache will
experience lack of ipv6 connectivity until said cache is
cleared or invalidated.

Overall this may cause lack of connectivity over most IPv6 tunnels
(comprising geneve and vxlan), if the first egress packet reaches
the tunnel before the DaD is completed for the used ipv6
address.

This patch bumps a new genid after that the IFA_F_TENTATIVE flag
is cleared, so that dst_cache will be invalidated on
next lookup and ipv6 connectivity restored.

Fixes: 0c1d70af924b ("net: use dst_cache for vxlan device")
Fixes: 468dfffcd762 ("geneve: add dst caching support")
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 net/ipv6/addrconf.c |   18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -163,7 +163,7 @@ 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);
+static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id);
 static void addrconf_dad_run(struct inet6_dev *idev);
 static void addrconf_rs_timer(unsigned long data);
 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
@@ -2893,6 +2893,7 @@ static void add_addr(struct inet6_dev *i
 		spin_lock_bh(&ifp->lock);
 		ifp->flags &= ~IFA_F_TENTATIVE;
 		spin_unlock_bh(&ifp->lock);
+		rt_genid_bump_ipv6(dev_net(idev->dev));
 		ipv6_ifa_notify(RTM_NEWADDR, ifp);
 		in6_ifa_put(ifp);
 	}
@@ -3736,7 +3737,7 @@ static void addrconf_dad_begin(struct in
 {
 	struct inet6_dev *idev = ifp->idev;
 	struct net_device *dev = idev->dev;
-	bool notify = false;
+	bool bump_id, notify = false;
 
 	addrconf_join_solict(dev, &ifp->addr);
 
@@ -3751,11 +3752,12 @@ static void addrconf_dad_begin(struct in
 	    idev->cnf.accept_dad < 1 ||
 	    !(ifp->flags&IFA_F_TENTATIVE) ||
 	    ifp->flags & IFA_F_NODAD) {
+		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);
+		addrconf_dad_completed(ifp, bump_id);
 		return;
 	}
 
@@ -3815,8 +3817,8 @@ static void addrconf_dad_work(struct wor
 						struct inet6_ifaddr,
 						dad_work);
 	struct inet6_dev *idev = ifp->idev;
+	bool bump_id, disable_ipv6 = false;
 	struct in6_addr mcaddr;
-	bool disable_ipv6 = false;
 
 	enum {
 		DAD_PROCESS,
@@ -3886,11 +3888,12 @@ static void addrconf_dad_work(struct wor
 		 * DAD was successful
 		 */
 
+		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);
+		addrconf_dad_completed(ifp, bump_id);
 
 		goto out;
 	}
@@ -3927,7 +3930,7 @@ static bool ipv6_lonely_lladdr(struct in
 	return true;
 }
 
-static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
+static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id)
 {
 	struct net_device *dev = ifp->idev->dev;
 	struct in6_addr lladdr;
@@ -3978,6 +3981,9 @@ static void addrconf_dad_completed(struc
 		spin_unlock(&ifp->lock);
 		write_unlock_bh(&ifp->idev->lock);
 	}
+
+	if (bump_id)
+		rt_genid_bump_ipv6(dev_net(dev));
 }
 
 static void addrconf_dad_run(struct inet6_dev *idev)



  parent reply	other threads:[~2016-12-09 16:21 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20161209162112epcas5p48e365650e03ecaae64d811516a0f837d@epcas5p4.samsung.com>
2016-12-09 16:20 ` [PATCH 4.8 00/45] 4.8.14-stable review Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 01/45] gro_cells: mark napi struct as not busy poll candidates Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 02/45] virtio-net: add a missing synchronize_net() Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 03/45] net: dsa: b53: Fix VLAN usage and how we treat CPU port Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 04/45] net: check dead netns for peernet2id_alloc() Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 05/45] ip6_tunnel: disable caching when the traffic class is inherited Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 06/45] net: sky2: Fix shutdown crash Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 07/45] af_unix: conditionally use freezable blocking calls in read Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 08/45] rtnetlink: fix FDB size computation Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 09/45] l2tp: fix racy SOCK_ZAPPED flag check in l2tp_ip{,6}_bind() Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 10/45] rtnl: fix the loop index update error in rtnl_dump_ifinfo() Greg Kroah-Hartman
2016-12-09 16:20   ` Greg Kroah-Hartman [this message]
2016-12-09 16:20   ` [PATCH 4.8 12/45] udplite: call proper backlog handlers Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 13/45] net: dsa: bcm_sf2: Ensure we re-negotiate EEE during after link change Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 14/45] net, sched: respect rcu grace period on cls destruction Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 15/45] net: dsa: fix unbalanced dsa_switch_tree reference counting Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 16/45] net/sched: pedit: make sure that offset is valid Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 17/45] netlink: Call cb->done from a worker thread Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 18/45] netlink: Do not schedule work from sk_destruct Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 19/45] net: macb: fix the RX queue reset in macb_rx() Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 20/45] net/dccp: fix use-after-free in dccp_invalid_packet Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 21/45] GSO: Reload iph after pskb_may_pull Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 22/45] packet: fix race condition in packet_set_ring Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 23/45] ip6_offload: check segs for NULL in ipv6_gso_segment Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 25/45] net: bcmgenet: Utilize correct struct device for all DMA operations Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 26/45] sh_eth: remove unchecked interrupts for RZ/A1 Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 28/45] geneve: avoid use-after-free of skb->data Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 29/45] net: avoid signed overflows for SO_{SND|RCV}BUFFORCE Greg Kroah-Hartman
2016-12-09 16:20   ` [PATCH 4.8 30/45] net: ping: check minimum size on ICMP header length Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 31/45] ipv4: Restore fib_trie_flush_external function and fix call ordering Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 32/45] ipv4: Fix memory leak in exception case for splitting tries Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 33/45] ipv4: Drop leaf from suffix pull/push functions Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 34/45] ipv4: Drop suffix update from resize code Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 35/45] sparc64: Fix find_node warning if numa node cannot be found Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 36/45] sparc64: fix compile warning section mismatch in find_node() Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 37/45] sparc32: Fix inverted invalid_frame_pointer checks on sigreturns Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 38/45] Dont feed anything but regular iovecs to blk_rq_map_user_iov Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 39/45] constify iov_iter_count() and iter_is_iovec() Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 40/45] ipv6: Set skb->protocol properly for local output Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 41/45] ipv4: " Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 42/45] Revert: "ip6_tunnel: Update skb->protocol to ETH_P_IPV6 in ip6_tnl_xmit()" Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 44/45] esp4: Fix integrity verification when ESN are used Greg Kroah-Hartman
2016-12-09 16:21   ` [PATCH 4.8 45/45] esp6: " Greg Kroah-Hartman
2016-12-09 18:24   ` [PATCH 4.8 00/45] 4.8.14-stable review Shuah Khan
2016-12-10 12:17     ` Greg Kroah-Hartman
2016-12-09 22:36   ` Guenter Roeck
2016-12-10 12:17     ` Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161209161755.373590326@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=davem@davemloft.net \
    --cc=hannes@stressinduktion.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).