Skip to content

Commit 5e670d8

Browse files
dsaherndavem330
authored andcommitted
net/ipv6: Move nexthop data to fib6_nh
Introduce fib6_nh structure and move nexthop related data from rt6_info and rt6_info.dst to fib6_nh. References to dev, gateway or lwtstate from a FIB lookup perspective are converted to use fib6_nh; datapath references to dst version are left as is. Signed-off-by: David Ahern <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e8478e8 commit 5e670d8

File tree

6 files changed

+125
-99
lines changed

6 files changed

+125
-99
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2770,9 +2770,9 @@ mlxsw_sp_nexthop6_group_cmp(const struct mlxsw_sp_nexthop_group *nh_grp,
27702770
struct in6_addr *gw;
27712771
int ifindex, weight;
27722772

2773-
ifindex = mlxsw_sp_rt6->rt->dst.dev->ifindex;
2774-
weight = mlxsw_sp_rt6->rt->rt6i_nh_weight;
2775-
gw = &mlxsw_sp_rt6->rt->rt6i_gateway;
2773+
ifindex = mlxsw_sp_rt6->rt->fib6_nh.nh_dev->ifindex;
2774+
weight = mlxsw_sp_rt6->rt->fib6_nh.nh_weight;
2775+
gw = &mlxsw_sp_rt6->rt->fib6_nh.nh_gw;
27762776
if (!mlxsw_sp_nexthop6_group_has_nexthop(nh_grp, gw, ifindex,
27772777
weight))
27782778
return false;
@@ -2838,7 +2838,7 @@ mlxsw_sp_nexthop6_group_hash(struct mlxsw_sp_fib6_entry *fib6_entry, u32 seed)
28382838
struct net_device *dev;
28392839

28402840
list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
2841-
dev = mlxsw_sp_rt6->rt->dst.dev;
2841+
dev = mlxsw_sp_rt6->rt->fib6_nh.nh_dev;
28422842
val ^= dev->ifindex;
28432843
}
28442844

@@ -3836,9 +3836,9 @@ mlxsw_sp_rt6_nexthop(struct mlxsw_sp_nexthop_group *nh_grp,
38363836
struct mlxsw_sp_nexthop *nh = &nh_grp->nexthops[i];
38373837
struct rt6_info *rt = mlxsw_sp_rt6->rt;
38383838

3839-
if (nh->rif && nh->rif->dev == rt->dst.dev &&
3839+
if (nh->rif && nh->rif->dev == rt->fib6_nh.nh_dev &&
38403840
ipv6_addr_equal((const struct in6_addr *) &nh->gw_addr,
3841-
&rt->rt6i_gateway))
3841+
&rt->fib6_nh.nh_gw))
38423842
return nh;
38433843
continue;
38443844
}
@@ -3895,7 +3895,7 @@ mlxsw_sp_fib6_entry_offload_set(struct mlxsw_sp_fib_entry *fib_entry)
38953895

38963896
if (fib_entry->type == MLXSW_SP_FIB_ENTRY_TYPE_LOCAL) {
38973897
list_first_entry(&fib6_entry->rt6_list, struct mlxsw_sp_rt6,
3898-
list)->rt->rt6i_nh_flags |= RTNH_F_OFFLOAD;
3898+
list)->rt->fib6_nh.nh_flags |= RTNH_F_OFFLOAD;
38993899
return;
39003900
}
39013901

@@ -3905,9 +3905,9 @@ mlxsw_sp_fib6_entry_offload_set(struct mlxsw_sp_fib_entry *fib_entry)
39053905

39063906
nh = mlxsw_sp_rt6_nexthop(nh_grp, mlxsw_sp_rt6);
39073907
if (nh && nh->offloaded)
3908-
mlxsw_sp_rt6->rt->rt6i_nh_flags |= RTNH_F_OFFLOAD;
3908+
mlxsw_sp_rt6->rt->fib6_nh.nh_flags |= RTNH_F_OFFLOAD;
39093909
else
3910-
mlxsw_sp_rt6->rt->rt6i_nh_flags &= ~RTNH_F_OFFLOAD;
3910+
mlxsw_sp_rt6->rt->fib6_nh.nh_flags &= ~RTNH_F_OFFLOAD;
39113911
}
39123912
}
39133913

@@ -3922,7 +3922,7 @@ mlxsw_sp_fib6_entry_offload_unset(struct mlxsw_sp_fib_entry *fib_entry)
39223922
list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
39233923
struct rt6_info *rt = mlxsw_sp_rt6->rt;
39243924

3925-
rt->rt6i_nh_flags &= ~RTNH_F_OFFLOAD;
3925+
rt->fib6_nh.nh_flags &= ~RTNH_F_OFFLOAD;
39263926
}
39273927
}
39283928

@@ -4818,8 +4818,8 @@ static bool mlxsw_sp_nexthop6_ipip_type(const struct mlxsw_sp *mlxsw_sp,
48184818
const struct rt6_info *rt,
48194819
enum mlxsw_sp_ipip_type *ret)
48204820
{
4821-
return rt->dst.dev &&
4822-
mlxsw_sp_netdev_ipip_type(mlxsw_sp, rt->dst.dev, ret);
4821+
return rt->fib6_nh.nh_dev &&
4822+
mlxsw_sp_netdev_ipip_type(mlxsw_sp, rt->fib6_nh.nh_dev, ret);
48234823
}
48244824

