diff options
Diffstat (limited to 'net/ipv6/addrconf.c')
| -rw-r--r-- | net/ipv6/addrconf.c | 17 | 
1 files changed, 12 insertions, 5 deletions
| diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 6a576ff92c39..34ccef18b40e 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -5964,13 +5964,20 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)  	switch (event) {  	case RTM_NEWADDR:  		/* -		 * If the address was optimistic -		 * we inserted the route at the start of -		 * our DAD process, so we don't need -		 * to do it again +		 * If the address was optimistic we inserted the route at the +		 * start of our DAD process, so we don't need to do it again. +		 * If the device was taken down in the middle of the DAD +		 * cycle there is a race where we could get here without a +		 * host route, so nothing to insert. That will be fixed when +		 * the device is brought up.  		 */ -		if (!rcu_access_pointer(ifp->rt->fib6_node)) +		if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) {  			ip6_ins_rt(net, ifp->rt); +		} else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) { +			pr_warn("BUG: Address %pI6c on device %s is missing its host route.\n", +				&ifp->addr, ifp->idev->dev->name); +		} +  		if (ifp->idev->cnf.forwarding)  			addrconf_join_anycast(ifp);  		if (!ipv6_addr_any(&ifp->peer_addr)) |