|
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