diff options
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 31bdedc32bdd..ad235690684c 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -2657,8 +2657,18 @@ static void init_loopback(struct net_device *dev) | |||
| 2657 | if (sp_ifa->flags & (IFA_F_DADFAILED | IFA_F_TENTATIVE)) | 2657 | if (sp_ifa->flags & (IFA_F_DADFAILED | IFA_F_TENTATIVE)) |
| 2658 | continue; | 2658 | continue; |
| 2659 | 2659 | ||
| 2660 | if (sp_ifa->rt) | 2660 | if (sp_ifa->rt) { |
| 2661 | continue; | 2661 | /* This dst has been added to garbage list when |
| 2662 | * lo device down, release this obsolete dst and | ||
| 2663 | * reallocate a new router for ifa. | ||
| 2664 | */ | ||
| 2665 | if (sp_ifa->rt->dst.obsolete > 0) { | ||
| 2666 | ip6_rt_put(sp_ifa->rt); | ||
| 2667 | sp_ifa->rt = NULL; | ||
| 2668 | } else { | ||
| 2669 | continue; | ||
| 2670 | } | ||
| 2671 | } | ||
| 2662 | 2672 | ||
| 2663 | sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, false); | 2673 | sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, false); |
| 2664 | 2674 | ||
