ipv6: Rename fib6_nh entries
authorDavid Ahern <dsahern@gmail.com>
Thu, 28 Mar 2019 03:53:56 +0000 (20:53 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 29 Mar 2019 17:48:04 +0000 (10:48 -0700)
Rename fib6_nh entries that will be moved to a fib_nh_common struct.
Specifically, the device, gateway, flags, and lwtstate are common
with all nexthop definitions. In some places new temporary variables
are declared or local variables renamed to maintain line lengths.

Rename only; no functional change intended.

Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
include/net/ip6_fib.h
include/net/ip6_route.h
include/trace/events/fib6.h
net/core/filter.c
net/ipv6/addrconf.c
net/ipv6/ip6_fib.c
net/ipv6/ndisc.c
net/ipv6/route.c

index a18e1ae1c2f602c46902c6855d19559700d85a39..0ba9daa05a52194553cf607d27824b89809ec6de 100644 (file)
@@ -2873,12 +2873,13 @@ mlxsw_sp_nexthop6_group_cmp(const struct mlxsw_sp_nexthop_group *nh_grp,
                return false;
 
        list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
+               struct fib6_nh *fib6_nh = &mlxsw_sp_rt6->rt->fib6_nh;
                struct in6_addr *gw;
                int ifindex, weight;
 
-               ifindex = mlxsw_sp_rt6->rt->fib6_nh.nh_dev->ifindex;
-               weight = mlxsw_sp_rt6->rt->fib6_nh.nh_weight;
-               gw = &mlxsw_sp_rt6->rt->fib6_nh.nh_gw;
+               ifindex = fib6_nh->fib_nh_dev->ifindex;
+               weight = fib6_nh->fib_nh_weight;
+               gw = &fib6_nh->fib_nh_gw6;
                if (!mlxsw_sp_nexthop6_group_has_nexthop(nh_grp, gw, ifindex,
                                                         weight))
                        return false;
@@ -2944,7 +2945,7 @@ mlxsw_sp_nexthop6_group_hash(struct mlxsw_sp_fib6_entry *fib6_entry, u32 seed)
        struct net_device *dev;
 
        list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
-               dev = mlxsw_sp_rt6->rt->fib6_nh.nh_dev;
+               dev = mlxsw_sp_rt6->rt->fib6_nh.fib_nh_dev;
                val ^= dev->ifindex;
        }
 
@@ -3946,9 +3947,9 @@ mlxsw_sp_rt6_nexthop(struct mlxsw_sp_nexthop_group *nh_grp,
                struct mlxsw_sp_nexthop *nh = &nh_grp->nexthops[i];
                struct fib6_info *rt = mlxsw_sp_rt6->rt;
 
-               if (nh->rif && nh->rif->dev == rt->fib6_nh.nh_dev &&
+               if (nh->rif && nh->rif->dev == rt->fib6_nh.fib_nh_dev &&
                    ipv6_addr_equal((const struct in6_addr *) &nh->gw_addr,
-                                   &rt->fib6_nh.nh_gw))
+                                   &rt->fib6_nh.fib_nh_gw6))
                        return nh;
                continue;
        }
@@ -4008,19 +4009,20 @@ mlxsw_sp_fib6_entry_offload_set(struct mlxsw_sp_fib_entry *fib_entry)
        if (fib_entry->type == MLXSW_SP_FIB_ENTRY_TYPE_LOCAL ||
            fib_entry->type == MLXSW_SP_FIB_ENTRY_TYPE_BLACKHOLE) {
                list_first_entry(&fib6_entry->rt6_list, struct mlxsw_sp_rt6,
-                                list)->rt->fib6_nh.nh_flags |= RTNH_F_OFFLOAD;
+                                list)->rt->fib6_nh.fib_nh_flags |= RTNH_F_OFFLOAD;
                return;
        }
 
        list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
                struct mlxsw_sp_nexthop_group *nh_grp = fib_entry->nh_group;
+               struct fib6_nh *fib6_nh = &mlxsw_sp_rt6->rt->fib6_nh;
                struct mlxsw_sp_nexthop *nh;
 
                nh = mlxsw_sp_rt6_nexthop(nh_grp, mlxsw_sp_rt6);
                if (nh && nh->offloaded)
-                       mlxsw_sp_rt6->rt->fib6_nh.nh_flags |= RTNH_F_OFFLOAD;
+                       fib6_nh->fib_nh_flags |= RTNH_F_OFFLOAD;
                else
-                       mlxsw_sp_rt6->rt->fib6_nh.nh_flags &= ~RTNH_F_OFFLOAD;
+                       fib6_nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
        }
 }
 
@@ -4035,7 +4037,7 @@ mlxsw_sp_fib6_entry_offload_unset(struct mlxsw_sp_fib_entry *fib_entry)
        list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
                struct fib6_info *rt = mlxsw_sp_rt6->rt;
 
-               rt->fib6_nh.nh_flags &= ~RTNH_F_OFFLOAD;
+               rt->fib6_nh.fib_nh_flags &= ~RTNH_F_OFFLOAD;
        }
 }
 
