Implement support for common flow parsing infrastructure in preparation for
migration of flow engines.

Signed-off-by: Anatoly Burakov <[email protected]>
---
 drivers/net/intel/i40e/i40e_ethdev.c |  8 ++++++
 drivers/net/intel/i40e/i40e_ethdev.h |  5 ++++
 drivers/net/intel/i40e/i40e_flow.c   | 38 +++++++++++++++++++++++++++-
 drivers/net/intel/i40e/i40e_flow.h   | 12 +++++++++
 4 files changed, 62 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/intel/i40e/i40e_flow.h

diff --git a/drivers/net/intel/i40e/i40e_ethdev.c 
b/drivers/net/intel/i40e/i40e_ethdev.c
index af736f59be..b71a4fb0d1 100644
--- a/drivers/net/intel/i40e/i40e_ethdev.c
+++ b/drivers/net/intel/i40e/i40e_ethdev.c
@@ -43,6 +43,9 @@
 #include "i40e_regs.h"
 #include "rte_pmd_i40e.h"
 #include "i40e_hash.h"
+#include "i40e_flow.h"
+
+#include "../common/flow_engine.h"
 
 #define ETH_I40E_FLOATING_VEB_ARG      "enable_floating_veb"
 #define ETH_I40E_FLOATING_VEB_LIST_ARG "floating_veb_list"
@@ -1845,6 +1848,9 @@ eth_i40e_dev_init(struct rte_eth_dev *dev, void 
*init_params __rte_unused)
        /* reset all stats of the device, including pf and main vsi */
        i40e_dev_stats_reset(dev);
 
+       /* initialize flow engine configuration */
+       ci_flow_engine_conf_init(&pf->flow_engine_conf, &i40e_flow_engine_list, 
dev);
+
        return 0;
 
 err_init_fdir_filter_list:
@@ -2773,6 +2779,8 @@ i40e_dev_close(struct rte_eth_dev *dev)
                        rte_free(p_flow);
        }
 
+       ci_flow_engine_conf_reset(&pf->flow_engine_conf, 
&i40e_flow_engine_list);
+
        /* release the fdir static allocated memory */
        i40e_fdir_memory_cleanup(pf);
 
diff --git a/drivers/net/intel/i40e/i40e_ethdev.h 
b/drivers/net/intel/i40e/i40e_ethdev.h
index 91ad0f8d0e..109ee7f278 100644
--- a/drivers/net/intel/i40e/i40e_ethdev.h
+++ b/drivers/net/intel/i40e/i40e_ethdev.h
@@ -21,6 +21,8 @@
 #include "base/i40e_type.h"
 #include "base/virtchnl.h"
 
+#include "../common/flow_engine.h"
+
 #define I40E_AQ_LEN               32
 #define I40E_AQ_BUF_SZ            4096
 /* Number of queues per TC should be one of 1, 2, 4, 8, 16, 32, 64 */
