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;
