From: Jie Liu <[email protected]> Add statistics support for the ACL flow engine to track packet hits and bytes, enabling flow aging and traffic monitoring for ACL rules.
- Add acl-stat-type devarg to configure the statistics type - Implement sxe2_drv_flow_acl_get_stat_id/free_stat/query_stat - Handle the ACL engine in flow create/destroy/query paths - Add fnav_hw_res and acl_hw_res count resources Cc: [email protected] Signed-off-by: Jie Liu <[email protected]> --- doc/guides/nics/sxe2.rst | 11 +++ drivers/net/sxe2/sxe2_cmd_chnl.c | 71 +++++++++++++++++++ drivers/net/sxe2/sxe2_cmd_chnl.h | 7 ++ drivers/net/sxe2/sxe2_drv_cmd.h | 17 +++++ drivers/net/sxe2/sxe2_dump.c | 2 + drivers/net/sxe2/sxe2_ethdev.c | 23 +++++-- drivers/net/sxe2/sxe2_ethdev.h | 1 + drivers/net/sxe2/sxe2_flow.c | 83 ++++++++++++++++++----- drivers/net/sxe2/sxe2_flow_define.h | 3 +- drivers/net/sxe2/sxe2_flow_parse_action.c | 25 +++++-- drivers/net/sxe2/sxe2_queue.c | 2 + 11 files changed, 215 insertions(+), 30 deletions(-) diff --git a/doc/guides/nics/sxe2.rst b/doc/guides/nics/sxe2.rst index 8278a5f108..c5b400a8ba 100644 --- a/doc/guides/nics/sxe2.rst +++ b/doc/guides/nics/sxe2.rst @@ -98,6 +98,17 @@ Runtime Configuration Default value is 3 (count both packets and bytes). +- ``acl-stat-type`` parameter [int] + + This parameter controls the ACL flow engine statistics type + used for flow rule hit counting (via ``rte_flow_query``). + + - 1: Only count the number of packets. + - 2: Only count the number of bytes. + - 3: Count both packets and bytes (default). + + Default value is 3 (count both packets and bytes). + - ``drv-sw-stats`` parameter [int] This parameter controls whether per-packet software statistics (SW stats) diff --git a/drivers/net/sxe2/sxe2_cmd_chnl.c b/drivers/net/sxe2/sxe2_cmd_chnl.c index 3229c72597..16a2c3fea4 100644 --- a/drivers/net/sxe2/sxe2_cmd_chnl.c +++ b/drivers/net/sxe2/sxe2_cmd_chnl.c @@ -1829,6 +1829,77 @@ int32_t sxe2_drv_flow_fnav_query_stat(struct sxe2_adapter *adapter, return ret; } +int32_t sxe2_drv_flow_acl_get_stat_id(struct sxe2_adapter *adapter, uint32_t *stat_id) +{ + struct sxe2_drv_flow_fnav_get_stat_id_req req = { 0 }; + struct sxe2_drv_flow_fnav_get_stat_id_resp resp = { 0 }; + struct sxe2_drv_cmd_params cmd = { 0 }; + struct sxe2_common_device *cdev = adapter->cdev; + int32_t ret = -1; + + sxe2_drv_cmd_params_fill(adapter, &cmd, SXE2_DRV_CMD_FLOW_ACL_STAT_ALLOC, + &req, sizeof(req), + &resp, sizeof(resp)); + ret = sxe2_drv_cmd_exec(cdev, &cmd); + if (ret) { + PMD_DEV_LOG_ERR(adapter, DRV, "Failed to get acl stat id, ret: %d.", ret); + goto l_end; + } + *stat_id = resp.stat_id; + +l_end: + return ret; +} + +int32_t sxe2_drv_flow_acl_free_stat(struct sxe2_adapter *adapter, uint32_t stat_id) +{ + struct sxe2_drv_flow_fnav_free_stat_id_req req = { 0 }; + struct sxe2_drv_cmd_params cmd = { 0 }; + struct sxe2_common_device *cdev = adapter->cdev; + int32_t ret = -1; + + req.stat_id = stat_id; + sxe2_drv_cmd_params_fill(adapter, &cmd, SXE2_DRV_CMD_FLOW_ACL_STAT_FREE, + &req, sizeof(req), + NULL, 0); + ret = sxe2_drv_cmd_exec(cdev, &cmd); + if (ret) { + PMD_DEV_LOG_ERR(adapter, DRV, "Failed to free acl stat id, ret: %d.", ret); + goto l_end; + } + +l_end: + return ret; +} + +int32_t sxe2_drv_flow_acl_query_stat(struct sxe2_adapter *adapter, + struct sxe2_flow_cid_mgr *mgr) +{ + struct sxe2_drv_acl_query_stat_req req = { 0 }; + struct sxe2_drv_acl_query_stat_resp resp = { 0 }; + struct sxe2_drv_cmd_params cmd = { 0 }; + struct sxe2_common_device *cdev = adapter->cdev; + int32_t ret = -1; + + req.stat_id = mgr->stat_index; + req.stat_ctrl = mgr->count_type; + req.is_clear = 1; + + sxe2_drv_cmd_params_fill(adapter, &cmd, SXE2_DRV_CMD_FLOW_ACL_STAT_QUERY, + &req, sizeof(req), &resp, sizeof(resp)); + ret = sxe2_drv_cmd_exec(cdev, &cmd); + if (ret) { + PMD_DEV_LOG_ERR(adapter, DRV, "Failed to query ACL stat, stat id: %u, ret: %d.", + req.stat_id, ret); + goto l_end; + } + mgr->hits += resp.stat_hits; + mgr->bytes += resp.stat_bytes; + +l_end: + return ret; +} + int32_t sxe2_drv_srcvsi_prune_config(struct sxe2_adapter *adapter, uint16_t *vsi_list, uint16_t vsi_cnt, bool set) { diff --git a/drivers/net/sxe2/sxe2_cmd_chnl.h b/drivers/net/sxe2/sxe2_cmd_chnl.h index cfea1a1f0e..7d07068bfc 100644 --- a/drivers/net/sxe2/sxe2_cmd_chnl.h +++ b/drivers/net/sxe2/sxe2_cmd_chnl.h @@ -161,6 +161,13 @@ int32_t sxe2_drv_flow_fnav_free_stat(struct sxe2_adapter *adapter, uint32_t stat int32_t sxe2_drv_flow_fnav_query_stat(struct sxe2_adapter *adapter, struct sxe2_flow_cid_mgr *mgr); +int32_t sxe2_drv_flow_acl_get_stat_id(struct sxe2_adapter *adapter, uint32_t *stat_id); + +int32_t sxe2_drv_flow_acl_free_stat(struct sxe2_adapter *adapter, uint32_t stat_id); + +int32_t sxe2_drv_flow_acl_query_stat(struct sxe2_adapter *adapter, + struct sxe2_flow_cid_mgr *mgr); + int32_t sxe2_drv_srcvsi_prune_config(struct sxe2_adapter *adapter, uint16_t *vsi_list, uint16_t vsi_cnt, bool set); diff --git a/drivers/net/sxe2/sxe2_drv_cmd.h b/drivers/net/sxe2/sxe2_drv_cmd.h index 03ef3b315d..d332d15980 100644 --- a/drivers/net/sxe2/sxe2_drv_cmd.h +++ b/drivers/net/sxe2/sxe2_drv_cmd.h @@ -668,6 +668,18 @@ struct __rte_aligned(4) __rte_packed_begin sxe2_drv_vsi_fc_get_resp { uint8_t rsv[3]; } __rte_packed_end; +struct __rte_aligned(4) __rte_packed_begin sxe2_drv_acl_query_stat_req { + uint32_t stat_id; + uint32_t stat_ctrl; + uint32_t is_clear; +} __rte_packed_end; + +struct __rte_aligned(4) __rte_packed_begin sxe2_drv_acl_query_stat_resp { + uint32_t stat_index; + uint64_t stat_hits; + uint64_t stat_bytes; +} __rte_packed_end; + enum sxe2_drv_cmd_module { SXE2_DRV_CMD_MODULE_HANDSHAKE = 0, SXE2_DRV_CMD_MODULE_DEV = 1, @@ -824,6 +836,11 @@ enum sxe2_drv_cmd_code { SXE2_DRV_CMD_OPT_EEP_GET = SXE2_MK_DRV_CMD(SXE2_DRV_CMD_MODULE_OPT, 1), + SXE2_DRV_CMD_FLOW_ACL_STAT_QUERY = + SXE2_MK_DRV_CMD(SXE2_DRV_CMD_MODULE_ACL, 1), + SXE2_DRV_CMD_FLOW_ACL_STAT_ALLOC, + SXE2_DRV_CMD_FLOW_ACL_STAT_FREE, + }; #endif /* SXE2_DRV_CMD_H */ diff --git a/drivers/net/sxe2/sxe2_dump.c b/drivers/net/sxe2/sxe2_dump.c index 590219f502..31f7d6ba61 100644 --- a/drivers/net/sxe2/sxe2_dump.c +++ b/drivers/net/sxe2/sxe2_dump.c @@ -80,12 +80,14 @@ sxe2_dump_dev_args_info(FILE *file, struct rte_eth_dev *dev) "\t -- no_sched_mode: %s\n" "\t -- flow-duplicate-pattern: %u\n" "\t -- fnav-stat-type: %u\n" + "\t -- acl-stat-type: %u\n" "\t -- sched_layer_mode: %u\n" "\t -- rx_low_latency: %s\n" "\t -- function-flow-direct: %s\n", adapter->devargs.no_sched_mode ? "On" : "Off", adapter->devargs.flow_dup_pattern_mode, adapter->devargs.fnav_stat_type, + adapter->devargs.acl_stat_type, adapter->devargs.sched_layer_mode, adapter->devargs.rx_low_latency ? "On" : "Off", adapter->devargs.func_flow_direct_en ? "On" : "Off"); diff --git a/drivers/net/sxe2/sxe2_ethdev.c b/drivers/net/sxe2/sxe2_ethdev.c index 8e3afd6eed..5735dd0ff3 100644 --- a/drivers/net/sxe2/sxe2_ethdev.c +++ b/drivers/net/sxe2/sxe2_ethdev.c @@ -72,6 +72,7 @@ static const struct rte_pci_id pci_id_sxe2_tbl[] = { #define SXE2_DEVARG_FLOW_DUP_PATTERN_MODE "flow-duplicate-pattern" #define SXE2_DEVARG_FUNC_FLOW_DIRCT "function-flow-direct" #define SXE2_DEVARG_FNAV_STAT_TYPE "fnav-stat-type" +#define SXE2_DEVARG_ACL_STAT_TYPE "acl-stat-type" #define SXE2_DEVARG_NO_SCHED_MODE "no-sched-mode" #define SXE2_DEVARG_SCHED_LAYER_MODE "sched-layer-mode" #define SXE2_DEVARG_RX_LOW_LATENCY "rx-low-latency" @@ -985,11 +986,11 @@ sxe2_buffer_split_supported_hdr_ptypes_get(struct rte_eth_dev *dev __rte_unused, return ptypes; } -static int32_t sxe2_parse_fnav_stat_type(const char *key, const char *value, void *args) +static int32_t sxe2_parse_stat_type(const char *key, const char *value, void *args) { int32_t ret = -EINVAL; uint8_t *num = (uint8_t *)args; - unsigned long fnav_stat_type; + unsigned long stat_type; char *endptr = NULL; if (value == NULL || args == NULL) { @@ -997,19 +998,19 @@ static int32_t sxe2_parse_fnav_stat_type(const char *key, const char *value, voi goto l_end; } errno = 0; - fnav_stat_type = strtoul(value, &endptr, 10); + stat_type = strtoul(value, &endptr, 10); if (errno != 0 || endptr == value || *endptr != '\0') { PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.", key, value); goto l_end; } - if (fnav_stat_type > SXE2_FNAV_STAT_ENA_ALL || - fnav_stat_type == SXE2_FNAV_STAT_ENA_NONE) { + if (stat_type > SXE2_FNAV_STAT_ENA_ALL || + stat_type == SXE2_FNAV_STAT_ENA_NONE) { PMD_LOG_ERR(INIT, "%s: \"%s\" out of range [1-3].", key, value); goto l_end; } - *num = (uint8_t)fnav_stat_type; + *num = (uint8_t)stat_type; ret = 0; l_end: return ret; @@ -1191,13 +1192,20 @@ static int32_t sxe2_args_parse(struct rte_eth_dev *dev, struct sxe2_dev_kvargs_i if (kvargs == NULL) goto l_end; ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_FNAV_STAT_TYPE, - &sxe2_parse_fnav_stat_type, + &sxe2_parse_stat_type, &adapter->devargs.fnav_stat_type); if (ret) { PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse fnav stat type, ret:%d", ret); goto l_end; } + ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_ACL_STAT_TYPE, + &sxe2_parse_stat_type, &adapter->devargs.acl_stat_type); + if (ret) { + PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse acl stat type, ret:%d", ret); + goto l_end; + } + ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_NO_SCHED_MODE, &sxe2_parse_bool, &adapter->devargs.no_sched_mode); @@ -2378,6 +2386,7 @@ RTE_PMD_REGISTER_PARAM_STRING(net_sxe2, "flow-duplicate-pattern=<0|1|2> " "function-flow-direct=<0|1> " "fnav-stat-type=<1|2|3> " + "acl-stat-type=<1|2|3> " "no-sched-mode=<0|1> " "sched-layer-mode=<0-3> " "rx-low-latency=<0|1>"); diff --git a/drivers/net/sxe2/sxe2_ethdev.h b/drivers/net/sxe2/sxe2_ethdev.h index e818578319..e9f78fe57f 100644 --- a/drivers/net/sxe2/sxe2_ethdev.h +++ b/drivers/net/sxe2/sxe2_ethdev.h @@ -135,6 +135,7 @@ struct sxe2_devargs { uint8_t flow_dup_pattern_mode; uint8_t func_flow_direct_en; uint8_t fnav_stat_type; + uint8_t acl_stat_type; uint8_t no_sched_mode; uint8_t sched_layer_mode; uint8_t rx_low_latency; diff --git a/drivers/net/sxe2/sxe2_flow.c b/drivers/net/sxe2/sxe2_flow.c index cd39385340..46f5763f62 100644 --- a/drivers/net/sxe2/sxe2_flow.c +++ b/drivers/net/sxe2/sxe2_flow.c @@ -1204,13 +1204,23 @@ static int32_t sxe2_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *e int32_t sxe2_flow_get_filter_cid(struct sxe2_adapter *adapter, struct sxe2_flow *flow) { int32_t ret = 0; - struct sxe2_flow_cid_mgr_list_t *cid_mgr_list = - &adapter->flow_ctxt.hw_res.flow_cid_mgr_list; + struct sxe2_flow_cid_mgr_list_t *cid_mgr_list = NULL; uint32_t stat_index; uint32_t user_id; uint32_t driver_id; struct sxe2_flow_cid_mgr *temp = NULL; struct sxe2_flow_cid_mgr *mgr = NULL; + uint32_t count_type; + + if (flow->engine_type == SXE2_FLOW_ENGINE_FNAV) { + cid_mgr_list = &adapter->flow_ctxt.fnav_hw_res.flow_cid_mgr_list; + count_type = adapter->flow_ctxt.fnav_hw_res.count_type; + } else if (flow->engine_type == SXE2_FLOW_ENGINE_ACL) { + cid_mgr_list = &adapter->flow_ctxt.acl_hw_res.flow_cid_mgr_list; + count_type = adapter->flow_ctxt.acl_hw_res.count_type; + } else { + goto l_end; + } if (sxe2_test_bit(SXE2_FLOW_ACTION_COUNT, flow->action.act_types)) { user_id = flow->action.count.user_id; @@ -1233,7 +1243,10 @@ int32_t sxe2_flow_get_filter_cid(struct sxe2_adapter *adapter, struct sxe2_flow goto l_end; } - ret = sxe2_drv_flow_fnav_get_stat_id(adapter, &stat_index); + if (flow->engine_type == SXE2_FLOW_ENGINE_FNAV) + ret = sxe2_drv_flow_fnav_get_stat_id(adapter, &stat_index); + else if (flow->engine_type == SXE2_FLOW_ENGINE_ACL) + ret = sxe2_drv_flow_acl_get_stat_id(adapter, &stat_index); if (ret) { PMD_LOG_ERR(DRV, "Failed to alloc fw count id."); rte_free(mgr); @@ -1244,7 +1257,7 @@ int32_t sxe2_flow_get_filter_cid(struct sxe2_adapter *adapter, struct sxe2_flow mgr->user_id = user_id; mgr->driver_id = driver_id; mgr->stat_index = stat_index; - mgr->count_type = adapter->flow_ctxt.hw_res.count_type; + mgr->count_type = count_type; } flow->action.count.stat_index = mgr->stat_index; flow->action.count.stat_ctrl = mgr->count_type; @@ -1260,13 +1273,20 @@ int32_t sxe2_flow_free_mgr(struct sxe2_adapter *adapter, struct rte_flow_error *error) { int32_t ret = 0; - struct sxe2_flow_cid_mgr_list_t *cid_mgr_list = - &adapter->flow_ctxt.hw_res.flow_cid_mgr_list; + struct sxe2_flow_cid_mgr_list_t *cid_mgr_list = NULL; struct sxe2_flow_cid_mgr *mgr = *mgr_ptr; uint32_t user_id = flow->action.count.user_id; - if (user_id == 0) { - TAILQ_REMOVE(cid_mgr_list, mgr, next); - ret = sxe2_drv_flow_fnav_free_stat(adapter, mgr->stat_index); + + if (user_id == 0 && mgr) { + if (flow->engine_type == SXE2_FLOW_ENGINE_ACL) { + cid_mgr_list = &adapter->flow_ctxt.acl_hw_res.flow_cid_mgr_list; + TAILQ_REMOVE(cid_mgr_list, mgr, next); + ret = sxe2_drv_flow_acl_free_stat(adapter, mgr->stat_index); + } else if (flow->engine_type == SXE2_FLOW_ENGINE_FNAV) { + cid_mgr_list = &adapter->flow_ctxt.fnav_hw_res.flow_cid_mgr_list; + TAILQ_REMOVE(cid_mgr_list, mgr, next); + ret = sxe2_drv_flow_fnav_free_stat(adapter, mgr->stat_index); + } if (ret) { rte_flow_error_set(error, EIO, RTE_FLOW_ERROR_TYPE_ACTION, NULL, @@ -1287,13 +1307,19 @@ int32_t sxe2_flow_query_mgr(struct sxe2_adapter *adapter, struct rte_flow_error *error) { int32_t ret = 0; - struct sxe2_flow_cid_mgr_list_t *cid_mgr_list = - &adapter->flow_ctxt.hw_res.flow_cid_mgr_list; + struct sxe2_flow_cid_mgr_list_t *cid_mgr_list = NULL; struct sxe2_flow_cid_mgr *temp = NULL; struct sxe2_flow_cid_mgr *mgr = NULL; uint32_t user_id = flow->action.count.user_id; uint32_t driver_id = flow->action.count.driver_id; + if (flow->engine_type == SXE2_FLOW_ENGINE_ACL) + cid_mgr_list = &adapter->flow_ctxt.acl_hw_res.flow_cid_mgr_list; + else if (flow->engine_type == SXE2_FLOW_ENGINE_FNAV) + cid_mgr_list = &adapter->flow_ctxt.fnav_hw_res.flow_cid_mgr_list; + else + goto l_end; + TAILQ_FOREACH(temp, cid_mgr_list, next) { if (temp->user_id == user_id && temp->driver_id == driver_id) { @@ -1310,7 +1336,15 @@ int32_t sxe2_flow_query_mgr(struct sxe2_adapter *adapter, ret = -EINVAL; goto l_end; } - ret = sxe2_drv_flow_fnav_query_stat(adapter, mgr); + + if (flow->engine_type == SXE2_FLOW_ENGINE_ACL) { + ret = sxe2_drv_flow_acl_query_stat(adapter, mgr); + } else if (flow->engine_type == SXE2_FLOW_ENGINE_FNAV) { + ret = sxe2_drv_flow_fnav_query_stat(adapter, mgr); + } else { + PMD_LOG_ERR(DRV, "query flow engine neither FNAV nor ACL"); + ret = -ENOTSUP; + } if (ret) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, NULL, @@ -1461,12 +1495,18 @@ int32_t sxe2_flow_init(struct rte_eth_dev *dev) struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev); int32_t ret = 0; TAILQ_INIT(&adapter->flow_ctxt.rte_flow_list); - TAILQ_INIT(&adapter->flow_ctxt.hw_res.flow_cid_mgr_list); + TAILQ_INIT(&adapter->flow_ctxt.fnav_hw_res.flow_cid_mgr_list); + TAILQ_INIT(&adapter->flow_ctxt.acl_hw_res.flow_cid_mgr_list); if (adapter->devargs.fnav_stat_type) - adapter->flow_ctxt.hw_res.count_type = + adapter->flow_ctxt.fnav_hw_res.count_type = adapter->devargs.fnav_stat_type; else - adapter->flow_ctxt.hw_res.count_type = SXE2_FNAV_STAT_ENA_ALL; + adapter->flow_ctxt.fnav_hw_res.count_type = SXE2_FNAV_STAT_ENA_ALL; + + if (adapter->devargs.acl_stat_type) + adapter->flow_ctxt.acl_hw_res.count_type = adapter->devargs.acl_stat_type; + else + adapter->flow_ctxt.acl_hw_res.count_type = SXE2_FNAV_STAT_ENA_ALL; adapter->flow_ctxt.fnav_inited = 1; rte_spinlock_init(&adapter->flow_ctxt.flow_list_lock); @@ -1485,13 +1525,13 @@ int32_t sxe2_flow_uninit(struct rte_eth_dev *dev) struct rte_flow_error error; struct sxe2_flow_cid_mgr *mgr = NULL; struct sxe2_flow_cid_mgr *temp = NULL; - struct sxe2_flow_cid_mgr_list_t *cid_mgr_list = - &adapter->flow_ctxt.hw_res.flow_cid_mgr_list; + struct sxe2_flow_cid_mgr_list_t *cid_mgr_list = NULL; ret = sxe2_flow_flush(dev, &error); if (ret) PMD_LOG_ERR(DRV, "Failed to flush flow, ret: %d.", ret); + cid_mgr_list = &adapter->flow_ctxt.fnav_hw_res.flow_cid_mgr_list; TAILQ_FOREACH_SAFE(mgr, cid_mgr_list, next, temp) { TAILQ_REMOVE(cid_mgr_list, mgr, next); ret = sxe2_drv_flow_fnav_free_stat(adapter, mgr->stat_index); @@ -1500,5 +1540,14 @@ int32_t sxe2_flow_uninit(struct rte_eth_dev *dev) "Failed to free fnav stat id, ret: %d.", ret); rte_free(mgr); } + + cid_mgr_list = &adapter->flow_ctxt.acl_hw_res.flow_cid_mgr_list; + TAILQ_FOREACH_SAFE(mgr, cid_mgr_list, next, temp) { + TAILQ_REMOVE(cid_mgr_list, mgr, next); + ret = sxe2_drv_flow_acl_free_stat(adapter, mgr->stat_index); + if (ret) + PMD_LOG_ERR(DRV, "Failed to free acl stat id, ret: %d.", ret); + rte_free(mgr); + } return ret; } diff --git a/drivers/net/sxe2/sxe2_flow_define.h b/drivers/net/sxe2/sxe2_flow_define.h index 8a5d871978..f56f687dc7 100644 --- a/drivers/net/sxe2/sxe2_flow_define.h +++ b/drivers/net/sxe2/sxe2_flow_define.h @@ -118,7 +118,8 @@ struct sxe2_flow_count_resource { struct sxe2_flow_context { struct rte_flow_list_t rte_flow_list; rte_spinlock_t flow_list_lock; - struct sxe2_flow_count_resource hw_res; + struct sxe2_flow_count_resource fnav_hw_res; + struct sxe2_flow_count_resource acl_hw_res; uint16_t tunnel_port_list[SXE2_FLOW_UDP_TUNNEL_MAX]; uint32_t fnav_inited; }; diff --git a/drivers/net/sxe2/sxe2_flow_parse_action.c b/drivers/net/sxe2/sxe2_flow_parse_action.c index a9559e2d7e..db70b146c6 100644 --- a/drivers/net/sxe2/sxe2_flow_parse_action.c +++ b/drivers/net/sxe2/sxe2_flow_parse_action.c @@ -953,7 +953,8 @@ static int32_t sxe2_flow_check_actions(struct rte_eth_dev *dev __rte_unused, str } } - if (engine_type == SXE2_FLOW_ENGINE_FNAV) { + if (engine_type == SXE2_FLOW_ENGINE_FNAV || + engine_type == SXE2_FLOW_ENGINE_ACL) { if (vsi_num) { flow->action.q_region.q_index = 0; flow->action.q_region.region = 7; @@ -988,7 +989,8 @@ int32_t sxe2_flow_parse_action(struct rte_eth_dev *dev, case RTE_FLOW_ACTION_TYPE_VOID: break; case RTE_FLOW_ACTION_TYPE_PASSTHRU: - if (engine_type == SXE2_FLOW_ENGINE_FNAV) { + if (engine_type == SXE2_FLOW_ENGINE_FNAV || + engine_type == SXE2_FLOW_ENGINE_ACL) { sxe2_set_bit(SXE2_FLOW_ACTION_PASSTHRU, flow->action.act_types); action_num[SXE2_FLOW_ACTION_PASSTHRU]++; } else { @@ -1037,11 +1039,24 @@ int32_t sxe2_flow_parse_action(struct rte_eth_dev *dev, if (engine_type == SXE2_FLOW_ENGINE_FNAV) { sxe2_set_bit(SXE2_FLOW_ACTION_COUNT, flow->action.act_types); act_count = action->conf; - flow->action.count.user_id = act_count->id; + flow->action.count.user_id = + (act_count == NULL) ? 0 : act_count->id; + flow->action.count.driver_id = 0; + if (flow->action.count.user_id == 0) { + flow->action.count.driver_id = + ++adapter->flow_ctxt.fnav_hw_res.global_index; + } + action_num[SXE2_FLOW_ACTION_COUNT]++; + } else if (engine_type == SXE2_FLOW_ENGINE_ACL) { + sxe2_set_bit(SXE2_FLOW_ACTION_COUNT, flow->action.act_types); + act_count = action->conf; + flow->action.count.user_id = + (act_count == NULL) ? 0 : act_count->id; flow->action.count.driver_id = 0; - if (flow->action.count.user_id == 0) + if (flow->action.count.user_id == 0) { flow->action.count.driver_id = - ++adapter->flow_ctxt.hw_res.global_index; + ++adapter->flow_ctxt.acl_hw_res.global_index; + } action_num[SXE2_FLOW_ACTION_COUNT]++; } else { rte_flow_error_set(error, ENOTSUP, diff --git a/drivers/net/sxe2/sxe2_queue.c b/drivers/net/sxe2/sxe2_queue.c index afb2681b72..3aaa14c685 100644 --- a/drivers/net/sxe2/sxe2_queue.c +++ b/drivers/net/sxe2/sxe2_queue.c @@ -39,6 +39,8 @@ int32_t sxe2_queues_init(struct rte_eth_dev *dev) rxq->rx_buf_len = RTE_MIN(rxq->rx_buf_len, SXE2_RX_MAX_DATA_BUF_SIZE); if (frame_size > rxq->rx_buf_len) dev->data->scattered_rx = 1; + if (adapter->flow_ctxt.fnav_inited) + rxq->fnav_enable = true; } adapter->ptp_ctxt.mbuf_rx_ts_offset = -1; -- 2.52.0

