On Wed, May 3, 2017 at 3:09 PM, David Ahern <dsah...@gmail.com> wrote: > On 5/3/17 4:02 PM, Cong Wang wrote: >> On Wed, May 3, 2017 at 11:22 AM, David Ahern <dsah...@gmail.com> wrote: >>> On 5/3/17 11:02 AM, Cong Wang wrote: >>>> A quick glance shows we need to simply check local->rt6i_idev >>>> since we do the same check for sprt right above. >>> >>> As I recall, rt6i_idev is set for all routes except null_entry and it is >>> not set on null_entry only because of initialization order. >> >> Are you sure? >> >> if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) { >> net->ipv6.ip6_null_entry->dst.dev = dev; >> net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev); >> #ifdef CONFIG_IPV6_MULTIPLE_TABLES >> net->ipv6.ip6_prohibit_entry->dst.dev = dev; >> net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev); >> net->ipv6.ip6_blk_hole_entry->dst.dev = dev; >> net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); >> #endif >> } >> >> Loopback is the first one to register, so null entry is set to >> loopback dev initially. Similar for init_net. >> > > Why don't you add a printk and see ;-)
Ah, we need: @@ -4024,7 +4027,7 @@ static struct pernet_operations ip6_route_net_late_ops = { static struct notifier_block ip6_route_dev_notifier = { .notifier_call = ip6_route_dev_notify, - .priority = 0, + .priority = -10, /* Must be called after addrconf_notify!! */ };