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

