@@ -4648,12 +4648,21 @@ static int mlxsw_sp_nexthop4_group_get(struct mlxsw_sp *mlxsw_sp,
4648
4648
{
4649
4649
struct mlxsw_sp_nexthop_group * nh_grp ;
4650
4650
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
+
4651
4659
nh_grp = mlxsw_sp_nexthop4_group_lookup (mlxsw_sp , fi );
4652
4660
if (!nh_grp ) {
4653
4661
nh_grp = mlxsw_sp_nexthop4_group_create (mlxsw_sp , fi );
4654
4662
if (IS_ERR (nh_grp ))
4655
4663
return PTR_ERR (nh_grp );
4656
4664
}
4665
+ out :
4657
4666
list_add_tail (& fib_entry -> nexthop_group_node , & nh_grp -> fib_list );
4658
4667
fib_entry -> nh_group = nh_grp ;
4659
4668
return 0 ;
@@ -4667,6 +4676,12 @@ static void mlxsw_sp_nexthop4_group_put(struct mlxsw_sp *mlxsw_sp,
4667
4676
list_del (& fib_entry -> nexthop_group_node );
4668
4677
if (!list_empty (& nh_grp -> fib_list ))
4669
4678
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
+
4670
4685
mlxsw_sp_nexthop4_group_destroy (mlxsw_sp , nh_grp );
4671
4686
}
4672
4687
@@ -5957,8 +5972,17 @@ mlxsw_sp_nexthop6_group_destroy(struct mlxsw_sp *mlxsw_sp,
5957
5972
static int mlxsw_sp_nexthop6_group_get (struct mlxsw_sp * mlxsw_sp ,
5958
5973
struct mlxsw_sp_fib6_entry * fib6_entry )
5959
5974
{
5975
+ struct fib6_info * rt = mlxsw_sp_fib6_entry_rt (fib6_entry );
5960
5976
struct mlxsw_sp_nexthop_group * nh_grp ;
5961
5977
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
+
5962
5986
nh_grp = mlxsw_sp_nexthop6_group_lookup (mlxsw_sp , fib6_entry );
5963
5987
if (!nh_grp ) {
5964
5988
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,
5971
5995
*/
5972
5996
__mlxsw_sp_nexthop6_group_offload_refresh (nh_grp , fib6_entry );
5973
5997
5998
+ out :
5974
5999
list_add_tail (& fib6_entry -> common .nexthop_group_node ,
5975
6000
& nh_grp -> fib_list );
5976
6001
fib6_entry -> common .nh_group = nh_grp ;
@@ -5986,6 +6011,12 @@ static void mlxsw_sp_nexthop6_group_put(struct mlxsw_sp *mlxsw_sp,
5986
6011
list_del (& fib_entry -> nexthop_group_node );
5987
6012
if (!list_empty (& nh_grp -> fib_list ))
5988
6013
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
+
5989
6020
mlxsw_sp_nexthop6_group_destroy (mlxsw_sp , nh_grp );
5990
6021
}
5991
6022
0 commit comments