if (table) {
                table->tb6_id = id;
                rcu_assign_pointer(table->tb6_root.leaf,
-                                  net->ipv6.ip6_null_entry);
+                                  net->ipv6.fib6_null_entry);
                table->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;
                inet_peer_base_init(&table->tb6_peers);
        }
 
 static void fib6_rt_dump(struct rt6_info *rt, struct fib6_dump_arg *arg)
 {
-       if (rt == arg->net->ipv6.ip6_null_entry)
+       if (rt == arg->net->ipv6.fib6_null_entry)
                return;
        call_fib6_entry_notifier(arg->nb, arg->net, FIB_EVENT_ENTRY_ADD, rt);
 }
                        /* remove null_entry in the root node */
                        } else if (fn->fn_flags & RTN_TL_ROOT &&
                                   rcu_access_pointer(fn->leaf) ==
-                                  net->ipv6.ip6_null_entry) {
+                                  net->ipv6.fib6_null_entry) {
                                RCU_INIT_POINTER(fn->leaf, NULL);
                        }
 
                        if (!sfn)
                                goto failure;
 
-                       atomic_inc(&info->nl_net->ipv6.ip6_null_entry->rt6i_ref);
+                       atomic_inc(&info->nl_net->ipv6.fib6_null_entry->rt6i_ref);
                        rcu_assign_pointer(sfn->leaf,
-                                          info->nl_net->ipv6.ip6_null_entry);
+                                          info->nl_net->ipv6.fib6_null_entry);
                        sfn->fn_flags = RTN_ROOT;
 
                        /* Now add the first leaf node to new subtree */
                        if (fn->fn_flags & RTN_TL_ROOT) {
                                /* put back null_entry for root node */
                                rcu_assign_pointer(fn->leaf,
-                                           info->nl_net->ipv6.ip6_null_entry);
+                                           info->nl_net->ipv6.fib6_null_entry);
                        } else {
                                atomic_inc(&rt->rt6i_ref);
                                rcu_assign_pointer(fn->leaf, rt);
                                if (!pn_leaf) {
                                        WARN_ON(!pn_leaf);
                                        pn_leaf =
-                                           info->nl_net->ipv6.ip6_null_entry;
+                                           info->nl_net->ipv6.fib6_null_entry;
                                }
 #endif
                                atomic_inc(&pn_leaf->rt6i_ref);
        struct fib6_node *child_left, *child_right;
 
        if (fn->fn_flags & RTN_ROOT)
-               return net->ipv6.ip6_null_entry;
+               return net->ipv6.fib6_null_entry;
 
        while (fn) {
                child_left = rcu_dereference_protected(fn->left,
 
        /* Set fn->leaf to null_entry for root node. */
        if (fn->fn_flags & RTN_TL_ROOT) {
-               rcu_assign_pointer(fn->leaf, net->ipv6.ip6_null_entry);
+               rcu_assign_pointer(fn->leaf, net->ipv6.fib6_null_entry);
                return fn;
        }
 
 #if RT6_DEBUG >= 2
                        if (!new_fn_leaf) {
                                WARN_ON(!new_fn_leaf);
-                               new_fn_leaf = net->ipv6.ip6_null_entry;
+                               new_fn_leaf = net->ipv6.fib6_null_entry;
                        }
 #endif
                        atomic_inc(&new_fn_leaf->rt6i_ref);
                return -ENOENT;
        }
 #endif
-       if (!fn || rt == net->ipv6.ip6_null_entry)
+       if (!fn || rt == net->ipv6.fib6_null_entry)
                return -ENOENT;
 
        WARN_ON(!(fn->fn_flags & RTN_RTINFO));
 
        net->ipv6.fib6_main_tbl->tb6_id = RT6_TABLE_MAIN;
        rcu_assign_pointer(net->ipv6.fib6_main_tbl->tb6_root.leaf,
-                          net->ipv6.ip6_null_entry);
+                          net->ipv6.fib6_null_entry);
        net->ipv6.fib6_main_tbl->tb6_root.fn_flags =
                RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;
        inet_peer_base_init(&net->ipv6.fib6_main_tbl->tb6_peers);
                goto out_fib6_main_tbl;
        net->ipv6.fib6_local_tbl->tb6_id = RT6_TABLE_LOCAL;
        rcu_assign_pointer(net->ipv6.fib6_local_tbl->tb6_root.leaf,
-                          net->ipv6.ip6_null_entry);
+                          net->ipv6.fib6_null_entry);
        net->ipv6.fib6_local_tbl->tb6_root.fn_flags =
                RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;
        inet_peer_base_init(&net->ipv6.fib6_local_tbl->tb6_peers);
 
        [RTAX_HOPLIMIT - 1] = 0,
 };
 
