|
6 | 6 | #include "helper.h" |
7 | 7 | #include "ofld.h" |
8 | 8 |
|
| 9 | +static int |
| 10 | +acl_ingress_ofld_setup(struct mlx5_eswitch *esw, struct mlx5_vport *vport); |
| 11 | + |
9 | 12 | static bool |
10 | 13 | esw_acl_ingress_prio_tag_enabled(struct mlx5_eswitch *esw, |
11 | 14 | const struct mlx5_vport *vport) |
@@ -123,18 +126,31 @@ static int esw_acl_ingress_src_port_drop_create(struct mlx5_eswitch *esw, |
123 | 126 | { |
124 | 127 | struct mlx5_flow_act flow_act = {}; |
125 | 128 | struct mlx5_flow_handle *flow_rule; |
| 129 | + bool created = false; |
126 | 130 | int err = 0; |
127 | 131 |
|
| 132 | + if (!vport->ingress.acl) { |
| 133 | + err = acl_ingress_ofld_setup(esw, vport); |
| 134 | + if (err) |
| 135 | + return err; |
| 136 | + created = true; |
| 137 | + } |
| 138 | + |
128 | 139 | flow_act.action = MLX5_FLOW_CONTEXT_ACTION_DROP; |
129 | 140 | flow_act.fg = vport->ingress.offloads.drop_grp; |
130 | 141 | flow_rule = mlx5_add_flow_rules(vport->ingress.acl, NULL, &flow_act, NULL, 0); |
131 | 142 | if (IS_ERR(flow_rule)) { |
132 | 143 | err = PTR_ERR(flow_rule); |
133 | | - goto out; |
| 144 | + goto err_out; |
134 | 145 | } |
135 | 146 |
|
136 | 147 | vport->ingress.offloads.drop_rule = flow_rule; |
137 | | -out: |
| 148 | + |
| 149 | + return 0; |
| 150 | +err_out: |
| 151 | + /* Only destroy ingress acl created in this function. */ |
| 152 | + if (created) |
| 153 | + esw_acl_ingress_ofld_cleanup(esw, vport); |
138 | 154 | return err; |
139 | 155 | } |
140 | 156 |
|
@@ -299,16 +315,12 @@ static void esw_acl_ingress_ofld_groups_destroy(struct mlx5_vport *vport) |
299 | 315 | } |
300 | 316 | } |
301 | 317 |
|
302 | | -int esw_acl_ingress_ofld_setup(struct mlx5_eswitch *esw, |
303 | | - struct mlx5_vport *vport) |
| 318 | +static int |
| 319 | +acl_ingress_ofld_setup(struct mlx5_eswitch *esw, struct mlx5_vport *vport) |
304 | 320 | { |
305 | 321 | int num_ftes = 0; |
306 | 322 | int err; |
307 | 323 |
|
308 | | - if (!mlx5_eswitch_vport_match_metadata_enabled(esw) && |
309 | | - !esw_acl_ingress_prio_tag_enabled(esw, vport)) |
310 | | - return 0; |
311 | | - |
312 | 324 | esw_acl_ingress_allow_rule_destroy(vport); |
313 | 325 |
|
314 | 326 | if (mlx5_eswitch_vport_match_metadata_enabled(esw)) |
@@ -347,6 +359,15 @@ int esw_acl_ingress_ofld_setup(struct mlx5_eswitch *esw, |
347 | 359 | return err; |
348 | 360 | } |
349 | 361 |
|
| 362 | +int esw_acl_ingress_ofld_setup(struct mlx5_eswitch *esw, struct mlx5_vport *vport) |
| 363 | +{ |
| 364 | + if (!mlx5_eswitch_vport_match_metadata_enabled(esw) && |
| 365 | + !esw_acl_ingress_prio_tag_enabled(esw, vport)) |
| 366 | + return 0; |
| 367 | + |
| 368 | + return acl_ingress_ofld_setup(esw, vport); |
| 369 | +} |
| 370 | + |
350 | 371 | void esw_acl_ingress_ofld_cleanup(struct mlx5_eswitch *esw, |
351 | 372 | struct mlx5_vport *vport) |
352 | 373 | { |
|
0 commit comments