Doing so will facilitate easier code restructure in the next patches required to rework flow housekeeping and indirection.
Signed-off-by: Ivan Malov <ivan.ma...@arknetworks.am> Reviewed-by: Andy Moreton <amore...@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 f6d1ae2a5b..6dfbbfd022 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 51b2a22357..e2f098ea53 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -2745,7 +2745,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, @@ -3770,7 +3770,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, @@ -3933,6 +3933,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.30.2