+static const struct rt6_info fib6_null_entry_template = {
+       .rt6i_flags     = (RTF_REJECT | RTF_NONEXTHOP),
+       .rt6i_protocol  = RTPROT_KERNEL,
+       .rt6i_metric    = ~(u32)0,
+       .rt6i_ref       = ATOMIC_INIT(1),
+       .fib6_type      = RTN_UNREACHABLE,
+       .fib6_metrics   = (struct dst_metrics *)&dst_default_metrics,
+};
+
 static const struct rt6_info ip6_null_entry_template = {
        .dst = {
                .__refcnt       = ATOMIC_INIT(1),
                        return local;
 
                if (flags & RT6_LOOKUP_F_IFACE)
-                       return net->ipv6.ip6_null_entry;
+                       return net->ipv6.fib6_null_entry;
        }
 
-       return rt->fib6_nh.nh_flags & RTNH_F_DEAD ? net->ipv6.ip6_null_entry : rt;
+       return rt->fib6_nh.nh_flags & RTNH_F_DEAD ? net->ipv6.fib6_null_entry : rt;
 }
 
 #ifdef CONFIG_IPV6_ROUTER_PREF
        bool do_rr = false;
        int key_plen;
 
-       if (!leaf || leaf == net->ipv6.ip6_null_entry)
-               return net->ipv6.ip6_null_entry;
+       if (!leaf || leaf == net->ipv6.fib6_null_entry)
+               return net->ipv6.fib6_null_entry;
 
        rt0 = rcu_dereference(fn->rr_ptr);
        if (!rt0)
                key_plen = rt0->rt6i_src.plen;
 #endif
        if (fn->fn_bit != key_plen)
-               return net->ipv6.ip6_null_entry;
+               return net->ipv6.fib6_null_entry;
 
        match = find_rr_leaf(fn, leaf, rt0, rt0->rt6i_metric, oif, strict,
                             &do_rr);
                }
        }
 
-       return match ? match : net->ipv6.ip6_null_entry;
+       return match ? match : net->ipv6.fib6_null_entry;
 }
 
 static bool rt6_is_gw_or_nonexthop(const struct rt6_info *rt)
 restart:
        rt = rcu_dereference(fn->leaf);
        if (!rt) {
-               rt = net->ipv6.ip6_null_entry;
+               rt = net->ipv6.fib6_null_entry;
        } else {
                rt = rt6_device_match(net, rt, &fl6->saddr,
                                      fl6->flowi6_oif, flags);
                        rt = rt6_multipath_select(net, rt, fl6, fl6->flowi6_oif,
                                                  skb, flags);
        }
