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.