@@ -278,6 +280,7 @@ enum i40e_flxpld_layer_idx {
  * Struct to store flow created.
  */
 struct rte_flow {
+       struct ci_flow base;
        TAILQ_ENTRY(rte_flow) node;
        enum rte_filter_type filter_type;
        void *rule;
@@ -1172,6 +1175,8 @@ struct i40e_pf {
        /* The floating enable flag for the specific VF */
        bool floating_veb_list[I40E_MAX_VF];
        struct i40e_flow_list flow_list;
+       /* flow engine configuration */
+       struct ci_flow_engine_conf flow_engine_conf;
        bool mpls_replace_flag;  /* 1 - MPLS filter replace is done */
        bool gtp_replace_flag;   /* 1 - GTP-C/U filter replace is done */
        bool qinq_replace_flag;  /* QINQ filter replace is done */
diff --git a/drivers/net/intel/i40e/i40e_flow.c 
b/drivers/net/intel/i40e/i40e_flow.c
index ee48ebf4c3..2f9094bcc7 100644
--- a/drivers/net/intel/i40e/i40e_flow.c
+++ b/drivers/net/intel/i40e/i40e_flow.c
@@ -25,9 +25,12 @@
 #include "base/i40e_prototype.h"
 #include "i40e_ethdev.h"
 #include "i40e_hash.h"
+#include "i40e_flow.h"
 
 #include "../common/flow_check.h"
 
+const struct ci_flow_engine_list i40e_flow_engine_list = {0};
+
 #define I40E_IPV6_TC_MASK      (0xFF << I40E_FDIR_IPv6_TC_OFFSET)
 #define I40E_IPV6_FRAG_HEADER  44
 #define I40E_TENANT_ARRAY_NUM  3
@@ -3795,8 +3798,16 @@ i40e_flow_validate(struct rte_eth_dev *dev,
                   const struct rte_flow_action actions[],
                   struct rte_flow_error *error)
 {
+       struct i40e_pf *pf = dev->data->dev_private;
        /* creates dummy context */
        struct i40e_filter_ctx filter_ctx = {0};
+       int ret;
+
+       /* try the new engine first */
+       ret = ci_flow_validate(&pf->flow_engine_conf, &i40e_flow_engine_list,
+                       attr, pattern, actions, error);
+       if (ret == 0)
+               return 0;
 
        return i40e_flow_check(dev, attr, pattern, actions, &filter_ctx, error);
 }
@@ -3814,6 +3825,12 @@ i40e_flow_create(struct rte_eth_dev *dev,
        struct i40e_fdir_info *fdir_info = &pf->fdir;
        int ret;
 
+       /* try the new engine first */
+       flow = ci_flow_create(&pf->flow_engine_conf, &i40e_flow_engine_list,
+                       attr, pattern, actions, error);
+       if (flow != NULL)
+               return flow;
+
        ret = i40e_flow_check(dev, attr, pattern, actions, &filter_ctx, error);
        if (ret < 0)
                return NULL;
@@ -3920,6 +3937,12 @@ i40e_flow_destroy(struct rte_eth_dev *dev,
        struct i40e_fdir_info *fdir_info = &pf->fdir;
        int ret = 0;
 
+       /* try the new engine first */
+       ret = ci_flow_destroy(&pf->flow_engine_conf, &i40e_flow_engine_list,
+                       flow, error);
+       if (ret == 0)
+               return 0;
+
        switch (filter_type) {
        case RTE_ETH_FILTER_ETHERTYPE:
                ret = i40e_flow_destroy_ethertype_filter(pf,
@@ -4064,6 +4087,11 @@ i40e_flow_flush(struct rte_eth_dev *dev, struct 
rte_flow_error *error)
        struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
        int ret;
 
+       /* flush the new engine first */
+       ret = ci_flow_flush(&pf->flow_engine_conf, &i40e_flow_engine_list, 
error);
+       if (ret != 0)
+               return ret;
+
        ret = i40e_flow_flush_fdir_filter(pf);
        if (ret) {
                rte_flow_error_set(error, -ret,
@@ -4213,14 +4241,22 @@ i40e_flow_flush_tunnel_filter(struct i40e_pf *pf)
 }
 
 static int
-i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
+i40e_flow_query(struct rte_eth_dev *dev,
                struct rte_flow *flow,
                const struct rte_flow_action *actions,
                void *data, struct rte_flow_error *error)
 {
+       struct i40e_pf *pf = dev->data->dev_private;
        struct i40e_rss_filter *rss_rule = (struct i40e_rss_filter *)flow->rule;
        enum rte_filter_type filter_type = flow->filter_type;
        struct rte_flow_action_rss *rss_conf = data;
+       int ret;
+
+       /* try the new engine first */
+       ret = ci_flow_query(&pf->flow_engine_conf, &i40e_flow_engine_list,
+                       flow, actions, data, error);
+       if (ret == 0)
+               return 0;
 
        if (!rss_rule) {
                rte_flow_error_set(error, EINVAL,
diff --git a/drivers/net/intel/i40e/i40e_flow.h 
b/drivers/net/intel/i40e/i40e_flow.h
new file mode 100644
index 0000000000..c958868661
--- /dev/null
+++ b/drivers/net/intel/i40e/i40e_flow.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2026 Intel Corporation
+ */
+
+#ifndef _I40E_FLOW_H_
+#define _I40E_FLOW_H_
+
+#include "../common/flow_engine.h"
+
+extern const struct ci_flow_engine_list i40e_flow_engine_list;
+
+#endif /* _I40E_FLOW_H_ */
-- 
2.47.3

Reply via email to