@@ -4972,8 +4974,8 @@ static bool mlxsw_sp_nexthop6_ipip_type(const struct mlxsw_sp *mlxsw_sp,
                                        const struct fib6_info *rt,
                                        enum mlxsw_sp_ipip_type *ret)
 {
-       return rt->fib6_nh.nh_dev &&
-              mlxsw_sp_netdev_ipip_type(mlxsw_sp, rt->fib6_nh.nh_dev, ret);
+       return rt->fib6_nh.fib_nh_dev &&
+              mlxsw_sp_netdev_ipip_type(mlxsw_sp, rt->fib6_nh.fib_nh_dev, ret);
 }
 
 static int mlxsw_sp_nexthop6_type_init(struct mlxsw_sp *mlxsw_sp,
@@ -4983,7 +4985,7 @@ static int mlxsw_sp_nexthop6_type_init(struct mlxsw_sp *mlxsw_sp,
 {
        const struct mlxsw_sp_ipip_ops *ipip_ops;
        struct mlxsw_sp_ipip_entry *ipip_entry;
-       struct net_device *dev = rt->fib6_nh.nh_dev;
+       struct net_device *dev = rt->fib6_nh.fib_nh_dev;
        struct mlxsw_sp_rif *rif;
        int err;
 
@@ -5026,11 +5028,11 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,
                                  struct mlxsw_sp_nexthop *nh,
                                  const struct fib6_info *rt)
 {
-       struct net_device *dev = rt->fib6_nh.nh_dev;
+       struct net_device *dev = rt->fib6_nh.fib_nh_dev;
 
        nh->nh_grp = nh_grp;
-       nh->nh_weight = rt->fib6_nh.nh_weight;
-       memcpy(&nh->gw_addr, &rt->fib6_nh.nh_gw, sizeof(nh->gw_addr));
+       nh->nh_weight = rt->fib6_nh.fib_nh_weight;
+       memcpy(&nh->gw_addr, &rt->fib6_nh.fib_nh_gw6, sizeof(nh->gw_addr));
        mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh);
 
        list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list);
index 3b04b318cf13206dd29e63df1b4f1986b9b22cf0..aff8570725c8f6d1c3438d0772cac5abde87df56 100644 (file)
@@ -125,14 +125,14 @@ struct rt6_exception {
 #define FIB6_MAX_DEPTH 5
 
 struct fib6_nh {
-       struct in6_addr         nh_gw;
+       struct in6_addr         fib_nh_gw6;
        bool                    fib_nh_has_gw;
-       struct net_device       *nh_dev;
-       struct lwtunnel_state   *nh_lwtstate;
+       struct net_device       *fib_nh_dev;
+       struct lwtunnel_state   *fib_nh_lws;
 
-       unsigned int            nh_flags;
-       atomic_t                nh_upper_bound;
-       int                     nh_weight;
+       unsigned int            fib_nh_flags;
+       atomic_t                fib_nh_upper_bound;
+       int                     fib_nh_weight;
 };
 
 struct fib6_info {
@@ -442,7 +442,7 @@ void rt6_get_prefsrc(const struct rt6_info *rt, struct in6_addr *addr)
 
 static inline struct net_device *fib6_info_nh_dev(const struct fib6_info *f6i)
 {
-       return f6i->fib6_nh.nh_dev;
+       return f6i->fib6_nh.fib_nh_dev;
 }
 
 int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
@@ -453,7 +453,7 @@ void fib6_nh_release(struct fib6_nh *fib6_nh);
 static inline
 struct lwtunnel_state *fib6_info_nh_lwt(const struct fib6_info *f6i)
 {
-       return f6i->fib6_nh.nh_lwtstate;
+       return f6i->fib6_nh.fib_nh_lws;
 }
 
 void inet6_rt_notify(int event, struct fib6_info *rt, struct nl_info *info,
index 95cd8a2f628406b444235d4e5e07cb9fde556da7..342180a7285c8bf1b22f4b0d85db936aedb03df2 100644 (file)
@@ -274,9 +274,11 @@ static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt,
 
 static inline bool rt6_duplicate_nexthop(struct fib6_info *a, struct fib6_info *b)
 {
-       return a->fib6_nh.nh_dev == b->fib6_nh.nh_dev &&
-              ipv6_addr_equal(&a->fib6_nh.nh_gw, &b->fib6_nh.nh_gw) &&
-              !lwtunnel_cmp_encap(a->fib6_nh.nh_lwtstate, b->fib6_nh.nh_lwtstate);
+       struct fib6_nh *nha = &a->fib6_nh, *nhb = &b->fib6_nh;
+
+       return nha->fib_nh_dev == nhb->fib_nh_dev &&
+              ipv6_addr_equal(&nha->fib_nh_gw6, &nhb->fib_nh_gw6) &&
+              !lwtunnel_cmp_encap(nha->fib_nh_lws, nhb->fib_nh_lws);
 }
 
 static inline unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst)
index b088b54d699cedad66577fcadd34e7778032639f..6d05ebdd669ce79fbbaea9f871b10f5734848673 100644 (file)
@@ -62,8 +62,8 @@ TRACE_EVENT(fib6_table_lookup,
                        __entry->dport = 0;
                }
 
-               if (f6i->fib6_nh.nh_dev) {
-                       __assign_str(name, f6i->fib6_nh.nh_dev);
+               if (f6i->fib6_nh.fib_nh_dev) {
+                       __assign_str(name, f6i->fib6_nh.fib_nh_dev);
                } else {
                        __assign_str(name, "-");
                }
@@ -75,7 +75,7 @@ TRACE_EVENT(fib6_table_lookup,
 
                } else if (f6i) {
                        in6 = (struct in6_addr *)__entry->gw;
-                       *in6 = f6i->fib6_nh.nh_gw;
+                       *in6 = f6i->fib6_nh.fib_nh_gw6;
                }
        ),
 
index 79d319c636ea6a5e8f6fdea1a1ad408072df2747..887ab073a0eaed249fc3385b7f5c43cffd3cfe44 100644 (file)
@@ -4748,13 +4748,13 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct bpf_fib_lookup *params,
                        return BPF_FIB_LKUP_RET_FRAG_NEEDED;
        }
 
-       if (f6i->fib6_nh.nh_lwtstate)
+       if (f6i->fib6_nh.fib_nh_lws)
                return BPF_FIB_LKUP_RET_UNSUPP_LWT;
 
        if (f6i->fib6_nh.fib_nh_has_gw)
-               *dst = f6i->fib6_nh.nh_gw;
+               *dst = f6i->fib6_nh.fib_nh_gw6;
 
-       dev = f6i->fib6_nh.nh_dev;
+       dev = f6i->fib6_nh.fib_nh_dev;
        params->rt_metric = f6i->fib6_metric;
 
        /* xdp and cls_bpf programs are run in RCU-bh so rcu_read_lock_bh is
index c5ac08fc6cc91aedb32605ee4edd47caffd223e7..2e8d1d2d8d3d50297466eb62c14b6c845bc8f655 100644 (file)
@@ -2419,7 +2419,7 @@ static struct fib6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
                goto out;
 
        for_each_fib6_node_rt_rcu(fn) {
-               if (rt->fib6_nh.nh_dev->ifindex != dev->ifindex)
+               if (rt->fib6_nh.fib_nh_dev->ifindex != dev->ifindex)
                        continue;
                if (no_gw && rt->fib6_nh.fib_nh_has_gw)
                        continue;
index 91ce84ecdb57b9466518c14e58bbfe7ed2a18d75..8c00609a1513f7ff247c6eb02d0e36822e6e861d 100644 (file)
@@ -2306,12 +2306,12 @@ static int ipv6_route_seq_show(struct seq_file *seq, void *v)
 #endif
        if (rt->fib6_nh.fib_nh_has_gw) {
                flags |= RTF_GATEWAY;
-               seq_printf(seq, "%pi6", &rt->fib6_nh.nh_gw);
+               seq_printf(seq, "%pi6", &rt->fib6_nh.fib_nh_gw6);
        } else {
                seq_puts(seq, "00000000000000000000000000000000");
        }
 
-       dev = rt->fib6_nh.nh_dev;
+       dev = rt->fib6_nh.fib_nh_dev;
        seq_printf(seq, " %08x %08x %08x %08x %8s\n",
                   rt->fib6_metric, atomic_read(&rt->fib6_ref), 0,
                   flags, dev ? dev->name : "");
index 659ecf4e4b3cfe8362d1bae95782cda551276611..66c8b294e02bbacbd673e84bfe8081e67281c1f8 100644 (file)
@@ -1276,8 +1276,8 @@ static void ndisc_router_discovery(struct sk_buff *skb)
        rt = rt6_get_dflt_router(net, &ipv6_hdr(skb)->saddr, skb->dev);
 
        if (rt) {
-               neigh = ip6_neigh_lookup(&rt->fib6_nh.nh_gw,
-                                        rt->fib6_nh.nh_dev, NULL,
+               neigh = ip6_neigh_lookup(&rt->fib6_nh.fib_nh_gw6,
+                                        rt->fib6_nh.fib_nh_dev, NULL,
                                          &ipv6_hdr(skb)->saddr);
                if (!neigh) {
                        ND_PRINTK(0, err,
@@ -1306,8 +1306,8 @@ static void ndisc_router_discovery(struct sk_buff *skb)
                        return;
                }
 
-               neigh = ip6_neigh_lookup(&rt->fib6_nh.nh_gw,
-                                        rt->fib6_nh.nh_dev, NULL,
+               neigh = ip6_neigh_lookup(&rt->fib6_nh.fib_nh_gw6,
+                                        rt->fib6_nh.fib_nh_dev, NULL,
                                          &ipv6_hdr(skb)->saddr);
                if (!neigh) {
                        ND_PRINTK(0, err,
index 681c7184e15767d00a7a1bb3fd9627218fa7413f..e4c2f8e434050b0a3b4d71d67a14b1e9dae00221 100644 (file)
@@ -441,14 +441,14 @@ struct fib6_info *fib6_multipath_select(const struct net *net,
        if (!fl6->mp_hash)
                fl6->mp_hash = rt6_multipath_hash(net, fl6, skb, NULL);
 
-       if (fl6->mp_hash <= atomic_read(&match->fib6_nh.nh_upper_bound))
+       if (fl6->mp_hash <= atomic_read(&match->fib6_nh.fib_nh_upper_bound))
                return match;
 
        list_for_each_entry_safe(sibling, next_sibling, &match->fib6_siblings,
                                 fib6_siblings) {
                int nh_upper_bound;
 
-               nh_upper_bound = atomic_read(&sibling->fib6_nh.nh_upper_bound);
+               nh_upper_bound = atomic_read(&sibling->fib6_nh.fib_nh_upper_bound);
                if (fl6->mp_hash > nh_upper_bound)
                        continue;
                if (rt6_score_route(sibling, oif, strict) < 0)
@@ -473,13 +473,13 @@ static inline struct fib6_info *rt6_device_match(struct net *net,
        struct fib6_info *sprt;
 
        if (!oif && ipv6_addr_any(saddr) &&
-           !(rt->fib6_nh.nh_flags & RTNH_F_DEAD))
+           !(rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD))
                return rt;
 
        for (sprt = rt; sprt; sprt = rcu_dereference(sprt->fib6_next)) {
-               const struct net_device *dev = sprt->fib6_nh.nh_dev;
+               const struct net_device *dev = sprt->fib6_nh.fib_nh_dev;
 
-               if (sprt->fib6_nh.nh_flags & RTNH_F_DEAD)
+               if (sprt->fib6_nh.fib_nh_flags & RTNH_F_DEAD)
                        continue;
 
                if (oif) {
@@ -495,7 +495,7 @@ static inline struct fib6_info *rt6_device_match(struct net *net,
        if (oif && flags & RT6_LOOKUP_F_IFACE)
                return net->ipv6.fib6_null_entry;
 
-       return rt->fib6_nh.nh_flags & RTNH_F_DEAD ? net->ipv6.fib6_null_entry : rt;
+       return rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD ? net->ipv6.fib6_null_entry : rt;
 }
 
 #ifdef CONFIG_IPV6_ROUTER_PREF
@@ -536,8 +536,8 @@ static void rt6_probe(struct fib6_info *rt)
        if (!rt || !rt->fib6_nh.fib_nh_has_gw)
                return;
 
-       nh_gw = &rt->fib6_nh.nh_gw;
-       dev = rt->fib6_nh.nh_dev;
+       nh_gw = &rt->fib6_nh.fib_nh_gw6;
+       dev = rt->fib6_nh.fib_nh_dev;
        rcu_read_lock_bh();
        idev = __in6_dev_get(dev);
        neigh = __ipv6_neigh_lookup_noref(dev, nh_gw);
@@ -582,7 +582,7 @@ static inline void rt6_probe(struct fib6_info *rt)
  */
 static inline int rt6_check_dev(struct fib6_info *rt, int oif)
 {
-       const struct net_device *dev = rt->fib6_nh.nh_dev;
+       const struct net_device *dev = rt->fib6_nh.fib_nh_dev;
 
        if (!oif || dev->ifindex == oif)
                return 2;
@@ -599,8 +599,8 @@ static inline enum rt6_nud_state rt6_check_neigh(struct fib6_info *rt)
                return RT6_NUD_SUCCEED;
 
        rcu_read_lock_bh();
-       neigh = __ipv6_neigh_lookup_noref(rt->fib6_nh.nh_dev,
-                                         &rt->fib6_nh.nh_gw);
+       neigh = __ipv6_neigh_lookup_noref(rt->fib6_nh.fib_nh_dev,
+                                         &rt->fib6_nh.fib_nh_gw6);
        if (neigh) {
                read_lock(&neigh->lock);
                if (neigh->nud_state & NUD_VALID)
@@ -646,11 +646,11 @@ static struct fib6_info *find_match(struct fib6_info *rt, int oif, int strict,
        int m;
        bool match_do_rr = false;
 
-       if (rt->fib6_nh.nh_flags & RTNH_F_DEAD)
+       if (rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD)
                goto out;
 
-       if (ip6_ignore_linkdown(rt->fib6_nh.nh_dev) &&
-           rt->fib6_nh.nh_flags & RTNH_F_LINKDOWN &&
+       if (ip6_ignore_linkdown(rt->fib6_nh.fib_nh_dev) &&
+           rt->fib6_nh.fib_nh_flags & RTNH_F_LINKDOWN &&
            !(strict & RT6_LOOKUP_F_IGNORE_LINKSTATE))
                goto out;
 
@@ -855,7 +855,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
 /* called with rcu_lock held */
 static struct net_device *ip6_rt_get_dev_rcu(struct fib6_info *rt)
 {
-       struct net_device *dev = rt->fib6_nh.nh_dev;
+       struct net_device *dev = rt->fib6_nh.fib_nh_dev;
 
        if (rt->fib6_flags & (RTF_LOCAL | RTF_ANYCAST)) {
                /* for copies of local routes, dst->dev needs to be the
@@ -949,8 +949,8 @@ static void ip6_rt_init_dst(struct rt6_info *rt, struct fib6_info *ort)
                rt->dst.input = ip6_forward;
        }
 
-       if (ort->fib6_nh.nh_lwtstate) {
-               rt->dst.lwtstate = lwtstate_get(ort->fib6_nh.nh_lwtstate);
+       if (ort->fib6_nh.fib_nh_lws) {
+               rt->dst.lwtstate = lwtstate_get(ort->fib6_nh.fib_nh_lws);
                lwtunnel_set_redirect(&rt->dst);
        }
 
@@ -976,7 +976,7 @@ static void ip6_rt_copy_init(struct rt6_info *rt, struct fib6_info *ort)
        rt->rt6i_idev = dev ? in6_dev_get(dev) : NULL;
        rt->rt6i_flags = ort->fib6_flags;
        if (ort->fib6_nh.fib_nh_has_gw) {
-               rt->rt6i_gateway = ort->fib6_nh.nh_gw;
+               rt->rt6i_gateway = ort->fib6_nh.fib_nh_gw6;
                rt->rt6i_flags |= RTF_GATEWAY;
        }
        rt6_set_from(rt, ort);
@@ -1023,7 +1023,7 @@ static bool ip6_hold_safe(struct net *net, struct rt6_info **prt)
 static struct rt6_info *ip6_create_rt_rcu(struct fib6_info *rt)
 {
        unsigned short flags = fib6_info_dst_flags(rt);
-       struct net_device *dev = rt->fib6_nh.nh_dev;
+       struct net_device *dev = rt->fib6_nh.fib_nh_dev;
        struct rt6_info *nrt;
 
        if (!fib6_info_hold_safe(rt))
@@ -1407,7 +1407,7 @@ static unsigned int fib6_mtu(const struct fib6_info *rt)
 
        mtu = min_t(unsigned int, mtu, IP6_MAX_MTU);
 
-       return mtu - lwtunnel_headroom(rt->fib6_nh.nh_lwtstate, mtu);
+       return mtu - lwtunnel_headroom(rt->fib6_nh.fib_nh_lws, mtu);
 }
 
 static int rt6_insert_exception(struct rt6_info *nrt,
@@ -2424,7 +2424,7 @@ static struct rt6_info *__ip6_route_redirect(struct net *net,
        fn = fib6_node_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
 restart:
        for_each_fib6_node_rt_rcu(fn) {
-               if (rt->fib6_nh.nh_flags & RTNH_F_DEAD)
+               if (rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD)
                        continue;
                if (fib6_check_expired(rt))
                        continue;
@@ -2432,14 +2432,14 @@ restart:
                        break;
                if (!rt->fib6_nh.fib_nh_has_gw)
                        continue;
-               if (fl6->flowi6_oif != rt->fib6_nh.nh_dev->ifindex)
+               if (fl6->flowi6_oif != rt->fib6_nh.fib_nh_dev->ifindex)
                        continue;
                /* rt_cache's gateway might be different from its 'parent'
                 * in the case of an ip redirect.
                 * So we keep searching in the exception table if the gateway
                 * is different.
                 */
-               if (!ipv6_addr_equal(&rdfl->gateway, &rt->fib6_nh.nh_gw)) {
+               if (!ipv6_addr_equal(&rdfl->gateway, &rt->fib6_nh.fib_nh_gw6)) {
                        rt_cache = rt6_find_cached_rt(rt,
                                                      &fl6->daddr,
                                                      &fl6->saddr);
@@ -2929,7 +2929,7 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
                        goto out;
                }
 
-               fib6_nh->nh_flags |= RTNH_F_ONLINK;
+               fib6_nh->fib_nh_flags |= RTNH_F_ONLINK;
        }
 
        if (cfg->fc_encap) {
@@ -2941,10 +2941,10 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
                if (err)
                        goto out;
 
-               fib6_nh->nh_lwtstate = lwtstate_get(lwtstate);
+               fib6_nh->fib_nh_lws = lwtstate_get(lwtstate);
        }
 
-       fib6_nh->nh_weight = 1;
+       fib6_nh->fib_nh_weight = 1;
 
        /* We cannot add true routes via loopback here,
         * they would result in kernel looping; promote them to reject routes
@@ -2973,7 +2973,7 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
                if (err)
                        goto out;
 
-               fib6_nh->nh_gw = cfg->fc_gateway;
+               fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
                fib6_nh->fib_nh_has_gw = 1;
        }
 
@@ -2995,18 +2995,18 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
 
        if (!(cfg->fc_flags & (RTF_LOCAL | RTF_ANYCAST)) &&
            !netif_carrier_ok(dev))
-               fib6_nh->nh_flags |= RTNH_F_LINKDOWN;
+               fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
 
 set_dev:
-       fib6_nh->nh_dev = dev;
+       fib6_nh->fib_nh_dev = dev;
        err = 0;
 out:
        if (idev)
                in6_dev_put(idev);
 
        if (err) {
-               lwtstate_put(fib6_nh->nh_lwtstate);
-               fib6_nh->nh_lwtstate = NULL;
+               lwtstate_put(fib6_nh->fib_nh_lws);
+               fib6_nh->fib_nh_lws = NULL;
                if (dev)
                        dev_put(dev);
        }
@@ -3016,10 +3016,10 @@ out:
 
 void fib6_nh_release(struct fib6_nh *fib6_nh)
 {
-       lwtstate_put(fib6_nh->nh_lwtstate);
+       lwtstate_put(fib6_nh->fib_nh_lws);
 
-       if (fib6_nh->nh_dev)
-               dev_put(fib6_nh->nh_dev);
+       if (fib6_nh->fib_nh_dev)
+               dev_put(fib6_nh->fib_nh_dev);
 }
 
 static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
@@ -3129,7 +3129,7 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
         * they would result in kernel looping; promote them to reject routes
         */
        addr_type = ipv6_addr_type(&cfg->fc_dst);
-       if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh.nh_dev, addr_type))
+       if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh.fib_nh_dev, addr_type))
                rt->fib6_flags = RTF_REJECT | RTF_NONEXTHOP;
 
        if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
@@ -3287,6 +3287,8 @@ static int ip6_route_del(struct fib6_config *cfg,
 
        if (fn) {
                for_each_fib6_node_rt_rcu(fn) {
+                       struct fib6_nh *nh;
+
                        if (cfg->fc_flags & RTF_CACHE) {
                                int rc;
 
@@ -3301,12 +3303,14 @@ static int ip6_route_del(struct fib6_config *cfg,
                                }
                                continue;
                        }
+
+                       nh = &rt->fib6_nh;
                        if (cfg->fc_ifindex &&
-                           (!rt->fib6_nh.nh_dev ||
-                            rt->fib6_nh.nh_dev->ifindex != cfg->fc_ifindex))
+                           (!nh->fib_nh_dev ||
+                            nh->fib_nh_dev->ifindex != cfg->fc_ifindex))
                                continue;
                        if (cfg->fc_flags & RTF_GATEWAY &&
-                           !ipv6_addr_equal(&cfg->fc_gateway, &rt->fib6_nh.nh_gw))
+                           !ipv6_addr_equal(&cfg->fc_gateway, &nh->fib_nh_gw6))
                                continue;
                        if (cfg->fc_metric && cfg->fc_metric != rt->fib6_metric)
                                continue;
@@ -3477,12 +3481,12 @@ static struct fib6_info *rt6_get_route_info(struct net *net,
                goto out;
 
        for_each_fib6_node_rt_rcu(fn) {
-               if (rt->fib6_nh.nh_dev->ifindex != ifindex)
+               if (rt->fib6_nh.fib_nh_dev->ifindex != ifindex)
                        continue;
                if (!(rt->fib6_flags & RTF_ROUTEINFO) ||
                    !rt->fib6_nh.fib_nh_has_gw)
                        continue;
-               if (!ipv6_addr_equal(&rt->fib6_nh.nh_gw, gwaddr))
+               if (!ipv6_addr_equal(&rt->fib6_nh.fib_nh_gw6, gwaddr))
                        continue;
                if (!fib6_info_hold_safe(rt))
                        continue;
@@ -3540,9 +3544,11 @@ struct fib6_info *rt6_get_dflt_router(struct net *net,
 
        rcu_read_lock();
        for_each_fib6_node_rt_rcu(&table->tb6_root) {
-               if (dev == rt->fib6_nh.nh_dev &&
+               struct fib6_nh *nh = &rt->fib6_nh;
+
+               if (dev == nh->fib_nh_dev &&
                    ((rt->fib6_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
-                   ipv6_addr_equal(&rt->fib6_nh.nh_gw, addr))
+                   ipv6_addr_equal(&nh->fib_nh_gw6, addr))
                        break;
        }
        if (rt && !fib6_info_hold_safe(rt))
@@ -3779,7 +3785,7 @@ static int fib6_remove_prefsrc(struct fib6_info *rt, void *arg)
        struct net *net = ((struct arg_dev_net_ip *)arg)->net;
        struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
 
-       if (((void *)rt->fib6_nh.nh_dev == dev || !dev) &&
+       if (((void *)rt->fib6_nh.fib_nh_dev == dev || !dev) &&
            rt != net->ipv6.fib6_null_entry &&
            ipv6_addr_equal(addr, &rt->fib6_prefsrc.addr)) {
                spin_lock_bh(&rt6_exception_lock);
@@ -3810,7 +3816,7 @@ static int fib6_clean_tohost(struct fib6_info *rt, void *arg)
 
        if (((rt->fib6_flags & RTF_RA_ROUTER) == RTF_RA_ROUTER) &&
            rt->fib6_nh.fib_nh_has_gw &&
-           ipv6_addr_equal(gateway, &rt->fib6_nh.nh_gw)) {
+           ipv6_addr_equal(gateway, &rt->fib6_nh.fib_nh_gw6)) {
                return -1;
        }
 
@@ -3858,9 +3864,9 @@ static struct fib6_info *rt6_multipath_first_sibling(const struct fib6_info *rt)
 
 static bool rt6_is_dead(const struct fib6_info *rt)
 {
-       if (rt->fib6_nh.nh_flags & RTNH_F_DEAD ||
-           (rt->fib6_nh.nh_flags & RTNH_F_LINKDOWN &&
-            ip6_ignore_linkdown(rt->fib6_nh.nh_dev)))
+       if (rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD ||
+           (rt->fib6_nh.fib_nh_flags & RTNH_F_LINKDOWN &&
+            ip6_ignore_linkdown(rt->fib6_nh.fib_nh_dev)))
                return true;
 
        return false;
@@ -3872,11 +3878,11 @@ static int rt6_multipath_total_weight(const struct fib6_info *rt)
        int total = 0;
 
        if (!rt6_is_dead(rt))
-               total += rt->fib6_nh.nh_weight;
+               total += rt->fib6_nh.fib_nh_weight;
 
        list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings) {
                if (!rt6_is_dead(iter))
-                       total += iter->fib6_nh.nh_weight;
+                       total += iter->fib6_nh.fib_nh_weight;
        }
 
        return total;
@@ -3887,11 +3893,11 @@ static void rt6_upper_bound_set(struct fib6_info *rt, int *weight, int total)
        int upper_bound = -1;
 
        if (!rt6_is_dead(rt)) {
-               *weight += rt->fib6_nh.nh_weight;
+               *weight += rt->fib6_nh.fib_nh_weight;
                upper_bound = DIV_ROUND_CLOSEST_ULL((u64) (*weight) << 31,
                                                    total) - 1;
        }
-       atomic_set(&rt->fib6_nh.nh_upper_bound, upper_bound);
+       atomic_set(&rt->fib6_nh.fib_nh_upper_bound, upper_bound);
 }
 
 static void rt6_multipath_upper_bound_set(struct fib6_info *rt, int total)
@@ -3934,8 +3940,9 @@ static int fib6_ifup(struct fib6_info *rt, void *p_arg)
        const struct arg_netdev_event *arg = p_arg;
        struct net *net = dev_net(arg->dev);
 
-       if (rt != net->ipv6.fib6_null_entry && rt->fib6_nh.nh_dev == arg->dev) {
-               rt->fib6_nh.nh_flags &= ~arg->nh_flags;
+       if (rt != net->ipv6.fib6_null_entry &&
+           rt->fib6_nh.fib_nh_dev == arg->dev) {
+               rt->fib6_nh.fib_nh_flags &= ~arg->nh_flags;
                fib6_update_sernum_upto_root(net, rt);
                rt6_multipath_rebalance(rt);
        }
@@ -3963,10 +3970,10 @@ static bool rt6_multipath_uses_dev(const struct fib6_info *rt,
 {
        struct fib6_info *iter;
 
-       if (rt->fib6_nh.nh_dev == dev)
+       if (rt->fib6_nh.fib_nh_dev == dev)
                return true;
        list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
-               if (iter->fib6_nh.nh_dev == dev)
+               if (iter->fib6_nh.fib_nh_dev == dev)
                        return true;
 
        return false;
@@ -3987,12 +3994,12 @@ static unsigned int rt6_multipath_dead_count(const struct fib6_info *rt,
        struct fib6_info *iter;
        unsigned int dead = 0;
 
-       if (rt->fib6_nh.nh_dev == down_dev ||
-           rt->fib6_nh.nh_flags & RTNH_F_DEAD)
+       if (rt->fib6_nh.fib_nh_dev == down_dev ||
+           rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD)
                dead++;
        list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
-               if (iter->fib6_nh.nh_dev == down_dev ||
-                   iter->fib6_nh.nh_flags & RTNH_F_DEAD)
+               if (iter->fib6_nh.fib_nh_dev == down_dev ||
+                   iter->fib6_nh.fib_nh_flags & RTNH_F_DEAD)
                        dead++;
 
        return dead;
@@ -4004,11 +4011,11 @@ static void rt6_multipath_nh_flags_set(struct fib6_info *rt,
 {
        struct fib6_info *iter;
 
-       if (rt->fib6_nh.nh_dev == dev)
-               rt->fib6_nh.nh_flags |= nh_flags;
+       if (rt->fib6_nh.fib_nh_dev == dev)
+               rt->fib6_nh.fib_nh_flags |= nh_flags;
        list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
-               if (iter->fib6_nh.nh_dev == dev)
-                       iter->fib6_nh.nh_flags |= nh_flags;
+               if (iter->fib6_nh.fib_nh_dev == dev)
+                       iter->fib6_nh.fib_nh_flags |= nh_flags;
 }
 
 /* called with write lock held for table with rt */
@@ -4023,12 +4030,12 @@ static int fib6_ifdown(struct fib6_info *rt, void *p_arg)
 
        switch (arg->event) {
        case NETDEV_UNREGISTER:
-               return rt->fib6_nh.nh_dev == dev ? -1 : 0;
+               return rt->fib6_nh.fib_nh_dev == dev ? -1 : 0;
        case NETDEV_DOWN:
                if (rt->should_flush)
                        return -1;
                if (!rt->fib6_nsiblings)
-                       return rt->fib6_nh.nh_dev == dev ? -1 : 0;
+                       return rt->fib6_nh.fib_nh_dev == dev ? -1 : 0;
                if (rt6_multipath_uses_dev(rt, dev)) {
                        unsigned int count;
 
@@ -4044,10 +4051,10 @@ static int fib6_ifdown(struct fib6_info *rt, void *p_arg)
                }
                return -2;
        case NETDEV_CHANGE:
-               if (rt->fib6_nh.nh_dev != dev ||
+               if (rt->fib6_nh.fib_nh_dev != dev ||
                    rt->fib6_flags & (RTF_LOCAL | RTF_ANYCAST))
                        break;
-               rt->fib6_nh.nh_flags |= RTNH_F_LINKDOWN;
+               rt->fib6_nh.fib_nh_flags |= RTNH_F_LINKDOWN;
                rt6_multipath_rebalance(rt);
                break;
        }
@@ -4103,7 +4110,7 @@ static int rt6_mtu_change_route(struct fib6_info *rt, void *p_arg)
           Since RFC 1981 doesn't include administrative MTU increase
           update PMTU increase is a MUST. (i.e. jumbo frame)
         */
-       if (rt->fib6_nh.nh_dev == arg->dev &&
+       if (rt->fib6_nh.fib_nh_dev == arg->dev &&
            !fib6_metric_locked(rt, RTAX_MTU)) {
                u32 mtu = rt->fib6_pmtu;
 
@@ -4394,7 +4401,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
                        goto cleanup;
                }
 
-               rt->fib6_nh.nh_weight = rtnh->rtnh_hops + 1;
+               rt->fib6_nh.fib_nh_weight = rtnh->rtnh_hops + 1;
 
                err = ip6_route_info_append(info->nl_net, &rt6_nh_list,
                                            rt, &r_cfg);
@@ -4561,7 +4568,7 @@ static size_t rt6_nlmsg_size(struct fib6_info *rt)
                nexthop_len = nla_total_size(0)  /* RTA_MULTIPATH */
                            + NLA_ALIGN(sizeof(struct rtnexthop))
                            + nla_total_size(16) /* RTA_GATEWAY */
-                           + lwtunnel_get_encap_size(rt->fib6_nh.nh_lwtstate);
+                           + lwtunnel_get_encap_size(rt->fib6_nh.fib_nh_lws);
 
                nexthop_len *= rt->fib6_nsiblings;
        }
@@ -4579,41 +4586,41 @@ static size_t rt6_nlmsg_size(struct fib6_info *rt)
               + nla_total_size(sizeof(struct rta_cacheinfo))
               + nla_total_size(TCP_CA_NAME_MAX) /* RTAX_CC_ALGO */
               + nla_total_size(1) /* RTA_PREF */
-              + lwtunnel_get_encap_size(rt->fib6_nh.nh_lwtstate)
+              + lwtunnel_get_encap_size(rt->fib6_nh.fib_nh_lws)
               + nexthop_len;
 }
 
 static int rt6_nexthop_info(struct sk_buff *skb, const struct fib6_nh *fib6_nh,
                            unsigned int *flags, bool skip_oif)
 {
-       if (fib6_nh->nh_flags & RTNH_F_DEAD)
+       if (fib6_nh->fib_nh_flags & RTNH_F_DEAD)
                *flags |= RTNH_F_DEAD;
 
-       if (fib6_nh->nh_flags & RTNH_F_LINKDOWN) {
+       if (fib6_nh->fib_nh_flags & RTNH_F_LINKDOWN) {
                *flags |= RTNH_F_LINKDOWN;
 
                rcu_read_lock();
-               if (ip6_ignore_linkdown(fib6_nh->nh_dev))
+               if (ip6_ignore_linkdown(fib6_nh->fib_nh_dev))
                        *flags |= RTNH_F_DEAD;
                rcu_read_unlock();
        }
 
        if (fib6_nh->fib_nh_has_gw) {
-               if (nla_put_in6_addr(skb, RTA_GATEWAY, &fib6_nh->nh_gw) < 0)
+               if (nla_put_in6_addr(skb, RTA_GATEWAY, &fib6_nh->fib_nh_gw6) < 0)
                        goto nla_put_failure;
        }
 
-       *flags |= (fib6_nh->nh_flags & RTNH_F_ONLINK);
-       if (fib6_nh->nh_flags & RTNH_F_OFFLOAD)
+       *flags |= (fib6_nh->fib_nh_flags & RTNH_F_ONLINK);
+       if (fib6_nh->fib_nh_flags & RTNH_F_OFFLOAD)
                *flags |= RTNH_F_OFFLOAD;
 
        /* not needed for multipath encoding b/c it has a rtnexthop struct */
-       if (!skip_oif && fib6_nh->nh_dev &&
-           nla_put_u32(skb, RTA_OIF, fib6_nh->nh_dev->ifindex))
+       if (!skip_oif && fib6_nh->fib_nh_dev &&
+           nla_put_u32(skb, RTA_OIF, fib6_nh->fib_nh_dev->ifindex))
                goto nla_put_failure;
 
-       if (fib6_nh->nh_lwtstate &&
-           lwtunnel_fill_encap(skb, fib6_nh->nh_lwtstate) < 0)
+       if (fib6_nh->fib_nh_lws &&
+           lwtunnel_fill_encap(skb, fib6_nh->fib_nh_lws) < 0)
                goto nla_put_failure;
 
        return 0;
@@ -4625,7 +4632,7 @@ nla_put_failure:
 /* add multipath next hop */
 static int rt6_add_nexthop(struct sk_buff *skb, const struct fib6_nh *fib6_nh)
 {
-       const struct net_device *dev = fib6_nh->nh_dev;
+       const struct net_device *dev = fib6_nh->fib_nh_dev;
        struct rtnexthop *rtnh;
        unsigned int flags = 0;
 
@@ -4633,7 +4640,7 @@ static int rt6_add_nexthop(struct sk_buff *skb, const struct fib6_nh *fib6_nh)
        if (!rtnh)
                goto nla_put_failure;
 
-       rtnh->rtnh_hops = fib6_nh->nh_weight - 1;
+       rtnh->rtnh_hops = fib6_nh->fib_nh_weight - 1;
        rtnh->rtnh_ifindex = dev ? dev->ifindex : 0;
 
        if (rt6_nexthop_info(skb, fib6_nh, &flags, true) < 0)
@@ -4805,7 +4812,7 @@ nla_put_failure:
 static bool fib6_info_uses_dev(const struct fib6_info *f6i,
                               const struct net_device *dev)
 {
-       if (f6i->fib6_nh.nh_dev == dev)
+       if (f6i->fib6_nh.fib_nh_dev == dev)
                return true;
 
        if (f6i->fib6_nsiblings) {
@@ -4813,7 +4820,7 @@ static bool fib6_info_uses_dev(const struct fib6_info *f6i,
 
                list_for_each_entry_safe(sibling, next_sibling,
                                         &f6i->fib6_siblings, fib6_siblings) {
-                       if (sibling->fib6_nh.nh_dev == dev)
+                       if (sibling->fib6_nh.fib_nh_dev == dev)
                                return true;
                }
        }
@@ -5098,7 +5105,7 @@ static int ip6_route_dev_notify(struct notifier_block *this,
                return NOTIFY_OK;
 
        if (event == NETDEV_REGISTER) {
-               net->ipv6.fib6_null_entry->fib6_nh.nh_dev = dev;
+               net->ipv6.fib6_null_entry->fib6_nh.fib_nh_dev = 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
@@ -5433,7 +5440,7 @@ void __init ip6_route_init_special_entries(void)
        /* 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->fib6_nh.fib_nh_dev = 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