@@ -672,9 +672,9 @@ static void mlx5e_cleanup_ttc_rules(struct mlx5e_ttc_table *ttc)
672672 int i ;
673673
674674 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 ;
678678 }
679679 }
680680
@@ -857,7 +857,8 @@ static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv,
857857 struct mlx5e_ttc_table * ttc )
858858{
859859 struct mlx5_flow_destination dest = {};
860- struct mlx5_flow_handle * * rules ;
860+ struct mlx5_flow_handle * * trules ;
861+ struct mlx5e_ttc_rule * rules ;
861862 struct mlx5_flow_table * ft ;
862863 int tt ;
863864 int err ;
@@ -867,39 +868,47 @@ static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv,
867868
868869 dest .type = MLX5_FLOW_DESTINATION_TYPE_TIR ;
869870 for (tt = 0 ; tt < MLX5E_NUM_TT ; tt ++ ) {
871+ struct mlx5e_ttc_rule * rule = & rules [tt ];
872+
870873 if (tt == MLX5E_TT_ANY )
871874 dest .tir_num = params -> any_tt_tirn ;
872875 else
873876 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 ;
878884 goto del_rules ;
885+ }
886+ rule -> default_dest = dest ;
879887 }
880888
881889 if (!params -> inner_ttc || !mlx5e_tunnel_inner_ft_supported (priv -> mdev ))
882890 return 0 ;
883891
884- rules = ttc -> tunnel_rules ;
892+ trules = ttc -> tunnel_rules ;
885893 dest .type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE ;
886894 dest .ft = params -> inner_ttc -> ft .t ;
887895 for (tt = 0 ; tt < MLX5E_NUM_TUNNEL_TT ; tt ++ ) {
888896 if (!mlx5e_tunnel_proto_supported (priv -> mdev ,
889897 ttc_tunnel_rules [tt ].proto ))
890898 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 ;
895905 goto del_rules ;
906+ }
896907 }
897908
898909 return 0 ;
899910
900911del_rules :
901- err = PTR_ERR (rules [tt ]);
902- rules [tt ] = NULL ;
903912 mlx5e_cleanup_ttc_rules (ttc );
904913 return err ;
905914}
@@ -1015,33 +1024,38 @@ static int mlx5e_generate_inner_ttc_table_rules(struct mlx5e_priv *priv,
10151024 struct mlx5e_ttc_table * ttc )
10161025{
10171026 struct mlx5_flow_destination dest = {};
1018- struct mlx5_flow_handle * * rules ;
1027+ struct mlx5e_ttc_rule * rules ;
10191028 struct mlx5_flow_table * ft ;
10201029 int err ;
10211030 int tt ;
10221031
10231032 ft = ttc -> ft .t ;
10241033 rules = ttc -> rules ;
1025-
10261034 dest .type = MLX5_FLOW_DESTINATION_TYPE_TIR ;
1035+
10271036 for (tt = 0 ; tt < MLX5E_NUM_TT ; tt ++ ) {
1037+ struct mlx5e_ttc_rule * rule = & rules [tt ];
1038+
10281039 if (tt == MLX5E_TT_ANY )
10291040 dest .tir_num = params -> any_tt_tirn ;
10301041 else
10311042 dest .tir_num = params -> indir_tirn [tt ];
10321043
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 ;
10371050 goto del_rules ;
1051+ }
1052+ rule -> default_dest = dest ;
10381053 }
10391054
10401055 return 0 ;
10411056
10421057del_rules :
1043- err = PTR_ERR (rules [tt ]);
1044- rules [tt ] = NULL ;
1058+
10451059 mlx5e_cleanup_ttc_rules (ttc );
10461060 return err ;
10471061}
@@ -1210,6 +1224,30 @@ int mlx5e_create_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
12101224 return err ;
12111225}
12121226
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+
12131251static void mlx5e_del_l2_flow_rule (struct mlx5e_priv * priv ,
12141252 struct mlx5e_l2_rule * ai )
12151253{
0 commit comments