Commit 02d8fdca authored by Ido Schimmel's avatar Ido Schimmel Committed by Jakub Kicinski

mlxsw: spectrum_router: Associate neighbour table with nexthop instead of group

As explained in the previous patch, nexthop objects can have both IPv4
and IPv6 nexthops in the same group. Therefore, move the neighbour table
to be a property of the nexthop instead of the nexthop group.
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarJiri Pirko <jiri@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 1664dd3d
...@@ -2835,6 +2835,7 @@ struct mlxsw_sp_nexthop { ...@@ -2835,6 +2835,7 @@ struct mlxsw_sp_nexthop {
* this belongs to * this belongs to
*/ */
struct rhash_head ht_node; struct rhash_head ht_node;
struct neigh_table *neigh_tbl;
struct mlxsw_sp_nexthop_key key; struct mlxsw_sp_nexthop_key key;
unsigned char gw_addr[sizeof(struct in6_addr)]; unsigned char gw_addr[sizeof(struct in6_addr)];
int ifindex; int ifindex;
...@@ -2869,7 +2870,6 @@ struct mlxsw_sp_nexthop_group { ...@@ -2869,7 +2870,6 @@ struct mlxsw_sp_nexthop_group {
void *priv; void *priv;
struct rhash_head ht_node; struct rhash_head ht_node;
struct list_head fib_list; /* list of fib entries that use this group */ struct list_head fib_list; /* list of fib entries that use this group */
struct neigh_table *neigh_tbl;
enum mlxsw_sp_nexthop_group_type type; enum mlxsw_sp_nexthop_group_type type;
u8 adj_index_valid:1, u8 adj_index_valid:1,
gateway:1; /* routes using the group use a gateway */ gateway:1; /* routes using the group use a gateway */
...@@ -3674,10 +3674,9 @@ mlxsw_sp_nexthop_dead_neigh_replace(struct mlxsw_sp *mlxsw_sp, ...@@ -3674,10 +3674,9 @@ mlxsw_sp_nexthop_dead_neigh_replace(struct mlxsw_sp *mlxsw_sp,
nh = list_first_entry(&neigh_entry->nexthop_list, nh = list_first_entry(&neigh_entry->nexthop_list,
struct mlxsw_sp_nexthop, neigh_list_node); struct mlxsw_sp_nexthop, neigh_list_node);
n = neigh_lookup(nh->nh_grp->neigh_tbl, &nh->gw_addr, nh->rif->dev); n = neigh_lookup(nh->neigh_tbl, &nh->gw_addr, nh->rif->dev);
if (!n) { if (!n) {
n = neigh_create(nh->nh_grp->neigh_tbl, &nh->gw_addr, n = neigh_create(nh->neigh_tbl, &nh->gw_addr, nh->rif->dev);
nh->rif->dev);
if (IS_ERR(n)) if (IS_ERR(n))
return PTR_ERR(n); return PTR_ERR(n);
neigh_event_send(n, NULL); neigh_event_send(n, NULL);
...@@ -3776,10 +3775,9 @@ static int mlxsw_sp_nexthop_neigh_init(struct mlxsw_sp *mlxsw_sp, ...@@ -3776,10 +3775,9 @@ static int mlxsw_sp_nexthop_neigh_init(struct mlxsw_sp *mlxsw_sp,
* The reference is taken either in neigh_lookup() or * The reference is taken either in neigh_lookup() or
* in neigh_create() in case n is not found. * in neigh_create() in case n is not found.
*/ */
n = neigh_lookup(nh->nh_grp->neigh_tbl, &nh->gw_addr, nh->rif->dev); n = neigh_lookup(nh->neigh_tbl, &nh->gw_addr, nh->rif->dev);
if (!n) { if (!n) {
n = neigh_create(nh->nh_grp->neigh_tbl, &nh->gw_addr, n = neigh_create(nh->neigh_tbl, &nh->gw_addr, nh->rif->dev);
nh->rif->dev);
if (IS_ERR(n)) if (IS_ERR(n))
return PTR_ERR(n); return PTR_ERR(n);
neigh_event_send(n, NULL); neigh_event_send(n, NULL);
...@@ -3968,6 +3966,7 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp, ...@@ -3968,6 +3966,7 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,
nh->nh_weight = 1; nh->nh_weight = 1;
#endif #endif
memcpy(&nh->gw_addr, &fib_nh->fib_nh_gw4, sizeof(fib_nh->fib_nh_gw4)); memcpy(&nh->gw_addr, &fib_nh->fib_nh_gw4, sizeof(fib_nh->fib_nh_gw4));
nh->neigh_tbl = &arp_tbl;
err = mlxsw_sp_nexthop_insert(mlxsw_sp, nh); err = mlxsw_sp_nexthop_insert(mlxsw_sp, nh);
if (err) if (err)
return err; return err;
...@@ -4104,7 +4103,6 @@ mlxsw_sp_nexthop4_group_create(struct mlxsw_sp *mlxsw_sp, struct fib_info *fi) ...@@ -4104,7 +4103,6 @@ mlxsw_sp_nexthop4_group_create(struct mlxsw_sp *mlxsw_sp, struct fib_info *fi)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
nh_grp->priv = fi; nh_grp->priv = fi;
INIT_LIST_HEAD(&nh_grp->fib_list); INIT_LIST_HEAD(&nh_grp->fib_list);
nh_grp->neigh_tbl = &arp_tbl;
nh_grp->type = MLXSW_SP_NEXTHOP_GROUP_TYPE_IPV4; nh_grp->type = MLXSW_SP_NEXTHOP_GROUP_TYPE_IPV4;
nh_grp->gateway = mlxsw_sp_fi_is_gateway(mlxsw_sp, fi); nh_grp->gateway = mlxsw_sp_fi_is_gateway(mlxsw_sp, fi);
...@@ -5373,6 +5371,9 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp, ...@@ -5373,6 +5371,9 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,
nh->nh_grp = nh_grp; nh->nh_grp = nh_grp;
nh->nh_weight = rt->fib6_nh->fib_nh_weight; nh->nh_weight = rt->fib6_nh->fib_nh_weight;
memcpy(&nh->gw_addr, &rt->fib6_nh->fib_nh_gw6, sizeof(nh->gw_addr)); memcpy(&nh->gw_addr, &rt->fib6_nh->fib_nh_gw6, sizeof(nh->gw_addr));
#if IS_ENABLED(CONFIG_IPV6)
nh->neigh_tbl = &nd_tbl;
#endif
mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh);
list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list);
...@@ -5414,9 +5415,6 @@ mlxsw_sp_nexthop6_group_create(struct mlxsw_sp *mlxsw_sp, ...@@ -5414,9 +5415,6 @@ mlxsw_sp_nexthop6_group_create(struct mlxsw_sp *mlxsw_sp,
if (!nh_grp) if (!nh_grp)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
INIT_LIST_HEAD(&nh_grp->fib_list); INIT_LIST_HEAD(&nh_grp->fib_list);
#if IS_ENABLED(CONFIG_IPV6)
nh_grp->neigh_tbl = &nd_tbl;
#endif
nh_grp->type = MLXSW_SP_NEXTHOP_GROUP_TYPE_IPV6; nh_grp->type = MLXSW_SP_NEXTHOP_GROUP_TYPE_IPV6;
mlxsw_sp_rt6 = list_first_entry(&fib6_entry->rt6_list, mlxsw_sp_rt6 = list_first_entry(&fib6_entry->rt6_list,
struct mlxsw_sp_rt6, list); struct mlxsw_sp_rt6, list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment