@@ -672,9 +672,9 @@ static void mlx5e_cleanup_ttc_rules(struct mlx5e_ttc_table *ttc)
672
672
int i ;
673
673
674
674
for (i = 0 ; i < MLX5E_NUM_TT ; i ++ ) {
675
- if (!IS_ERR_OR_NULL (ttc -> rules [i ])) {
676
- mlx5_del_flow_rules (ttc -> rules [i ]);
677
- ttc -> rules [i ] = NULL ;
675
+ if (!IS_ERR_OR_NULL (ttc -> rules [i ]. rule )) {
676
+ mlx5_del_flow_rules (ttc -> rules [i ]. rule );
677
+ ttc -> rules [i ]. rule = NULL ;
678
678
}
679
679
}
680
680
@@ -857,7 +857,8 @@ static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv,
857
857
struct mlx5e_ttc_table * ttc )
858
858
{
859
859
struct mlx5_flow_destination dest = {};
860
- struct mlx5_flow_handle * * rules ;
860
+ struct mlx5_flow_handle * * trules ;
861
+ struct mlx5e_ttc_rule * rules ;
861
862
struct mlx5_flow_table * ft ;
862
863
int tt ;
863
864
int err ;
@@ -867,39 +868,47 @@ static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv,
867
868
868
869
dest .type = MLX5_FLOW_DESTINATION_TYPE_TIR ;
869
870
for (tt = 0 ; tt < MLX5E_NUM_TT ; tt ++ ) {
871
+ struct mlx5e_ttc_rule * rule = & rules [tt ];
872
+
870
873
if (tt == MLX5E_TT_ANY )
871
874
dest .tir_num = params -> any_tt_tirn ;
872
875
else
873
876
dest .tir_num = params -> indir_tirn [tt ];
874
- rules [tt ] = mlx5e_generate_ttc_rule (priv , ft , & dest ,
875
- ttc_rules [tt ].etype ,
876
- ttc_rules [tt ].proto );
877
- if (IS_ERR (rules [tt ]))
877
+
878
+ rule -> rule = mlx5e_generate_ttc_rule (priv , ft , & dest ,
879
+ ttc_rules [tt ].etype ,
880
+ ttc_rules [tt ].proto );
881
+ if (IS_ERR (rule -> rule )) {
882
+ err = PTR_ERR (rule -> rule );
883
+ rule -> rule = NULL ;
878
884
goto del_rules ;
885
+ }
886
+ rule -> default_dest = dest ;
879
887
}
880
888
881
889
if (!params -> inner_ttc || !mlx5e_tunnel_inner_ft_supported (priv -> mdev ))
882
890
return 0 ;
883
891
884
- rules = ttc -> tunnel_rules ;
892
+ trules = ttc -> tunnel_rules ;
885
893
dest .type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE ;
886
894
dest .ft = params -> inner_ttc -> ft .t ;
887
895
for (tt = 0 ; tt < MLX5E_NUM_TUNNEL_TT ; tt ++ ) {
888
896
if (!mlx5e_tunnel_proto_supported (priv -> mdev ,
889
897
ttc_tunnel_rules [tt ].proto ))
890
898
continue ;
891
- rules [tt ] = mlx5e_generate_ttc_rule (priv , ft , & dest ,
892
- ttc_tunnel_rules [tt ].etype ,
893
- ttc_tunnel_rules [tt ].proto );
894
- if (IS_ERR (rules [tt ]))
899
+ trules [tt ] = mlx5e_generate_ttc_rule (priv , ft , & dest ,
900
+ ttc_tunnel_rules [tt ].etype ,
901
+ ttc_tunnel_rules [tt ].proto );
902
+ if (IS_ERR (trules [tt ])) {
903
+ err = PTR_ERR (trules [tt ]);
904
+ trules [tt ] = NULL ;
895
905
goto del_rules ;
906
+ }
896
907
}
897
908
898
909
return 0 ;
899
910
900
911
del_rules :
901
- err = PTR_ERR (rules [tt ]);
902
- rules [tt ] = NULL ;
903
912
mlx5e_cleanup_ttc_rules (ttc );
904
913
return err ;
905
914
}
@@ -1015,33 +1024,38 @@ static int mlx5e_generate_inner_ttc_table_rules(struct mlx5e_priv *priv,
1015
1024
struct mlx5e_ttc_table * ttc )
1016
1025
{
1017
1026
struct mlx5_flow_destination dest = {};
1018
- struct mlx5_flow_handle * * rules ;
1027
+ struct mlx5e_ttc_rule * rules ;
1019
1028
struct mlx5_flow_table * ft ;
1020
1029
int err ;
1021
1030
int tt ;
1022
1031
1023
1032
ft = ttc -> ft .t ;
1024
1033
rules = ttc -> rules ;
1025
-
1026
1034
dest .type = MLX5_FLOW_DESTINATION_TYPE_TIR ;
1035
+
1027
1036
for (tt = 0 ; tt < MLX5E_NUM_TT ; tt ++ ) {
1037
+ struct mlx5e_ttc_rule * rule = & rules [tt ];
1038
+
1028
1039
if (tt == MLX5E_TT_ANY )
1029
1040
dest .tir_num = params -> any_tt_tirn ;
1030
1041
else
1031
1042
dest .tir_num = params -> indir_tirn [tt ];
1032
1043
1033
- rules [tt ] = mlx5e_generate_inner_ttc_rule (priv , ft , & dest ,
1034
- ttc_rules [tt ].etype ,
1035
- ttc_rules [tt ].proto );
1036
- if (IS_ERR (rules [tt ]))
1044
+ rule -> rule = mlx5e_generate_inner_ttc_rule (priv , ft , & dest ,
1045
+ ttc_rules [tt ].etype ,
1046
+ ttc_rules [tt ].proto );
1047
+ if (IS_ERR (rule -> rule )) {
1048
+ err = PTR_ERR (rule -> rule );
1049
+ rule -> rule = NULL ;
1037
1050
goto del_rules ;
1051
+ }
1052
+ rule -> default_dest = dest ;
1038
1053
}
1039
1054
1040
1055
return 0 ;
1041
1056
1042
1057
del_rules :
1043
- err = PTR_ERR (rules [tt ]);
1044
- rules [tt ] = NULL ;
1058
+
1045
1059
mlx5e_cleanup_ttc_rules (ttc );
1046
1060
return err ;
1047
1061
}
@@ -1210,6 +1224,30 @@ int mlx5e_create_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
1210
1224
return err ;
1211
1225
}
1212
1226
1227
+ int mlx5e_ttc_fwd_dest (struct mlx5e_priv * priv , enum mlx5e_traffic_types type ,
1228
+ struct mlx5_flow_destination * new_dest )
1229
+ {
1230
+ return mlx5_modify_rule_destination (priv -> fs .ttc .rules [type ].rule , new_dest , NULL );
1231
+ }
1232
+
1233
+ struct mlx5_flow_destination
1234
+ mlx5e_ttc_get_default_dest (struct mlx5e_priv * priv , enum mlx5e_traffic_types type )
1235
+ {
1236
+ struct mlx5_flow_destination * dest = & priv -> fs .ttc .rules [type ].default_dest ;
1237
+
1238
+ WARN_ONCE (dest -> type != MLX5_FLOW_DESTINATION_TYPE_TIR ,
1239
+ "TTC[%d] default dest is not setup yet" , type );
1240
+
1241
+ return * dest ;
1242
+ }
1243
+
1244
+ int mlx5e_ttc_fwd_default_dest (struct mlx5e_priv * priv , enum mlx5e_traffic_types type )
1245
+ {
1246
+ struct mlx5_flow_destination dest = mlx5e_ttc_get_default_dest (priv , type );
1247
+
1248
+ return mlx5e_ttc_fwd_dest (priv , type , & dest );
1249
+ }
1250
+
1213
1251
static void mlx5e_del_l2_flow_rule (struct mlx5e_priv * priv ,
1214
1252
struct mlx5e_l2_rule * ai )
1215
1253
{
0 commit comments