|
|
@@ -5678,13 +5678,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))
|