-       if (rt == net->ipv6.ip6_null_entry) {
+       if (rt == net->ipv6.fib6_null_entry) {
                fn = fib6_backtrack(fn, &fl6->saddr);
                if (fn)
                        goto restart;
        rt = rt6_select(net, fn, oif, strict);
        if (rt->rt6i_nsiblings)
                rt = rt6_multipath_select(net, rt, fl6, oif, skb, strict);
-       if (rt == net->ipv6.ip6_null_entry) {
+       if (rt == net->ipv6.fib6_null_entry) {
                fn = fib6_backtrack(fn, &fl6->saddr);
                if (fn)
                        goto redo_rt6_select;
        if (rt_cache)
                rt = rt_cache;
 
-       if (rt == net->ipv6.ip6_null_entry) {
+       if (rt == net->ipv6.fib6_null_entry) {
+               rt = net->ipv6.ip6_null_entry;
                rcu_read_unlock();
                dst_hold(&rt->dst);
                trace_fib6_table_lookup(net, rt, table, fl6);
        }
 
        if (!rt)
-               rt = net->ipv6.ip6_null_entry;
+               rt = net->ipv6.fib6_null_entry;
        else if (rt->rt6i_flags & RTF_REJECT) {
                rt = net->ipv6.ip6_null_entry;
                goto out;
        }
 
-       if (rt == net->ipv6.ip6_null_entry) {
+       if (rt == net->ipv6.fib6_null_entry) {
                fn = fib6_backtrack(fn, &fl6->saddr);
                if (fn)
                        goto restart;
        struct fib6_table *table;
        int err;
 
-       if (rt == net->ipv6.ip6_null_entry) {
+       if (rt == net->ipv6.fib6_null_entry) {
                err = -ENOENT;
                goto out;
        }
        struct fib6_table *table;
        int err = -ENOENT;
 
-       if (rt == net->ipv6.ip6_null_entry)
+       if (rt == net->ipv6.fib6_null_entry)
                goto out_put;
        table = rt->rt6i_table;
        spin_lock_bh(&table->tb6_lock);
        struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
 
        if (((void *)rt->fib6_nh.nh_dev == dev || !dev) &&
-           rt != net->ipv6.ip6_null_entry &&
+           rt != net->ipv6.fib6_null_entry &&
            ipv6_addr_equal(addr, &rt->rt6i_prefsrc.addr)) {
                spin_lock_bh(&rt6_exception_lock);
                /* remove prefsrc entry */
        const struct arg_netdev_event *arg = p_arg;
        struct net *net = dev_net(arg->dev);
 
-       if (rt != net->ipv6.ip6_null_entry && rt->fib6_nh.nh_dev == arg->dev) {
+       if (rt != net->ipv6.fib6_null_entry && rt->fib6_nh.nh_dev == arg->dev) {
                rt->fib6_nh.nh_flags &= ~arg->nh_flags;
                fib6_update_sernum_upto_root(net, rt);
                rt6_multipath_rebalance(rt);
        const struct net_device *dev = arg->dev;
        struct net *net = dev_net(dev);
 
-       if (rt == net->ipv6.ip6_null_entry)
+       if (rt == net->ipv6.fib6_null_entry)
                return 0;
 
        switch (arg->event) {
        struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
        struct net *net = arg->net;
 
-       if (rt == net->ipv6.ip6_null_entry)
+       if (rt == net->ipv6.fib6_null_entry)
                return 0;
 
        if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) {
                return NOTIFY_OK;
 
        if (event == NETDEV_REGISTER) {
+               net->ipv6.fib6_null_entry->fib6_nh.nh_dev = dev;
+               net->ipv6.fib6_null_entry->rt6i_idev = in6_dev_get(dev);
                net->ipv6.ip6_null_entry->dst.dev = dev;
                net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev);
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
                /* NETDEV_UNREGISTER could be fired for multiple times by
                 * netdev_wait_allrefs(). Make sure we only call this once.
                 */
+               in6_dev_put_clear(&net->ipv6.fib6_null_entry->rt6i_idev);
                in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
                in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
        if (dst_entries_init(&net->ipv6.ip6_dst_ops) < 0)
                goto out_ip6_dst_ops;
 
+       net->ipv6.fib6_null_entry = kmemdup(&fib6_null_entry_template,
+                                           sizeof(*net->ipv6.fib6_null_entry),
+                                           GFP_KERNEL);
+       if (!net->ipv6.fib6_null_entry)
+               goto out_ip6_dst_entries;
+
        net->ipv6.ip6_null_entry = kmemdup(&ip6_null_entry_template,
                                           sizeof(*net->ipv6.ip6_null_entry),
                                           GFP_KERNEL);
        if (!net->ipv6.ip6_null_entry)
-               goto out_ip6_dst_entries;
+               goto out_fib6_null_entry;
        net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
        dst_init_metrics(&net->ipv6.ip6_null_entry->dst,
                         ip6_template_metrics, true);
 out_ip6_null_entry:
        kfree(net->ipv6.ip6_null_entry);
 #endif
+out_fib6_null_entry:
+       kfree(net->ipv6.fib6_null_entry);
 out_ip6_dst_entries:
        dst_entries_destroy(&net->ipv6.ip6_dst_ops);
 out_ip6_dst_ops:
 
 static void __net_exit ip6_route_net_exit(struct net *net)
 {
+       kfree(net->ipv6.fib6_null_entry);
        kfree(net->ipv6.ip6_null_entry);
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
        kfree(net->ipv6.ip6_prohibit_entry);
        /* Registering of the loopback is done before this portion of code,
         * the loopback reference in rt6_info will not be taken, do it
         * manually for init_net */
+       init_net.ipv6.fib6_null_entry->fib6_nh.nh_dev = init_net.loopback_dev;
+       init_net.ipv6.fib6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
        init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
        init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
   #ifdef CONFIG_IPV6_MULTIPLE_TABLES