48254825
static int mlxsw_sp_nexthop6_type_init(struct mlxsw_sp *mlxsw_sp,
@@ -4829,7 +4829,7 @@ static int mlxsw_sp_nexthop6_type_init(struct mlxsw_sp *mlxsw_sp,
48294829
{
48304830
const struct mlxsw_sp_ipip_ops *ipip_ops;
48314831
struct mlxsw_sp_ipip_entry *ipip_entry;
4832-
struct net_device *dev = rt->dst.dev;
4832+
struct net_device *dev = rt->fib6_nh.nh_dev;
48334833
struct mlxsw_sp_rif *rif;
48344834
int err;
48354835

@@ -4872,11 +4872,11 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,
48724872
struct mlxsw_sp_nexthop *nh,
48734873
const struct rt6_info *rt)
48744874
{
4875-
struct net_device *dev = rt->dst.dev;
4875+
struct net_device *dev = rt->fib6_nh.nh_dev;
48764876

48774877
nh->nh_grp = nh_grp;
4878-
nh->nh_weight = rt->rt6i_nh_weight;
4879-
memcpy(&nh->gw_addr, &rt->rt6i_gateway, sizeof(nh->gw_addr));
4878+
nh->nh_weight = rt->fib6_nh.nh_weight;
4879+
memcpy(&nh->gw_addr, &rt->fib6_nh.nh_gw, sizeof(nh->gw_addr));
48804880
mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh);
48814881

48824882
list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list);

include/net/ip6_fib.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,16 @@ struct rt6_exception {
127127
#define FIB6_EXCEPTION_BUCKET_SIZE (1 << FIB6_EXCEPTION_BUCKET_SIZE_SHIFT)
128128
#define FIB6_MAX_DEPTH 5
129129

130+
struct fib6_nh {
131+
struct in6_addr nh_gw;
132+
struct net_device *nh_dev;
133+
struct lwtunnel_state *nh_lwtstate;
134+
135+
unsigned int nh_flags;
136+
atomic_t nh_upper_bound;
137+
int nh_weight;
138+
};
139+
130140
struct rt6_info {
131141
struct dst_entry dst;
132142
struct rt6_info __rcu *rt6_next;
@@ -149,12 +159,9 @@ struct rt6_info {
149159
*/
150160
struct list_head rt6i_siblings;
151161
unsigned int rt6i_nsiblings;
152-
atomic_t rt6i_nh_upper_bound;
153162

154163
atomic_t rt6i_ref;
155164

156-
unsigned int rt6i_nh_flags;
157-
158165
/* These are in a separate cache line. */
159166
struct rt6key rt6i_dst ____cacheline_aligned_in_smp;
160167
u32 rt6i_flags;
@@ -171,13 +178,14 @@ struct rt6_info {
171178
u32 rt6i_metric;
172179
u32 rt6i_pmtu;
173180
/* more non-fragment space at head required */
174-
int rt6i_nh_weight;
175181
unsigned short rt6i_nfheader_len;
176182
u8 rt6i_protocol;
177183
u8 fib6_type;
178184
u8 exception_bucket_flushed:1,
179185
should_flush:1,
180186
unused:6;
187+
188+
struct fib6_nh fib6_nh;
181189
};
182190

183191
#define for_each_fib6_node_rt_rcu(fn) \

include/net/ip6_route.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,10 +273,10 @@ static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt,
273273

274274
static inline bool rt6_duplicate_nexthop(struct rt6_info *a, struct rt6_info *b)
275275
{
276-
return a->dst.dev == b->dst.dev &&
276+
return a->fib6_nh.nh_dev == b->fib6_nh.nh_dev &&
277277
a->rt6i_idev == b->rt6i_idev &&
278-
ipv6_addr_equal(&a->rt6i_gateway, &b->rt6i_gateway) &&
279-
!lwtunnel_cmp_encap(a->dst.lwtstate, b->dst.lwtstate);
278+
ipv6_addr_equal(&a->fib6_nh.nh_gw, &b->fib6_nh.nh_gw) &&
279+
!lwtunnel_cmp_encap(a->fib6_nh.nh_lwtstate, b->fib6_nh.nh_lwtstate);
280280
}
281281

282282
#endif

net/ipv6/addrconf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2369,7 +2369,7 @@ static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
23692369
goto out;
23702370

23712371
for_each_fib6_node_rt_rcu(fn) {
2372-
if (rt->dst.dev->ifindex != dev->ifindex)
2372+
if (rt->fib6_nh.nh_dev->ifindex != dev->ifindex)
23732373
continue;
23742374
if ((rt->rt6i_flags & flags) != flags)
23752375
continue;

net/ipv6/ip6_fib.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2221,6 +2221,7 @@ static int ipv6_route_seq_show(struct seq_file *seq, void *v)
22212221
{
22222222
struct rt6_info *rt = v;
22232223
struct ipv6_route_iter *iter = seq->private;
2224+
const struct net_device *dev;
22242225

22252226
seq_printf(seq, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen);
22262227

@@ -2230,14 +2231,15 @@ static int ipv6_route_seq_show(struct seq_file *seq, void *v)
22302231
seq_puts(seq, "00000000000000000000000000000000 00 ");
22312232
#endif
22322233
if (rt->rt6i_flags & RTF_GATEWAY)
2233-
seq_printf(seq, "%pi6", &rt->rt6i_gateway);
2234+
seq_printf(seq, "%pi6", &rt->fib6_nh.nh_gw);
22342235
else
22352236
seq_puts(seq, "00000000000000000000000000000000");
22362237

2238+
dev = rt->fib6_nh.nh_dev;
22372239
seq_printf(seq, " %08x %08x %08x %08x %8s\n",
22382240
rt->rt6i_metric, atomic_read(&rt->dst.__refcnt),
22392241
rt->dst.__use, rt->rt6i_flags,
2240-
rt->dst.dev ? rt->dst.dev->name : "");
2242+
dev ? dev->name : "");
22412243
iter->w.leaf = NULL;
22422244
return 0;
22432245
}

0 commit comments

Comments
 (0)