Skip to content

Commit c25db3a

Browse files
idoschkuba-moo
authored andcommitted
mlxsw: spectrum_router: Enable resolution of nexthop groups from nexthop objects
If the FIB info (i.e, 'struct fib_info', 'struct fib6_info') uses a nexthop object, then use the object's identifier to resolve the nexthop group. Signed-off-by: Ido Schimmel <[email protected]> Reviewed-by: Jiri Pirko <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 2a014b2 commit c25db3a

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4648,12 +4648,21 @@ static int mlxsw_sp_nexthop4_group_get(struct mlxsw_sp *mlxsw_sp,
46484648
{
46494649
struct mlxsw_sp_nexthop_group *nh_grp;
46504650

4651+
if (fi->nh) {
4652+
nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp,
4653+
fi->nh->id);
4654+
if (WARN_ON_ONCE(!nh_grp))
4655+
return -EINVAL;
4656+
goto out;
4657+
}
4658+
46514659
nh_grp = mlxsw_sp_nexthop4_group_lookup(mlxsw_sp, fi);
46524660
if (!nh_grp) {
46534661
nh_grp = mlxsw_sp_nexthop4_group_create(mlxsw_sp, fi);
46544662
if (IS_ERR(nh_grp))
46554663
return PTR_ERR(nh_grp);
46564664
}
4665+
out:
46574666
list_add_tail(&fib_entry->nexthop_group_node, &nh_grp->fib_list);
46584667
fib_entry->nh_group = nh_grp;
46594668
return 0;
@@ -4667,6 +4676,12 @@ static void mlxsw_sp_nexthop4_group_put(struct mlxsw_sp *mlxsw_sp,
46674676
list_del(&fib_entry->nexthop_group_node);
46684677
if (!list_empty(&nh_grp->fib_list))
46694678
return;
4679+
4680+
if (nh_grp->type == MLXSW_SP_NEXTHOP_GROUP_TYPE_OBJ) {
4681+
mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
4682+
return;
4683+
}
4684+
46704685
mlxsw_sp_nexthop4_group_destroy(mlxsw_sp, nh_grp);
46714686
}
46724687

@@ -5957,8 +5972,17 @@ mlxsw_sp_nexthop6_group_destroy(struct mlxsw_sp *mlxsw_sp,
59575972
static int mlxsw_sp_nexthop6_group_get(struct mlxsw_sp *mlxsw_sp,
59585973
struct mlxsw_sp_fib6_entry *fib6_entry)
59595974
{
5975+
struct fib6_info *rt = mlxsw_sp_fib6_entry_rt(fib6_entry);
59605976
struct mlxsw_sp_nexthop_group *nh_grp;
59615977

5978+
if (rt->nh) {
5979+
nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp,
5980+
rt->nh->id);
5981+
if (WARN_ON_ONCE(!nh_grp))
5982+
return -EINVAL;
5983+
goto out;
5984+
}
5985+
59625986
nh_grp = mlxsw_sp_nexthop6_group_lookup(mlxsw_sp, fib6_entry);
59635987
if (!nh_grp) {
59645988
nh_grp = mlxsw_sp_nexthop6_group_create(mlxsw_sp, fib6_entry);
@@ -5971,6 +5995,7 @@ static int mlxsw_sp_nexthop6_group_get(struct mlxsw_sp *mlxsw_sp,
59715995
*/
59725996
__mlxsw_sp_nexthop6_group_offload_refresh(nh_grp, fib6_entry);
59735997

5998+
out:
59745999
list_add_tail(&fib6_entry->common.nexthop_group_node,
59756000
&nh_grp->fib_list);
59766001
fib6_entry->common.nh_group = nh_grp;
@@ -5986,6 +6011,12 @@ static void mlxsw_sp_nexthop6_group_put(struct mlxsw_sp *mlxsw_sp,
59866011
list_del(&fib_entry->nexthop_group_node);
59876012
if (!list_empty(&nh_grp->fib_list))
59886013
return;
6014+
6015+
if (nh_grp->type == MLXSW_SP_NEXTHOP_GROUP_TYPE_OBJ) {
6016+
mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
6017+
return;
6018+
}
6019+
59896020
mlxsw_sp_nexthop6_group_destroy(mlxsw_sp, nh_grp);
59906021
}
59916022

0 commit comments

Comments
 (0)