diff options
author | chenweilong <chenweilong@huawei.com> | 2014-08-06 12:18:17 +0400 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2014-11-05 23:27:47 +0300 |
commit | a0a8667a54a43250f962bf778c031c50c31e9142 (patch) | |
tree | fc8208c3729eb8ed78d9171e815373684796746e /net/ipv6 | |
parent | 4715883ba814db9635baf74e378580bd27a534bd (diff) | |
download | linux-a0a8667a54a43250f962bf778c031c50c31e9142.tar.xz |
ipv6: reallocate addrconf router for ipv6 address when lo device up
It fix the bug 67951 on bugzilla
https://bugzilla.kernel.org/show_bug.cgi?id=67951
The patch can't be applied directly, as it' used the function introduced
by "commit 94e187c0" ip6_rt_put(), that patch can't be applied directly
either.
====================
From: Gao feng <gaofeng@cn.fujitsu.com>
commit 33d99113b1102c2d2f8603b9ba72d89d915c13f5 upstream.
This commit don't have a stable tag, but it fix the bug
no reply after loopback down-up.It's very worthy to be
applied to stable 3.4 kernels.
The bug is 67951 on bugzilla
https://bugzilla.kernel.org/show_bug.cgi?id=67951
CC: Sabrina Dubroca <sd@queasysnail.net>
CC: Hannes Frederic Sowa <hannes@stressinduktion.org>
Reported-by: Weilong Chen <chenweilong@huawei.com>
Signed-off-by: Weilong Chen <chenweilong@huawei.com>
Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
[weilong: s/ip6_rt_put/dst_release]
Signed-off-by: Chen Weilong <chenweilong@huawei.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index b9edff0bbc2c..3afdd7868506 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -2443,8 +2443,18 @@ static void init_loopback(struct net_device *dev) if (sp_ifa->flags & (IFA_F_DADFAILED | IFA_F_TENTATIVE)) continue; - if (sp_ifa->rt) - continue; + if (sp_ifa->rt) { + /* This dst has been added to garbage list when + * lo device down, release this obsolete dst and + * reallocate a new router for ifa. + */ + if (sp_ifa->rt->dst.obsolete > 0) { + dst_release(&sp_ifa->rt->dst); + sp_ifa->rt = NULL; + } else { + continue; + } + } sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0); |