mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-29 03:31:04 -04:00
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 <idosch@nvidia.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
2a014b200b
commit
c25db3a77f
@@ -4648,12 +4648,21 @@ static int mlxsw_sp_nexthop4_group_get(struct mlxsw_sp *mlxsw_sp,
|
||||
{
|
||||
struct mlxsw_sp_nexthop_group *nh_grp;
|
||||
|
||||
if (fi->nh) {
|
||||
nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp,
|
||||
fi->nh->id);
|
||||
if (WARN_ON_ONCE(!nh_grp))
|
||||
return -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
nh_grp = mlxsw_sp_nexthop4_group_lookup(mlxsw_sp, fi);
|
||||
if (!nh_grp) {
|
||||
nh_grp = mlxsw_sp_nexthop4_group_create(mlxsw_sp, fi);
|
||||
if (IS_ERR(nh_grp))
|
||||
return PTR_ERR(nh_grp);
|
||||
}
|
||||
out:
|
||||
list_add_tail(&fib_entry->nexthop_group_node, &nh_grp->fib_list);
|
||||
fib_entry->nh_group = nh_grp;
|
||||
return 0;
|
||||
@@ -4667,6 +4676,12 @@ static void mlxsw_sp_nexthop4_group_put(struct mlxsw_sp *mlxsw_sp,
|
||||
list_del(&fib_entry->nexthop_group_node);
|
||||
if (!list_empty(&nh_grp->fib_list))
|
||||
return;
|
||||
|
||||
if (nh_grp->type == MLXSW_SP_NEXTHOP_GROUP_TYPE_OBJ) {
|
||||
mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
|
||||
return;
|
||||
}
|
||||
|
||||
mlxsw_sp_nexthop4_group_destroy(mlxsw_sp, nh_grp);
|
||||
}
|
||||
|
||||
@@ -5957,8 +5972,17 @@ mlxsw_sp_nexthop6_group_destroy(struct mlxsw_sp *mlxsw_sp,
|
||||
static int mlxsw_sp_nexthop6_group_get(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_fib6_entry *fib6_entry)
|
||||
{
|
||||
struct fib6_info *rt = mlxsw_sp_fib6_entry_rt(fib6_entry);
|
||||
struct mlxsw_sp_nexthop_group *nh_grp;
|
||||
|
||||
if (rt->nh) {
|
||||
nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp,
|
||||
rt->nh->id);
|
||||
if (WARN_ON_ONCE(!nh_grp))
|
||||
return -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
nh_grp = mlxsw_sp_nexthop6_group_lookup(mlxsw_sp, fib6_entry);
|
||||
if (!nh_grp) {
|
||||
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,
|
||||
*/
|
||||
__mlxsw_sp_nexthop6_group_offload_refresh(nh_grp, fib6_entry);
|
||||
|
||||
out:
|
||||
list_add_tail(&fib6_entry->common.nexthop_group_node,
|
||||
&nh_grp->fib_list);
|
||||
fib6_entry->common.nh_group = nh_grp;
|
||||
@@ -5986,6 +6011,12 @@ static void mlxsw_sp_nexthop6_group_put(struct mlxsw_sp *mlxsw_sp,
|
||||
list_del(&fib_entry->nexthop_group_node);
|
||||
if (!list_empty(&nh_grp->fib_list))
|
||||
return;
|
||||
|
||||
if (nh_grp->type == MLXSW_SP_NEXTHOP_GROUP_TYPE_OBJ) {
|
||||
mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
|
||||
return;
|
||||
}
|
||||
|
||||
mlxsw_sp_nexthop6_group_destroy(mlxsw_sp, nh_grp);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user