[PATCH 17/34] net/sfc: move MAE flow parsing method to MAE-specific source
Ivan Malov
ivan.malov at arknetworks.am
Thu Jun 1 21:55:21 CEST 2023
Doing so will facilitate easier code restructure in the next
patches required to rework flow housekeeping and indirection.
Signed-off-by: Ivan Malov <ivan.malov at arknetworks.am>
Reviewed-by: Andy Moreton <amoreton at xilinx.com>
---
drivers/net/sfc/sfc_flow.c | 47 +-----------------------------
drivers/net/sfc/sfc_mae.c | 58 ++++++++++++++++++++++++++++++++++++--
drivers/net/sfc/sfc_mae.h | 14 ++++-----
3 files changed, 63 insertions(+), 56 deletions(-)
diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 94696afac0..821ac74dff 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -2395,53 +2395,8 @@ sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev,
struct rte_flow_error *error)
{
struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
- struct sfc_flow_spec *spec = &flow->spec;
- struct sfc_flow_spec_mae *spec_mae = &spec->mae;
- int rc;
-
- /*
- * If the flow is meant to be a TUNNEL rule in a FT context,
- * preparse its actions and save its properties in spec_mae.
- */
- rc = sfc_ft_tunnel_rule_detect(sa, actions, spec_mae, error);
- if (rc != 0)
- goto fail;
-
- rc = sfc_mae_rule_parse_pattern(sa, pattern, flow, error);
- if (rc != 0)
- goto fail;
-
- if (spec_mae->ft_rule_type == SFC_FT_RULE_TUNNEL) {
- /*
- * By design, this flow should be represented solely by the
- * outer rule. But the HW/FW hasn't got support for setting
- * Rx mark from RECIRC_ID on outer rule lookup yet. Neither
- * does it support outer rule counters. As a workaround, an
- * action rule of lower priority is used to do the job.
- *
- * So don't skip sfc_mae_rule_parse_actions() below.
- */
- }
-
- rc = sfc_mae_rule_parse_actions(sa, actions, flow, error);
- if (rc != 0)
- goto fail;
-
- if (spec_mae->ft_ctx != NULL) {
- if (spec_mae->ft_rule_type == SFC_FT_RULE_TUNNEL)
- spec_mae->ft_ctx->tunnel_rule_is_set = B_TRUE;
- ++(spec_mae->ft_ctx->refcnt);
- }
-
- return 0;
-
-fail:
- /* Reset these values to avoid confusing sfc_mae_flow_cleanup(). */
- spec_mae->ft_rule_type = SFC_FT_RULE_NONE;
- spec_mae->ft_ctx = NULL;
-
- return rc;
+ return sfc_mae_rule_parse(sa, pattern, actions, flow, error);
}
static int
diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 15da886f19..f61a859032 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -2747,7 +2747,7 @@ sfc_mae_rule_encap_parse_fini(struct sfc_adapter *sa,
efx_mae_match_spec_fini(sa->nic, ctx->match_spec_outer);
}
-int
+static int
sfc_mae_rule_parse_pattern(struct sfc_adapter *sa,
const struct rte_flow_item pattern[],
struct rte_flow *flow,
@@ -3772,7 +3772,7 @@ sfc_mae_process_encap_header(struct sfc_adapter *sa,
return sfc_mae_encap_header_add(sa, bounce_eh, encap_headerp);
}
-int
+static int
sfc_mae_rule_parse_actions(struct sfc_adapter *sa,
const struct rte_flow_action actions[],
struct rte_flow *flow,
@@ -3935,6 +3935,60 @@ sfc_mae_rule_parse_actions(struct sfc_adapter *sa,
return rc;
}
+int
+sfc_mae_rule_parse(struct sfc_adapter *sa, const struct rte_flow_item pattern[],
+ const struct rte_flow_action actions[],
+ struct rte_flow *flow, struct rte_flow_error *error)
+{
+ struct sfc_flow_spec *spec = &flow->spec;
+ struct sfc_flow_spec_mae *spec_mae = &spec->mae;
+ int rc;
+
+ /*
+ * If the flow is meant to be a TUNNEL rule in a FT context,
+ * preparse its actions and save its properties in spec_mae.
+ */
+ rc = sfc_ft_tunnel_rule_detect(sa, actions, spec_mae, error);
+ if (rc != 0)
+ goto fail;
+
+ rc = sfc_mae_rule_parse_pattern(sa, pattern, flow, error);
+ if (rc != 0)
+ goto fail;
+
+ if (spec_mae->ft_rule_type == SFC_FT_RULE_TUNNEL) {
+ /*
+ * By design, this flow should be represented solely by the
+ * outer rule. But the HW/FW hasn't got support for setting
+ * Rx mark from RECIRC_ID on outer rule lookup yet. Neither
+ * does it support outer rule counters. As a workaround, an
+ * action rule of lower priority is used to do the job.
+ *
+ * So don't skip sfc_mae_rule_parse_actions() below.
+ */
+ }
+
+ rc = sfc_mae_rule_parse_actions(sa, actions, flow, error);
+ if (rc != 0)
+ goto fail;
+
+ if (spec_mae->ft_ctx != NULL) {
+ if (spec_mae->ft_rule_type == SFC_FT_RULE_TUNNEL)
+ spec_mae->ft_ctx->tunnel_rule_is_set = B_TRUE;
+
+ ++(spec_mae->ft_ctx->refcnt);
+ }
+
+ return 0;
+
+fail:
+ /* Reset these values to avoid confusing sfc_mae_flow_cleanup(). */
+ spec_mae->ft_rule_type = SFC_FT_RULE_NONE;
+ spec_mae->ft_ctx = NULL;
+
+ return rc;
+}
+
static bool
sfc_mae_rules_class_cmp(struct sfc_adapter *sa,
const efx_mae_match_spec_t *left,
diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h
index f9434e1ab6..1d937c9b5b 100644
--- a/drivers/net/sfc/sfc_mae.h
+++ b/drivers/net/sfc/sfc_mae.h
@@ -345,15 +345,13 @@ struct sfc_mae_parse_ctx {
int sfc_mae_attach(struct sfc_adapter *sa);
void sfc_mae_detach(struct sfc_adapter *sa);
+
+int sfc_mae_rule_parse(struct sfc_adapter *sa,
+ const struct rte_flow_item pattern[],
+ const struct rte_flow_action actions[],
+ struct rte_flow *flow, struct rte_flow_error *error);
+
sfc_flow_cleanup_cb_t sfc_mae_flow_cleanup;
-int sfc_mae_rule_parse_pattern(struct sfc_adapter *sa,
- const struct rte_flow_item pattern[],
- struct rte_flow *flow,
- struct rte_flow_error *error);
-int sfc_mae_rule_parse_actions(struct sfc_adapter *sa,
- const struct rte_flow_action actions[],
- struct rte_flow *flow,
- struct rte_flow_error *error);
sfc_flow_verify_cb_t sfc_mae_flow_verify;
sfc_flow_insert_cb_t sfc_mae_flow_insert;
sfc_flow_remove_cb_t sfc_mae_flow_remove;
--
2.17.1
More information about the dev
mailing list