* [PATCH v1 00/31] net/ntnic: bugfixes and refactoring
@ 2025-01-21 17:07 Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 01/31] net/ntnic: fix index verification Serhii Iliushyk
` (30 more replies)
0 siblings, 31 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen
These patches include fixes for issues detected by the Coverity Scan tool and internal tests.
Danylo Vodopianov (26):
net/ntnic: fix index verification
net/ntnic: add thread check return code
net/ntnic: add return code handling
net/ntnic: add array index verification
net/ntnic: fix realloc memory leak
net/ntnic: fix array index verification
net/ntnic: add var definition transparently
net/ntnic: add proper var freed
net/ntnic: remove deadcode
net/ntnic: fix potentially overflow
net/ntnic: add null checking
net/ntnic: fix overflow issue
net/ntnic: fix untrusted loop bound
net/ntnic: add null checking
net/ntnic: move null checking
net/ntnic: fix var size
net/ntnic: fix var overflow
net/ntnic: remove dead code
net/ntnic: remove convert error func
net/ntnic: fix array verification
net/ntnic: fix memory leak
net/ntnic: remove unused code
net/ntnic: refactor RSS implementation
net/ntnic: fix age timeout recalculation into fpga unit
net/ntnic: rework age event generation
net/ntnic: fix group print
Oleksandr Kolomeiets (2):
net/ntnic: remove extra address-of operator
net/ntnic: remove extra check for null
Serhii Iliushyk (3):
net/ntnic: extend module mapping
net/ntnic: refactoring of the FPGA initialization
net/ntnic: remove tag EXPERIMENTAL
MAINTAINERS | 2 +-
.../net/ntnic/adapter/nt4ga_stat/nt4ga_stat.c | 9 -
drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c | 10 +-
drivers/net/ntnic/include/create_elements.h | 1 -
drivers/net/ntnic/include/flow_api.h | 9 -
drivers/net/ntnic/include/flow_api_engine.h | 2 +
drivers/net/ntnic/include/hw_mod_backend.h | 16 +-
.../link_mgmt/link_100g/nt4ga_link_100g.c | 2 +-
drivers/net/ntnic/meson.build | 1 +
drivers/net/ntnic/nthw/core/nthw_fpga.c | 14 +-
drivers/net/ntnic/nthw/flow_api/flow_api.c | 67 +-
drivers/net/ntnic/nthw/flow_api/flow_group.c | 26 +
.../net/ntnic/nthw/flow_api/flow_hsh_cfg.c | 661 ++++++++++++++
.../net/ntnic/nthw/flow_api/flow_hsh_cfg.h | 17 +
.../ntnic/nthw/flow_api/hw_mod/hw_mod_flm.c | 14 +-
.../ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c | 19 +-
.../ntnic/nthw/flow_api/hw_mod/hw_mod_pdb.c | 18 +-
.../profile_inline/flow_api_hw_db_inline.c | 29 +-
.../profile_inline/flow_api_profile_inline.c | 817 +-----------------
.../profile_inline/flow_api_profile_inline.h | 4 -
.../ntnic/nthw/flow_filter/flow_nthw_rpp_lr.c | 10 +-
.../nthw/supported/nthw_fpga_mod_str_map.c | 24 +
drivers/net/ntnic/ntnic_ethdev.c | 16 +-
drivers/net/ntnic/ntnic_filter/ntnic_filter.c | 155 ++--
drivers/net/ntnic/ntnic_mod_reg.h | 6 -
drivers/net/ntnic/ntnic_xstats/ntnic_xstats.c | 10 +-
26 files changed, 915 insertions(+), 1044 deletions(-)
create mode 100644 drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.c
create mode 100644 drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.h
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 01/31] net/ntnic: fix index verification
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 02/31] net/ntnic: add thread check return code Serhii Iliushyk
` (29 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
CI found couple coverity problems which were fixed in this commit.
CID: 448974, 448977, 448978 (OVERRUN).
These issues were fixed with updating index verification statement.
Coverity issue: 448974
Fixes: effa04693274 ("net/ntnic: add statistics")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/ntnic_filter/ntnic_filter.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
index 4c8503f689..e00b10ff82 100644
--- a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
+++ b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
@@ -1201,7 +1201,7 @@ static int poll_statistics(struct pmd_internals *internals)
const int if_index = internals->n_intf_no;
uint64_t last_stat_rtc = 0;
- if (!p_nt4ga_stat || if_index < 0 || if_index > NUM_ADAPTER_PORTS_MAX)
+ if (!p_nt4ga_stat || if_index < 0 || if_index >= NUM_ADAPTER_PORTS_MAX)
return -1;
assert(rte_tsc_freq > 0);
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 02/31] net/ntnic: add thread check return code
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 01/31] net/ntnic: fix index verification Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 18:24 ` Stephen Hemminger
2025-01-21 17:07 ` [PATCH v1 03/31] net/ntnic: add return code handling Serhii Iliushyk
` (28 subsequent siblings)
30 siblings, 1 reply; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
CI found couple coverity problems which were fixed in this commit.
CID: 448965 Error handling issues (CHECKED_RETURN).
Thread return code check was added.
Coverity issue: 448965
Fixes: a1ba8c473f5c ("net/ntnic: add statistics poll")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/ntnic_ethdev.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c
index 2a2643a106..620d023a71 100644
--- a/drivers/net/ntnic/ntnic_ethdev.c
+++ b/drivers/net/ntnic/ntnic_ethdev.c
@@ -2516,8 +2516,11 @@ static int init_shutdown(void)
NT_LOG(DBG, NTNIC, "Starting shutdown handler");
kill_pmd = 0;
previous_handler = signal(SIGINT, signal_handler_func_int);
- THREAD_CREATE(&shutdown_tid, shutdown_thread, NULL);
-
+ int ret = THREAD_CREATE(&shutdown_tid, shutdown_thread, NULL);
+ if (ret != 0) {
+ NT_LOG(ERR, NTNIC, "Failed to create shutdown thread, error code: %d", ret);
+ return -1;
+ }
/*
* 1 time calculation of 1 sec stat update rtc cycles to prevent stat poll
* flooding by OVS from multiple virtual port threads - no need to be precise
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 03/31] net/ntnic: add return code handling
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 01/31] net/ntnic: fix index verification Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 02/31] net/ntnic: add thread check return code Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 18:30 ` Stephen Hemminger
2025-01-21 17:07 ` [PATCH v1 04/31] net/ntnic: add array index verification Serhii Iliushyk
` (27 subsequent siblings)
30 siblings, 1 reply; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev
Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov, Oleksandr Kolomeiets
From: Danylo Vodopianov <dvo-plv@napatech.com>
CI found couple coverity problems which were fixed in this commit.
CID: 448984, 448982, 448975, 448969, 448968, 448967
API usage errors (BAD_COMPARE).
Add memcmp return value checking.
Coverity issue: 448984
Fixes: 6e8b7f11205f ("net/ntnic: add categorizer (CAT) FPGA module")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/include/hw_mod_backend.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ntnic/include/hw_mod_backend.h b/drivers/net/ntnic/include/hw_mod_backend.h
index f91a3ed058..40002f3343 100644
--- a/drivers/net/ntnic/include/hw_mod_backend.h
+++ b/drivers/net/ntnic/include/hw_mod_backend.h
@@ -114,10 +114,10 @@ enum {
typeof(be_module_reg) *temp_be_module = &(be_module_reg); \
typeof(idx) tmp_idx = (idx); \
typeof(cmp_idx) tmp_cmp_idx = (cmp_idx); \
- if ((unsigned int)(tmp_idx) != (unsigned int)(tmp_cmp_idx)) { \
- (void)memcmp(temp_be_module + tmp_idx, &temp_be_module[tmp_cmp_idx], \
- sizeof(type)); \
- } \
+ if ((unsigned int)(tmp_idx) != (unsigned int)(tmp_cmp_idx)) \
+ if (memcmp(temp_be_module + tmp_idx, &temp_be_module[tmp_cmp_idx], \
+ sizeof(type)) == 0) \
+ return 1; \
} while (0)
static inline int is_non_zero(const void *addr, size_t n)
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 04/31] net/ntnic: add array index verification
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (2 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 03/31] net/ntnic: add return code handling Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 05/31] net/ntnic: fix realloc memory leak Serhii Iliushyk
` (26 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev
Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov, Oleksandr Kolomeiets
From: Danylo Vodopianov <dvo-plv@napatech.com>
CI found couple coverity problems which were fixed in this commit.
CID: 448983, 448980
Memory - corruptions (OVERRUN)
Add check both indices within bounds before calling the macro
Coverity issue: 448983
Fixes: 6e8b7f11205f ("net/ntnic: add categorizer (CAT) FPGA module")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
.../ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c | 17 ++++++++++++++++-
.../ntnic/nthw/flow_api/hw_mod/hw_mod_pdb.c | 18 ++++++++++++++++--
2 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c b/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c
index 1750d09afb..cc8db2fae5 100644
--- a/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c
+++ b/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c
@@ -121,8 +121,23 @@ static int hw_mod_hsh_rcp_mod(struct flow_api_backend_s *be, enum hw_hsh_e field
INDEX_TOO_LARGE_LOG;
return INDEX_TOO_LARGE;
}
+ /* Size of the structure */
+ size_t element_size = sizeof(struct hsh_v5_rcp_s);
+ /* Size of the buffer */
+ size_t buffer_size = sizeof(be->hsh.v5.rcp);
- DO_COMPARE_INDEXS(be->hsh.v5.rcp, struct hsh_v5_rcp_s, index, word_off);
+ /* Calculate the maximum valid index (number of elements in the buffer) */
+ size_t max_idx = buffer_size / element_size;
+
+ /* Check that both indices are within bounds before calling the macro */
+ if (index < max_idx && word_off < max_idx) {
+ DO_COMPARE_INDEXS(be->hsh.v5.rcp, struct hsh_v5_rcp_s, index,
+ word_off);
+
+ } else {
+ INDEX_TOO_LARGE_LOG;
+ return INDEX_TOO_LARGE;
+ }
break;
case HW_HSH_RCP_FIND:
diff --git a/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_pdb.c b/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_pdb.c
index 59285405ba..147a06ac2b 100644
--- a/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_pdb.c
+++ b/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_pdb.c
@@ -131,8 +131,22 @@ static int hw_mod_pdb_rcp_mod(struct flow_api_backend_s *be, enum hw_pdb_e field
INDEX_TOO_LARGE_LOG;
return INDEX_TOO_LARGE;
}
-
- DO_COMPARE_INDEXS(be->pdb.v9.rcp, struct pdb_v9_rcp_s, index, *value);
+ /* Size of the structure */
+ size_t element_size = sizeof(struct pdb_v9_rcp_s);
+ /* Size of the buffer */
+ size_t buffer_size = sizeof(be->pdb.v9.rcp);
+
+ /* Calculate the maximum valid index (number of elements in the buffer) */
+ size_t max_idx = buffer_size / element_size;
+
+ /* Check that both indices are within bounds before calling the macro */
+ if (index < max_idx && *value < max_idx) {
+ DO_COMPARE_INDEXS(be->pdb.v9.rcp, struct pdb_v9_rcp_s, index,
+ *value);
+ } else {
+ INDEX_TOO_LARGE_LOG;
+ return INDEX_TOO_LARGE;
+ }
break;
case HW_PDB_RCP_DESCRIPTOR:
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 05/31] net/ntnic: fix realloc memory leak
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (3 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 04/31] net/ntnic: add array index verification Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 06/31] net/ntnic: fix array index verification Serhii Iliushyk
` (25 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Issue was fixed with verification in case of the
successful memory re-allocation.
Coverity issue: 448959
Fixes: 4033e0539435 ("net/ntnic: add flow meter")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
.../profile_inline/flow_api_profile_inline.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
index ff8eb502f4..1c7d5cac3e 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
@@ -5523,11 +5523,16 @@ int flow_configure_profile_inline(struct flow_eth_dev *dev, uint8_t caller_id,
struct flm_flow_mtr_handle_s *mtr_handle = dev->ndev->flm_mtr_handle;
if (mtr_handle->port_stats[caller_id]->shared == 1) {
- res = realloc(mtr_handle->port_stats[caller_id]->stats,
- port_attr->nb_meters) == NULL
- ? -1
- : 0;
- mtr_handle->port_stats[caller_id]->size = port_attr->nb_meters;
+ struct flm_mtr_stat_s *temp_stats =
+ realloc(mtr_handle->port_stats[caller_id]->stats,
+ port_attr->nb_meters);
+ if (temp_stats == NULL) {
+ res = -1;
+ } else {
+ res = 0;
+ mtr_handle->port_stats[caller_id]->stats = temp_stats;
+ mtr_handle->port_stats[caller_id]->size = port_attr->nb_meters;
+ }
} else {
mtr_handle->port_stats[caller_id] =
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 06/31] net/ntnic: fix array index verification
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (4 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 05/31] net/ntnic: fix realloc memory leak Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 07/31] net/ntnic: add var definition transparently Serhii Iliushyk
` (24 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
CI found couple coverity problems which were fixed in this commit.
CID: 448983 Out-of-bounds write (OVERRUN).
These issues were fixed with updating index verification statement.
Coverity issue: 448983
Fixes: 96c8249be53e ("net/ntnic: learn flow queue handling")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/ntnic_ethdev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c
index 620d023a71..28b086c009 100644
--- a/drivers/net/ntnic/ntnic_ethdev.c
+++ b/drivers/net/ntnic/ntnic_ethdev.c
@@ -140,7 +140,7 @@ store_pdrv(struct drv_s *p_drv)
static void clear_pdrv(struct drv_s *p_drv)
{
- if (p_drv->adapter_no > NUM_ADAPTER_MAX)
+ if (p_drv->adapter_no >= NUM_ADAPTER_MAX)
return;
rte_spinlock_lock(&hwlock);
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 07/31] net/ntnic: add var definition transparently
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (5 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 06/31] net/ntnic: fix array index verification Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 08/31] net/ntnic: add proper var freed Serhii Iliushyk
` (23 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev
Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov, Oleksandr Kolomeiets
From: Danylo Vodopianov <dvo-plv@napatech.com>
set eth_base to NULL after freeing to prevent
use-after-free
CID: 446746 Use after free (USE_AFTER_FREE)
Coverity issue: 446746
Fixes: 1d3f62a0c4f1 ("net/ntnic: add base init and deinit of flow API")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/nthw/flow_api/flow_api.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/flow_api.c b/drivers/net/ntnic/nthw/flow_api/flow_api.c
index 82d4e34ae9..d25d1a3dd1 100644
--- a/drivers/net/ntnic/nthw/flow_api/flow_api.c
+++ b/drivers/net/ntnic/nthw/flow_api/flow_api.c
@@ -385,8 +385,10 @@ static void flow_ndev_reset(struct flow_nic_dev *ndev)
}
/* Delete all eth-port devices created on this NIC device */
- while (ndev->eth_base)
+ while (ndev->eth_base) {
flow_delete_eth_dev(ndev->eth_base);
+ ndev->eth_base = NULL;
+ }
/* Error check */
while (ndev->flow_base) {
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 08/31] net/ntnic: add proper var freed
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (6 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 07/31] net/ntnic: add var definition transparently Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 09/31] net/ntnic: remove deadcode Serhii Iliushyk
` (22 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov, Ferruh Yigit
From: Danylo Vodopianov <dvo-plv@napatech.com>
p_fpga_mgr is properly freed when it's no longer needed
CID 440546: Resource leak (RESOURCE_LEAK)
Fixes: ddf184d0b6c2 ("net/ntnic: add FPGA initialization")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/nthw/core/nthw_fpga.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/net/ntnic/nthw/core/nthw_fpga.c b/drivers/net/ntnic/nthw/core/nthw_fpga.c
index ca69a9d5b1..88641145ec 100644
--- a/drivers/net/ntnic/nthw/core/nthw_fpga.c
+++ b/drivers/net/ntnic/nthw/core/nthw_fpga.c
@@ -230,6 +230,8 @@ int nthw_fpga_init(struct fpga_info_s *p_fpga_info)
if (p_fpga == NULL) {
NT_LOG(ERR, NTHW, "%s: Unsupported FPGA: %s (%08X)", p_adapter_id_str,
s_fpga_prod_ver_rev_str, p_fpga_info->n_fpga_build_time);
+ nthw_fpga_mgr_delete(p_fpga_mgr);
+ p_fpga_mgr = NULL;
return -1;
}
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 09/31] net/ntnic: remove deadcode
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (7 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 08/31] net/ntnic: add proper var freed Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 10/31] net/ntnic: fix potentially overflow Serhii Iliushyk
` (21 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Deadcode was removed.
CID: 448981 Logically dead code (DEADCODE)
Coverity issue: 448981
Fixes: e02fdb65c2a8 ("net/ntnic: add flow create/destroy")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
.../flow_api/profile_inline/flow_api_profile_inline.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
index 1c7d5cac3e..535047d246 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
@@ -4268,13 +4268,8 @@ struct flow_handle *flow_create_profile_inline(struct flow_eth_dev *dev __rte_un
err_exit:
- if (fh) {
- flow_destroy_locked_profile_inline(dev, fh, NULL);
- fh = NULL;
- } else {
- free(fd);
- fd = NULL;
- }
+ free(fd);
+ fd = NULL;
rte_spinlock_unlock(&dev->ndev->mtx);
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 10/31] net/ntnic: fix potentially overflow
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (8 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 09/31] net/ntnic: remove deadcode Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 11/31] net/ntnic: add null checking Serhii Iliushyk
` (20 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Issue with potentially overflow was fixed.
CID 448944: Unintentional integer overflow (OVERFLOW_BEFORE_WIDEN)
Coverity issue: 448944
Fixes: 339ca124e659 ("net/ntnic: add flow action modify field")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
.../nthw/flow_api/profile_inline/flow_api_profile_inline.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
index 535047d246..a68c3ea702 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
@@ -1632,7 +1632,7 @@ static int interpret_flow_actions(const struct flow_eth_dev *dev,
return -1;
}
- modify_field_use_flag = 1
+ modify_field_use_flag = (uint64_t)1
<< fd->modify_field[fd->modify_field_count].select;
if (modify_field_use_flag & modify_field_use_flags) {
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 11/31] net/ntnic: add null checking
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (9 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 10/31] net/ntnic: fix potentially overflow Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 12/31] net/ntnic: fix overflow issue Serhii Iliushyk
` (19 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev
Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov, Oleksandr Kolomeiets
From: Danylo Vodopianov <dvo-plv@napatech.com>
Fix issue with potential rereferencing a pointer
that might be NULL p->m_rpp_lr when calling
nthw_module_query_register
CID 448923: Dereference null return value (NULL_RETURNS)
Coverity issue: 448923
Fixes: f543ca6b9ab2 ("net/ntnic: add RPP local retransmit (RPP LR) flow module")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/nthw/flow_filter/flow_nthw_rpp_lr.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ntnic/nthw/flow_filter/flow_nthw_rpp_lr.c b/drivers/net/ntnic/nthw/flow_filter/flow_nthw_rpp_lr.c
index 28c7a05fe2..e69a1ca823 100644
--- a/drivers/net/ntnic/nthw/flow_filter/flow_nthw_rpp_lr.c
+++ b/drivers/net/ntnic/nthw/flow_filter/flow_nthw_rpp_lr.c
@@ -54,18 +54,20 @@ int rpp_lr_nthw_init(struct rpp_lr_nthw *p, nthw_fpga_t *p_fpga, int n_instance)
p->mp_fpga = p_fpga;
p->m_physical_adapter_no = (uint8_t)n_instance;
p->m_rpp_lr = nthw_fpga_query_module(p_fpga, MOD_RPP_LR, n_instance);
-
- p->mp_rcp_ctrl = nthw_module_get_register(p->m_rpp_lr, RPP_LR_RCP_CTRL);
+ if (p->m_rpp_lr)
+ p->mp_rcp_ctrl = nthw_module_get_register(p->m_rpp_lr, RPP_LR_RCP_CTRL);
p->mp_rcp_addr = nthw_register_get_field(p->mp_rcp_ctrl, RPP_LR_RCP_CTRL_ADR);
p->mp_rcp_cnt = nthw_register_get_field(p->mp_rcp_ctrl, RPP_LR_RCP_CTRL_CNT);
- p->mp_rcp_data = nthw_module_get_register(p->m_rpp_lr, RPP_LR_RCP_DATA);
+ if (p->m_rpp_lr)
+ p->mp_rcp_data = nthw_module_get_register(p->m_rpp_lr, RPP_LR_RCP_DATA);
p->mp_rcp_data_exp = nthw_register_get_field(p->mp_rcp_data, RPP_LR_RCP_DATA_EXP);
p->mp_ifr_rcp_ctrl = nthw_module_query_register(p->m_rpp_lr, RPP_LR_IFR_RCP_CTRL);
p->mp_ifr_rcp_addr =
nthw_register_query_field(p->mp_ifr_rcp_ctrl, RPP_LR_IFR_RCP_CTRL_ADR);
p->mp_ifr_rcp_cnt = nthw_register_query_field(p->mp_ifr_rcp_ctrl, RPP_LR_IFR_RCP_CTRL_CNT);
- p->mp_ifr_rcp_data = nthw_module_query_register(p->m_rpp_lr, RPP_LR_IFR_RCP_DATA);
+ if (p->m_rpp_lr)
+ p->mp_ifr_rcp_data = nthw_module_query_register(p->m_rpp_lr, RPP_LR_IFR_RCP_DATA);
p->mp_ifr_rcp_data_ipv4_en =
nthw_register_query_field(p->mp_ifr_rcp_data, RPP_LR_IFR_RCP_DATA_IPV4_EN);
p->mp_ifr_rcp_data_ipv6_en =
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 12/31] net/ntnic: fix overflow issue
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (10 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 11/31] net/ntnic: add null checking Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 13/31] net/ntnic: fix untrusted loop bound Serhii Iliushyk
` (18 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Fix overflow issue with checking max bit shifting value.
Coverity issue: 448921
Fixes: 833962ebb893 ("net/ntnic: add CAT module")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
.../nthw/flow_api/profile_inline/flow_api_profile_inline.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
index a68c3ea702..574e51c2fa 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
@@ -3605,7 +3605,7 @@ static struct flow_handle *create_flow_filter(struct flow_eth_dev *dev, struct n
.err_mask_ttl = (fd->ttl_sub_enable &&
fd->ttl_sub_outer) ? -1 : 0x1,
.ptc_mask_tunnel = fd->tunnel_prot !=
- -1 ? (1 << fd->tunnel_prot) : -1,
+ -1 ? (1 << (fd->tunnel_prot > 10 ? 10 : fd->tunnel_prot)) : -1,
.ptc_mask_l3_tunnel =
fd->tunnel_l3_prot != -1 ? (1 << fd->tunnel_l3_prot) : -1,
.ptc_mask_l4_tunnel =
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 13/31] net/ntnic: fix untrusted loop bound
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (11 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 12/31] net/ntnic: fix overflow issue Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 14/31] net/ntnic: add null checking Serhii Iliushyk
` (17 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Replace while with if statement to avoid infinite loop
in case ther_type will be modified with extenral source.
Coverity issue: 448917
Fixes: c6821abf58e8 ("net/ntnic: add flow items GTP and actions raw encap/decap")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/ntnic_filter/ntnic_filter.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
index e00b10ff82..b07e16c1d3 100644
--- a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
+++ b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
@@ -53,7 +53,7 @@ int interpret_raw_data(uint8_t *data, uint8_t *preserve, int size, struct rte_fl
goto interpret_end;
/* VLAN */
- while (ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_VLAN) ||
+ if (ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_VLAN) ||
ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_QINQ) ||
ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_QINQ1)) {
if (size - pkti == 0)
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 14/31] net/ntnic: add null checking
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (12 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 13/31] net/ntnic: fix untrusted loop bound Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 15/31] net/ntnic: move " Serhii Iliushyk
` (16 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Add null checking for fpga var.
Coverity issue: 448916
Fixes: 30b2f87ac650 ("net/ntnic: add GMF module")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/link_mgmt/link_100g/nt4ga_link_100g.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/link_mgmt/link_100g/nt4ga_link_100g.c b/drivers/net/ntnic/link_mgmt/link_100g/nt4ga_link_100g.c
index d8e0cad7cd..67dc0d01f6 100644
--- a/drivers/net/ntnic/link_mgmt/link_100g/nt4ga_link_100g.c
+++ b/drivers/net/ntnic/link_mgmt/link_100g/nt4ga_link_100g.c
@@ -405,7 +405,7 @@ static int _port_init(adapter_info_t *drv, nthw_fpga_t *fpga, int port)
_reset_rx(drv, mac_pcs);
/* 2.2) Nt4gaPort::setup() */
- if (nthw_gmf_init(NULL, fpga, port) == 0) {
+ if (fpga && nthw_gmf_init(NULL, fpga, port) == 0) {
nthw_gmf_t gmf;
if (nthw_gmf_init(&gmf, fpga, port) == 0)
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 15/31] net/ntnic: move null checking
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (13 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 14/31] net/ntnic: add null checking Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 16/31] net/ntnic: fix var size Serhii Iliushyk
` (15 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Move null checking before using
Coverity issue: 446759
Fixes: f0fe222ea9cf ("net/ntnic: add releasing virtqueues")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
index c178144d42..279a852a1c 100644
--- a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
+++ b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
@@ -510,11 +510,11 @@ static int dbs_wait_hw_queue_shutdown(struct nthw_virt_queue *vq, int rx)
static int dbs_internal_release_rx_virt_queue(struct nthw_virt_queue *rxvq)
{
- nthw_dbs_t *p_nthw_dbs = rxvq->mp_nthw_dbs;
-
if (rxvq == NULL)
return -1;
+ nthw_dbs_t *p_nthw_dbs = rxvq->mp_nthw_dbs;
+
/* Clear UW */
rxvq->used_struct_phys_addr = NULL;
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 16/31] net/ntnic: fix var size
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (14 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 15/31] net/ntnic: move " Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 17/31] net/ntnic: fix var overflow Serhii Iliushyk
` (14 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Function operate with uint16_r value, meanwhile return value with
uint32_t size.
This conversion was aligned to the uint8_t as far as max value of the
return value could be equal 16.
Coverity issue: 446747
Fixes: 67aee0a69665 ("net/ntnic: add used writer data handling")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
index 279a852a1c..a2c9ef27f0 100644
--- a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
+++ b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
@@ -345,9 +345,9 @@ dbs_initialize_virt_queue_structs(void *avail_struct_addr, void *used_struct_add
flgs);
}
-static uint16_t dbs_qsize_log2(uint16_t qsize)
+static uint8_t dbs_qsize_log2(uint16_t qsize)
{
- uint32_t qs = 0;
+ uint8_t qs = 0;
while (qsize) {
qsize = qsize >> 1;
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 17/31] net/ntnic: fix var overflow
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (15 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 16/31] net/ntnic: fix var size Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 18/31] net/ntnic: remove dead code Serhii Iliushyk
` (13 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Casting either buf_size and num_descr to uint64_t before performing the
multiplication was done.
Coverity issue: 446740
Fixes: 6b0047fadf41 ("net/ntnic: add queue setup operations")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/ntnic_ethdev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c
index 28b086c009..6fcbb8fa9b 100644
--- a/drivers/net/ntnic/ntnic_ethdev.c
+++ b/drivers/net/ntnic/ntnic_ethdev.c
@@ -790,7 +790,7 @@ static int allocate_hw_virtio_queues(struct rte_eth_dev *eth_dev, int vf_num, st
NT_LOG(DBG, NTNIC, "***** Configure IOMMU for HW queues on VF %i *****", vf_num);
/* Just allocate 1MB to hold all combined descr rings */
- uint64_t tot_alloc_size = 0x100000 + buf_size * num_descr;
+ uint64_t tot_alloc_size = 0x100000 + (uint64_t)buf_size * (uint64_t)num_descr;
void *virt =
rte_malloc_socket("VirtQDescr", tot_alloc_size, nt_util_align_size(tot_alloc_size),
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 18/31] net/ntnic: remove dead code
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (16 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 17/31] net/ntnic: fix var overflow Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 19/31] net/ntnic: remove convert error func Serhii Iliushyk
` (12 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Dead code path in the condition irq_vector >= 0
because the condition irq_vector < 0 is already
established
Coverity issue: 446745
Fixes: 01e34ed9c756 ("net/ntnic: add availability monitor management")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
index a2c9ef27f0..e1eccb647c 100644
--- a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
+++ b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
@@ -415,7 +415,7 @@ static struct nthw_virt_queue *nthw_setup_rx_virt_queue(nthw_dbs_t *p_nthw_dbs,
if (irq_vector < 0) {
if (set_rx_am_data(p_nthw_dbs, index, (uint64_t)avail_struct_phys_addr,
RX_AM_DISABLE, host_id, 0,
- irq_vector >= 0 ? 1 : 0) != 0) {
+ 0) != 0) {
return NULL;
}
}
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 19/31] net/ntnic: remove convert error func
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (17 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 18/31] net/ntnic: remove dead code Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 20/31] net/ntnic: fix array verification Serhii Iliushyk
` (11 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
convert_error func was removed as far as this approach was deprecated.
Coverity issue: 448973
Fixes: e526adf1fdef ("net/ntnic: add minimal create/destroy flow operations")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/include/create_elements.h | 1 -
drivers/net/ntnic/ntnic_filter/ntnic_filter.c | 151 ++++++------------
2 files changed, 53 insertions(+), 99 deletions(-)
diff --git a/drivers/net/ntnic/include/create_elements.h b/drivers/net/ntnic/include/create_elements.h
index 1456977837..f0b9410cb9 100644
--- a/drivers/net/ntnic/include/create_elements.h
+++ b/drivers/net/ntnic/include/create_elements.h
@@ -61,7 +61,6 @@ enum nt_rte_flow_item_type {
extern rte_spinlock_t flow_lock;
int interpret_raw_data(uint8_t *data, uint8_t *preserve, int size, struct rte_flow_item *out);
-int convert_error(struct rte_flow_error *error, struct rte_flow_error *rte_flow_error);
int create_attr(struct cnv_attr_s *attribute, const struct rte_flow_attr *attr);
int create_match_elements(struct cnv_match_s *match, const struct rte_flow_item items[],
int max_elem);
diff --git a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
index b07e16c1d3..70bff776be 100644
--- a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
+++ b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c
@@ -246,23 +246,6 @@ int interpret_raw_data(uint8_t *data, uint8_t *preserve, int size, struct rte_fl
return hdri + 1;
}
-int convert_error(struct rte_flow_error *error, struct rte_flow_error *rte_flow_error)
-{
- if (error) {
- error->cause = NULL;
- error->message = rte_flow_error->message;
-
- if (rte_flow_error->type == RTE_FLOW_ERROR_TYPE_NONE ||
- rte_flow_error->type == RTE_FLOW_ERROR_TYPE_NONE)
- error->type = RTE_FLOW_ERROR_TYPE_NONE;
-
- else
- error->type = RTE_FLOW_ERROR_TYPE_UNSPECIFIED;
- }
-
- return 0;
-}
-
int create_attr(struct cnv_attr_s *attribute, const struct rte_flow_attr *attr)
{
memset(&attribute->attr, 0x0, sizeof(struct rte_flow_attr));
@@ -497,13 +480,10 @@ static int convert_flow(struct rte_eth_dev *eth_dev,
struct pmd_internals *internals = eth_dev->data->dev_private;
struct fpga_info_s *fpga_info = &internals->p_drv->ntdrv.adapter_info.fpga_info;
- static struct rte_flow_error flow_error = {
- .type = RTE_FLOW_ERROR_TYPE_NONE, .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
uint32_t queue_offset = 0;
- /* Set initial error */
- convert_error(error, &flow_error);
-
if (!internals) {
rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
"Missing eth_dev");
@@ -559,23 +539,19 @@ eth_flow_destroy(struct rte_eth_dev *eth_dev, struct rte_flow *flow, struct rte_
struct pmd_internals *internals = eth_dev->data->dev_private;
- static struct rte_flow_error flow_error = {
- .type = RTE_FLOW_ERROR_TYPE_NONE, .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = 0;
- /* Set initial error */
- convert_error(error, &flow_error);
if (!flow)
return 0;
if (is_flow_handle_typecast(flow)) {
- res = flow_filter_ops->flow_destroy(internals->flw_dev, (void *)flow, &flow_error);
- convert_error(error, &flow_error);
+ res = flow_filter_ops->flow_destroy(internals->flw_dev, (void *)flow, error);
} else {
res = flow_filter_ops->flow_destroy(internals->flw_dev, flow->flw_hdl,
- &flow_error);
- convert_error(error, &flow_error);
+ error);
rte_spinlock_lock(&flow_lock);
flow->used = 0;
@@ -606,8 +582,8 @@ static struct rte_flow *eth_flow_create(struct rte_eth_dev *eth_dev,
struct cnv_match_s match = { 0 };
struct cnv_action_s action = { 0 };
- static struct rte_flow_error flow_error = {
- .type = RTE_FLOW_ERROR_TYPE_NONE, .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
uint32_t flow_stat_id = 0;
if (convert_flow(eth_dev, attr, items, actions, &attribute, &match, &action, error) < 0)
@@ -620,8 +596,7 @@ static struct rte_flow *eth_flow_create(struct rte_eth_dev *eth_dev,
void *flw_hdl = flow_filter_ops->flow_create(internals->flw_dev, &attribute.attr,
attribute.forced_vlan_vid, attribute.caller_id,
match.rte_flow_item, action.flow_actions,
- &flow_error);
- convert_error(error, &flow_error);
+ error);
return (struct rte_flow *)flw_hdl;
}
@@ -648,8 +623,7 @@ static struct rte_flow *eth_flow_create(struct rte_eth_dev *eth_dev,
flow->flw_hdl = flow_filter_ops->flow_create(internals->flw_dev, &attribute.attr,
attribute.forced_vlan_vid, attribute.caller_id,
match.rte_flow_item, action.flow_actions,
- &flow_error);
- convert_error(error, &flow_error);
+ error);
if (!flow->flw_hdl) {
rte_spinlock_lock(&flow_lock);
@@ -678,14 +652,14 @@ static int eth_flow_flush(struct rte_eth_dev *eth_dev, struct rte_flow_error *er
struct pmd_internals *internals = eth_dev->data->dev_private;
- static struct rte_flow_error flow_error = {
- .type = RTE_FLOW_ERROR_TYPE_NONE, .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = 0;
/* Main application caller_id is port_id shifted above VDPA ports */
uint16_t caller_id = get_caller_id(eth_dev->data->port_id);
if (internals->flw_dev) {
- res = flow_filter_ops->flow_flush(internals->flw_dev, caller_id, &flow_error);
+ res = flow_filter_ops->flow_flush(internals->flw_dev, caller_id, error);
rte_spinlock_lock(&flow_lock);
for (int flow = 0; flow < MAX_RTE_FLOWS; flow++) {
@@ -702,8 +676,6 @@ static int eth_flow_flush(struct rte_eth_dev *eth_dev, struct rte_flow_error *er
rte_spinlock_unlock(&flow_lock);
}
- convert_error(error, &flow_error);
-
return res;
}
@@ -721,8 +693,8 @@ static int eth_flow_actions_update(struct rte_eth_dev *eth_dev,
struct pmd_internals *internals = eth_dev->data->dev_private;
- static struct rte_flow_error flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = -1;
if (internals->flw_dev) {
@@ -756,18 +728,16 @@ static int eth_flow_actions_update(struct rte_eth_dev *eth_dev,
res = flow_filter_ops->flow_actions_update(internals->flw_dev,
(void *)flow,
action.flow_actions,
- &flow_error);
+ error);
} else {
res = flow_filter_ops->flow_actions_update(internals->flw_dev,
flow->flw_hdl,
action.flow_actions,
- &flow_error);
+ error);
}
}
- convert_error(error, &flow_error);
-
return res;
}
@@ -785,17 +755,16 @@ static int eth_flow_dev_dump(struct rte_eth_dev *eth_dev,
struct pmd_internals *internals = eth_dev->data->dev_private;
- static struct rte_flow_error flow_error = {
- .type = RTE_FLOW_ERROR_TYPE_NONE, .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
uint16_t caller_id = get_caller_id(eth_dev->data->port_id);
int res = flow_filter_ops->flow_dev_dump(internals->flw_dev,
is_flow_handle_typecast(flow) ? (void *)flow
: flow->flw_hdl,
- caller_id, file, &flow_error);
+ caller_id, file, error);
- convert_error(error, &flow_error);
return res;
}
@@ -813,16 +782,14 @@ static int eth_flow_get_aged_flows(struct rte_eth_dev *eth_dev,
struct pmd_internals *internals = eth_dev->data->dev_private;
- static struct rte_flow_error flow_error = {
- .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
uint16_t caller_id = get_caller_id(eth_dev->data->port_id);
int res = flow_filter_ops->flow_get_aged_flows(internals->flw_dev, caller_id, context,
- nb_contexts, &flow_error);
+ nb_contexts, error);
- convert_error(error, &flow_error);
return res;
}
@@ -842,17 +809,15 @@ static int eth_flow_info_get(struct rte_eth_dev *dev, struct rte_flow_port_info
struct pmd_internals *internals = dev->data->dev_private;
- static struct rte_flow_error flow_error = {
- .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = flow_filter_ops->flow_info_get(internals->flw_dev,
get_caller_id(dev->data->port_id),
(struct rte_flow_port_info *)port_info,
(struct rte_flow_queue_info *)queue_info,
- &flow_error);
+ error);
- convert_error(error, &flow_error);
return res;
}
@@ -869,18 +834,16 @@ static int eth_flow_configure(struct rte_eth_dev *dev, const struct rte_flow_por
struct pmd_internals *internals = dev->data->dev_private;
- static struct rte_flow_error flow_error = {
- .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = flow_filter_ops->flow_configure(internals->flw_dev,
get_caller_id(dev->data->port_id),
(const struct rte_flow_port_attr *)port_attr,
nb_queue,
(const struct rte_flow_queue_attr **)queue_attr,
- &flow_error);
+ error);
- convert_error(error, &flow_error);
return res;
}
@@ -897,8 +860,8 @@ static struct rte_flow_pattern_template *eth_flow_pattern_template_create(struct
struct pmd_internals *internals = dev->data->dev_private;
- static struct rte_flow_error flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
struct cnv_match_s match = { 0 };
struct rte_flow_pattern_template_attr attr = {
@@ -918,9 +881,8 @@ static struct rte_flow_pattern_template *eth_flow_pattern_template_create(struct
struct flow_pattern_template *res =
flow_filter_ops->flow_pattern_template_create(internals->flw_dev, &attr, caller_id,
- match.rte_flow_item, &flow_error);
+ match.rte_flow_item, error);
- convert_error(error, &flow_error);
return (struct rte_flow_pattern_template *)res;
}
@@ -937,15 +899,14 @@ static int eth_flow_pattern_template_destroy(struct rte_eth_dev *dev,
struct pmd_internals *internals = dev->data->dev_private;
- static struct rte_flow_error rte_flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = flow_filter_ops->flow_pattern_template_destroy(internals->flw_dev,
(struct flow_pattern_template *)
pattern_template,
- &rte_flow_error);
+ error);
- convert_error(error, &rte_flow_error);
return res;
}
@@ -964,8 +925,8 @@ static struct rte_flow_actions_template *eth_flow_actions_template_create(struct
struct pmd_internals *internals = dev->data->dev_private;
struct fpga_info_s *fpga_info = &internals->p_drv->ntdrv.adapter_info.fpga_info;
- static struct rte_flow_error rte_flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
struct cnv_action_s action = { 0 };
struct cnv_action_s mask = { 0 };
@@ -1004,9 +965,8 @@ static struct rte_flow_actions_template *eth_flow_actions_template_create(struct
struct flow_actions_template *res =
flow_filter_ops->flow_actions_template_create(internals->flw_dev, &attr, caller_id,
action.flow_actions,
- mask.flow_actions, &rte_flow_error);
+ mask.flow_actions, error);
- convert_error(error, &rte_flow_error);
return (struct rte_flow_actions_template *)res;
}
@@ -1023,15 +983,14 @@ static int eth_flow_actions_template_destroy(struct rte_eth_dev *dev,
struct pmd_internals *internals = dev->data->dev_private;
- static struct rte_flow_error rte_flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = flow_filter_ops->flow_actions_template_destroy(internals->flw_dev,
(struct flow_actions_template *)
actions_template,
- &rte_flow_error);
+ error);
- convert_error(error, &rte_flow_error);
return res;
}
@@ -1050,8 +1009,8 @@ static struct rte_flow_template_table *eth_flow_template_table_create(struct rte
struct pmd_internals *internals = dev->data->dev_private;
- static struct rte_flow_error rte_flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
struct rte_flow_template_table_attr attr = {
.flow_attr = {
@@ -1071,9 +1030,8 @@ static struct rte_flow_template_table *eth_flow_template_table_create(struct rte
forced_vlan_vid, caller_id,
(struct flow_pattern_template **)pattern_templates,
nb_pattern_templates, (struct flow_actions_template **)actions_templates,
- nb_actions_templates, &rte_flow_error);
+ nb_actions_templates, error);
- convert_error(error, &rte_flow_error);
return (struct rte_flow_template_table *)res;
}
@@ -1090,15 +1048,14 @@ static int eth_flow_template_table_destroy(struct rte_eth_dev *dev,
struct pmd_internals *internals = dev->data->dev_private;
- static struct rte_flow_error rte_flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = flow_filter_ops->flow_template_table_destroy(internals->flw_dev,
(struct flow_template_table *)
template_table,
- &rte_flow_error);
+ error);
- convert_error(error, &rte_flow_error);
return res;
}
@@ -1118,8 +1075,8 @@ static struct rte_flow *eth_flow_async_create(struct rte_eth_dev *dev, uint32_t
struct pmd_internals *internals = dev->data->dev_private;
struct fpga_info_s *fpga_info = &internals->p_drv->ntdrv.adapter_info.fpga_info;
- static struct rte_flow_error rte_flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
struct cnv_action_s action = { 0 };
struct cnv_match_s match = { 0 };
@@ -1159,9 +1116,8 @@ static struct rte_flow *eth_flow_async_create(struct rte_eth_dev *dev, uint32_t
action.flow_actions,
actions_template_index,
user_data,
- &rte_flow_error);
+ error);
- convert_error(error, &rte_flow_error);
return (struct rte_flow *)res;
}
@@ -1178,17 +1134,16 @@ static int eth_flow_async_destroy(struct rte_eth_dev *dev, uint32_t queue_id,
struct pmd_internals *internals = dev->data->dev_private;
- static struct rte_flow_error rte_flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE,
- .message = "none" };
+ error->type = RTE_FLOW_ERROR_TYPE_NONE;
+ error->message = "none";
int res = flow_filter_ops->flow_async_destroy(internals->flw_dev,
queue_id,
(const struct rte_flow_op_attr *)op_attr,
(struct flow_handle *)flow,
user_data,
- &rte_flow_error);
+ error);
- convert_error(error, &rte_flow_error);
return res;
}
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 20/31] net/ntnic: fix array verification
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (18 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 19/31] net/ntnic: remove convert error func Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 21/31] net/ntnic: fix memory leak Serhii Iliushyk
` (10 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
if statement was modify to ensure that word_off
doesn't exceed the size of the array
Coverity issue: 448958
Fixes: 7fa0bf29e667 ("net/ntnic: add hash module")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c b/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c
index cc8db2fae5..d19e72e323 100644
--- a/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c
+++ b/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_hsh.c
@@ -221,7 +221,7 @@ static int hw_mod_hsh_rcp_mod(struct flow_api_backend_s *be, enum hw_hsh_e field
break;
case HW_HSH_RCP_WORD_MASK:
- if (word_off > HSH_RCP_WORD_MASK_SIZE) {
+ if (word_off >= HSH_RCP_WORD_MASK_SIZE) {
WORD_OFF_TOO_LARGE_LOG;
return WORD_OFF_TOO_LARGE;
}
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 21/31] net/ntnic: fix memory leak
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (19 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 20/31] net/ntnic: fix array verification Serhii Iliushyk
@ 2025-01-21 17:07 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 22/31] net/ntnic: remove extra address-of operator Serhii Iliushyk
` (9 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:07 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
free for kvlist was added before return to avoid memory leak.
Coveriry issue: 446751
Fixes: fe91ade9f5db ("net/ntnic: add basic queue operations")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/ntnic_ethdev.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c
index 6fcbb8fa9b..d1360cc925 100644
--- a/drivers/net/ntnic/ntnic_ethdev.c
+++ b/drivers/net/ntnic/ntnic_ethdev.c
@@ -2089,6 +2089,7 @@ nthw_pci_dev_init(struct rte_pci_device *pci_dev)
NT_LOG_DBGX(ERR, NTNIC,
"problem with command line arguments: res=%d",
res);
+ free(kvlist);
return -1;
}
@@ -2112,6 +2113,7 @@ nthw_pci_dev_init(struct rte_pci_device *pci_dev)
NT_LOG_DBGX(ERR, NTNIC,
"problem with command line arguments: res=%d",
res);
+ free(kvlist);
return -1;
}
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 22/31] net/ntnic: remove extra address-of operator
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (20 preceding siblings ...)
2025-01-21 17:07 ` [PATCH v1 21/31] net/ntnic: fix memory leak Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 23/31] net/ntnic: remove extra check for null Serhii Iliushyk
` (8 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Oleksandr Kolomeiets
From: Oleksandr Kolomeiets <okl-plv@napatech.com>
Macro DO_COMPARE_INDEXS expects pointer to array.
If condition is true, one of array's elements get overwritten.
Misinterpreting pointer to pointer as pointer to array
may result in out-of-bounds access.
Coverity issue: 448966, 448970, 448971, 448972
Fixes: 6e8b7f11205f ("net/ntnic: add categorizer (CAT) FPGA module")
Signed-off-by: Oleksandr Kolomeiets <okl-plv@napatech.com>
---
drivers/net/ntnic/include/hw_mod_backend.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ntnic/include/hw_mod_backend.h b/drivers/net/ntnic/include/hw_mod_backend.h
index 40002f3343..7bb39e37eb 100644
--- a/drivers/net/ntnic/include/hw_mod_backend.h
+++ b/drivers/net/ntnic/include/hw_mod_backend.h
@@ -111,7 +111,7 @@ enum {
#define DO_COMPARE_INDEXS(be_module_reg, type, idx, cmp_idx) \
do { \
- typeof(be_module_reg) *temp_be_module = &(be_module_reg); \
+ typeof(be_module_reg) temp_be_module = (be_module_reg); \
typeof(idx) tmp_idx = (idx); \
typeof(cmp_idx) tmp_cmp_idx = (cmp_idx); \
if ((unsigned int)(tmp_idx) != (unsigned int)(tmp_cmp_idx)) \
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 23/31] net/ntnic: remove extra check for null
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (21 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 22/31] net/ntnic: remove extra address-of operator Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 24/31] net/ntnic: remove unused code Serhii Iliushyk
` (7 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev
Cc: mko-plv, sil-plv, ckm, stephen, Oleksandr Kolomeiets, Danylo Vodopianov
From: Oleksandr Kolomeiets <okl-plv@napatech.com>
pld_ptr points to mp_port_load's element,
which is initialized during driver's probe,
otherwise probe fails and xstats_get_by_id is not called.
Coverity issue: 448945
Fixes: cf6007eac498 ("net/ntnic: add xstats")
Signed-off-by: Oleksandr Kolomeiets <okl-plv@napatech.com>
---
drivers/net/ntnic/ntnic_xstats/ntnic_xstats.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/drivers/net/ntnic/ntnic_xstats/ntnic_xstats.c b/drivers/net/ntnic/ntnic_xstats/ntnic_xstats.c
index 7604afe6a0..cf3271d5de 100644
--- a/drivers/net/ntnic/ntnic_xstats/ntnic_xstats.c
+++ b/drivers/net/ntnic/ntnic_xstats/ntnic_xstats.c
@@ -645,16 +645,8 @@ static int nthw_xstats_get_by_id(nt4ga_stat_t *p_nt4ga_stat,
break;
case 4:
-
/* Port Load stat */
- if (pld_ptr) {
- /* No reset */
- values[i] = *((uint64_t *)&pld_ptr[names[i].offset]);
-
- } else {
- values[i] = 0;
- }
-
+ values[i] = *((uint64_t *)&pld_ptr[names[i].offset]);
break;
default:
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 24/31] net/ntnic: remove unused code
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (22 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 23/31] net/ntnic: remove extra check for null Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 25/31] net/ntnic: refactor RSS implementation Serhii Iliushyk
` (6 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
NTNIC currently cupport only 100G link.
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/adapter/nt4ga_stat/nt4ga_stat.c | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/drivers/net/ntnic/adapter/nt4ga_stat/nt4ga_stat.c b/drivers/net/ntnic/adapter/nt4ga_stat/nt4ga_stat.c
index 8fedfdcd04..2add43639a 100644
--- a/drivers/net/ntnic/adapter/nt4ga_stat/nt4ga_stat.c
+++ b/drivers/net/ntnic/adapter/nt4ga_stat/nt4ga_stat.c
@@ -215,16 +215,7 @@ static int nt4ga_stat_setup(struct adapter_info_s *p_adapter_info)
return -1;
}
-#ifdef NIM_TRIGGER
- uint64_t max_bps_speed = nt_get_max_link_speed(p_adapter_info->nt4ga_link.speed_capa);
-
- if (max_bps_speed == 0)
- max_bps_speed = DEFAULT_MAX_BPS_SPEED;
-
-#else
uint64_t max_bps_speed = DEFAULT_MAX_BPS_SPEED;
- NT_LOG(ERR, NTNIC, "NIM module not included");
-#endif
for (int p = 0; p < NUM_ADAPTER_PORTS_MAX; p++) {
p_nt4ga_stat->mp_port_load[p].rx_bps_max = max_bps_speed;
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 25/31] net/ntnic: refactor RSS implementation
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (23 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 24/31] net/ntnic: remove unused code Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 26/31] net/ntnic: fix age timeout recalculation into fpga unit Serhii Iliushyk
` (5 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Virtualization backward compatible RSS implementation is no longer
needed, thus RSS was refactored as follows:
* conversion of RTE_ETH_RSS fields into HSH registers was moved to
separate files
* profile wrapper for RSS configuration was removed
* flow_nic_set_hasher(), to configure default 5-tuple hash, was
replaced by call of hsh_set() with proper RTE_ETH_RSS*
fields
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/include/flow_api.h | 9 -
drivers/net/ntnic/include/hw_mod_backend.h | 6 -
drivers/net/ntnic/meson.build | 1 +
drivers/net/ntnic/nthw/flow_api/flow_api.c | 63 --
.../net/ntnic/nthw/flow_api/flow_hsh_cfg.c | 661 +++++++++++++++
.../net/ntnic/nthw/flow_api/flow_hsh_cfg.h | 17 +
.../profile_inline/flow_api_hw_db_inline.c | 5 +-
.../profile_inline/flow_api_profile_inline.c | 782 +-----------------
.../profile_inline/flow_api_profile_inline.h | 4 -
drivers/net/ntnic/ntnic_ethdev.c | 3 +-
drivers/net/ntnic/ntnic_mod_reg.h | 6 -
11 files changed, 695 insertions(+), 862 deletions(-)
create mode 100644 drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.c
create mode 100644 drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.h
diff --git a/drivers/net/ntnic/include/flow_api.h b/drivers/net/ntnic/include/flow_api.h
index 0af766fe5b..9201b8a3ae 100644
--- a/drivers/net/ntnic/include/flow_api.h
+++ b/drivers/net/ntnic/include/flow_api.h
@@ -83,11 +83,6 @@ struct flow_eth_dev {
struct flow_eth_dev *next;
};
-enum flow_nic_hash_e {
- HASH_ALGO_ROUND_ROBIN = 0,
- HASH_ALGO_5TUPLE,
-};
-
/* registered NIC backends */
struct flow_nic_dev {
uint8_t adapter_no; /* physical adapter no in the host system */
@@ -234,10 +229,6 @@ void flow_nic_free_resource(struct flow_nic_dev *ndev, enum res_type_e res_type,
int flow_nic_ref_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int index);
int flow_nic_deref_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int index);
-int flow_nic_set_hasher(struct flow_nic_dev *ndev, int hsh_idx, enum flow_nic_hash_e algorithm);
-int flow_nic_set_hasher_fields(struct flow_nic_dev *ndev, int hsh_idx,
- struct nt_eth_rss_conf rss_conf);
-
int flow_get_flm_stats(struct flow_nic_dev *ndev, uint64_t *data, uint64_t size);
#endif
diff --git a/drivers/net/ntnic/include/hw_mod_backend.h b/drivers/net/ntnic/include/hw_mod_backend.h
index 7bb39e37eb..28980b727b 100644
--- a/drivers/net/ntnic/include/hw_mod_backend.h
+++ b/drivers/net/ntnic/include/hw_mod_backend.h
@@ -239,12 +239,6 @@ enum {
PROT_TUN_L4_ICMP = 4
};
-
-enum {
- HASH_HASH_NONE = 0,
- HASH_5TUPLE = 8,
-};
-
enum {
CPY_SELECT_DSCP_IPV4 = 0,
CPY_SELECT_DSCP_IPV6 = 1,
diff --git a/drivers/net/ntnic/meson.build b/drivers/net/ntnic/meson.build
index 3c05ad1d87..bfc5ae5aa8 100644
--- a/drivers/net/ntnic/meson.build
+++ b/drivers/net/ntnic/meson.build
@@ -70,6 +70,7 @@ sources = files(
'nthw/flow_api/flow_backend/flow_backend.c',
'nthw/flow_api/flow_filter.c',
'nthw/flow_api/flow_hasher.c',
+ 'nthw/flow_api/flow_hsh_cfg.c',
'nthw/flow_api/flow_kcc.c',
'nthw/flow_api/flow_km.c',
'nthw/flow_api/hw_mod/hw_mod_backend.c',
diff --git a/drivers/net/ntnic/nthw/flow_api/flow_api.c b/drivers/net/ntnic/nthw/flow_api/flow_api.c
index d25d1a3dd1..857051fe14 100644
--- a/drivers/net/ntnic/nthw/flow_api/flow_api.c
+++ b/drivers/net/ntnic/nthw/flow_api/flow_api.c
@@ -1009,55 +1009,6 @@ int sprint_nt_rss_mask(char *str, uint16_t str_len, const char *prefix, uint64_t
return 0;
}
-/*
- * Hash
- */
-
-int flow_nic_set_hasher(struct flow_nic_dev *ndev, int hsh_idx, enum flow_nic_hash_e algorithm)
-{
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_PRESET_ALL, hsh_idx, 0, 0);
-
- switch (algorithm) {
- case HASH_ALGO_5TUPLE:
- /* need to create an IPv6 hashing and enable the adaptive ip mask bit */
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_LOAD_DIST_TYPE, hsh_idx, 0, 2);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_QW0_PE, hsh_idx, 0, DYN_FINAL_IP_DST);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_QW0_OFS, hsh_idx, 0, -16);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_QW4_PE, hsh_idx, 0, DYN_FINAL_IP_DST);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_QW4_OFS, hsh_idx, 0, 0);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_W8_PE, hsh_idx, 0, DYN_L4);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_W8_OFS, hsh_idx, 0, 0);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_W9_PE, hsh_idx, 0, 0);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_W9_OFS, hsh_idx, 0, 0);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_W9_P, hsh_idx, 0, 0);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_P_MASK, hsh_idx, 0, 1);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 0, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 1, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 2, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 3, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 4, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 5, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 6, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 7, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 8, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx, 9, 0);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_SEED, hsh_idx, 0, 0xffffffff);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_HSH_VALID, hsh_idx, 0, 1);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_HSH_TYPE, hsh_idx, 0, HASH_5TUPLE);
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_AUTO_IPV4_MASK, hsh_idx, 0, 1);
-
- NT_LOG(DBG, FILTER, "Set IPv6 5-tuple hasher with adaptive IPv4 hashing");
- break;
-
- default:
- case HASH_ALGO_ROUND_ROBIN:
- /* zero is round-robin */
- break;
- }
-
- return 0;
-}
-
static int flow_dev_dump(struct flow_eth_dev *dev,
struct flow_handle *flow,
uint16_t caller_id,
@@ -1074,19 +1025,6 @@ static int flow_dev_dump(struct flow_eth_dev *dev,
return profile_inline_ops->flow_dev_dump_profile_inline(dev, flow, caller_id, file, error);
}
-int flow_nic_set_hasher_fields(struct flow_nic_dev *ndev, int hsh_idx,
- struct nt_eth_rss_conf rss_conf)
-{
- const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops();
-
- if (profile_inline_ops == NULL) {
- NT_LOG(ERR, FILTER, "%s: profile_inline module uninitialized", __func__);
- return -1;
- }
-
- return profile_inline_ops->flow_nic_set_hasher_fields_inline(ndev, hsh_idx, rss_conf);
-}
-
static int flow_get_aged_flows(struct flow_eth_dev *dev,
uint16_t caller_id,
void **context,
@@ -1324,7 +1262,6 @@ static const struct flow_filter_ops ops = {
* Other
*/
.hw_mod_hsh_rcp_flush = hw_mod_hsh_rcp_flush,
- .flow_nic_set_hasher_fields = flow_nic_set_hasher_fields,
};
void init_flow_filter(void)
diff --git a/drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.c b/drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.c
new file mode 100644
index 0000000000..624d1a26d1
--- /dev/null
+++ b/drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.c
@@ -0,0 +1,661 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Napatech A/S
+ */
+
+#include "flow_hsh_cfg.h"
+
+#define RTE_ETH_RSS_UDP_COMBINED (RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
+ RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
+ RTE_ETH_RSS_IPV6_UDP_EX)
+
+#define RTE_ETH_RSS_TCP_COMBINED (RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
+ RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
+ RTE_ETH_RSS_IPV6_TCP_EX)
+
+#define TOEPLITS_HSH_SIZE 9
+/*
+ * FPGA uses up to 10 32-bit words (320 bits) for hash calculation + 8 bits for L4 protocol number.
+ * Hashed data are split between two 128-bit Quad Words (QW)
+ * and two 32-bit Words (W), which can refer to different header parts.
+ */
+enum hsh_words_id {
+ HSH_WORDS_QW0 = 0,
+ HSH_WORDS_QW4,
+ HSH_WORDS_W8,
+ HSH_WORDS_W9,
+ HSH_WORDS_SIZE,
+};
+
+/* struct with details about hash QWs & Ws */
+struct hsh_words {
+ /*
+ * index of W (word) or index of 1st word of QW (quad word)
+ * is used for hash mask calculation
+ */
+ uint8_t index;
+ enum hw_hsh_e pe; /* offset to header part, e.g. beginning of L4 */
+ enum hw_hsh_e ofs; /* relative offset in BYTES to 'pe' header offset above */
+ uint16_t bit_len; /* max length of header part in bits to fit into QW/W */
+ bool free; /* only free words can be used for hsh calculation */
+};
+
+static enum hsh_words_id get_free_word(struct hsh_words *words, uint16_t bit_len)
+{
+ enum hsh_words_id ret = HSH_WORDS_SIZE;
+ uint16_t ret_bit_len = UINT16_MAX;
+ for (enum hsh_words_id i = HSH_WORDS_QW0; i < HSH_WORDS_SIZE; i++) {
+ if (words[i].free && bit_len <=
+ words[i].bit_len && words[i].bit_len <
+ ret_bit_len) {
+ ret = i;
+ ret_bit_len = words[i].bit_len;
+ }
+ }
+ return ret;
+}
+
+static int hsh_set_part(struct flow_nic_dev *ndev, int hsh_idx, struct hsh_words *words,
+ uint32_t pe, uint32_t ofs, int bit_len, bool toeplitz)
+{
+ int res = 0;
+
+ /* check if there is any free word, which can accommodate header part of given 'bit_len' */
+ enum hsh_words_id word = get_free_word(words, bit_len);
+
+ if (word == HSH_WORDS_SIZE) {
+ NT_LOG(ERR, FILTER, "Cannot add additional %d bits into hash", bit_len);
+ return -1;
+ }
+
+ words[word].free = false;
+
+ res |= hw_mod_hsh_rcp_set(&ndev->be, words[word].pe, hsh_idx, 0, pe);
+ NT_LOG(DBG, FILTER, "hw_mod_hsh_rcp_set(&ndev->be, %d, %d, 0, %d)", words[word].pe,
+ hsh_idx, pe);
+ res |= hw_mod_hsh_rcp_set(&ndev->be, words[word].ofs, hsh_idx, 0, ofs);
+ NT_LOG(DBG, FILTER, "hw_mod_hsh_rcp_set(&ndev->be, %d, %d, 0, %d)", words[word].ofs,
+ hsh_idx, ofs);
+
+
+ /* set HW_HSH_RCP_WORD_MASK based on used QW/W and given 'bit_len' */
+ int mask_bit_len = bit_len;
+ uint32_t mask = 0x0;
+ uint32_t toeplitz_mask[TOEPLITS_HSH_SIZE] = {0x0};
+ /* iterate through all words of QW */
+ uint16_t words_count = words[word].bit_len / 32;
+ for (uint16_t mask_off = 1; mask_off <= words_count; mask_off++) {
+ if (mask_bit_len >= 32) {
+ mask_bit_len -= 32;
+ mask = 0xffffffff;
+ } else if (mask_bit_len > 0) {
+ mask = 0xffffffff >> (32 - mask_bit_len) << (32 - mask_bit_len);
+ mask_bit_len = 0;
+ } else {
+ mask = 0x0;
+ }
+ /* reorder QW words mask from little to big endian */
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx,
+ words[word].index + words_count - mask_off, mask);
+ NT_LOG(DBG, FILTER,
+ "hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, %d, %d, 0x%08" PRIX32 ")",
+ hsh_idx, words[word].index + words_count - mask_off, mask);
+ toeplitz_mask[words[word].index + mask_off - 1] = mask;
+ }
+ if (toeplitz) {
+ NT_LOG(DBG, FILTER,
+ "Partial Toeplitz RSS key mask: %08" PRIX32 " %08" PRIX32 " %08" PRIX32
+ " %08" PRIX32 " %08" PRIX32 " %08" PRIX32 " %08" PRIX32 " %08" PRIX32
+ " %08" PRIX32 "",
+ toeplitz_mask[0], toeplitz_mask[1], toeplitz_mask[2], toeplitz_mask[3],
+ toeplitz_mask[4], toeplitz_mask[5], toeplitz_mask[6], toeplitz_mask[7],
+ toeplitz_mask[8]);
+ NT_LOG(DBG, FILTER, " MSB LSB");
+ }
+ return res;
+}
+
+static __rte_always_inline bool all_bits_enabled(uint64_t hash_mask, uint64_t hash_bits)
+{
+ return (hash_mask & hash_bits) == hash_bits;
+}
+
+static __rte_always_inline void unset_bits(uint64_t *hash_mask, uint64_t hash_bits)
+{
+ *hash_mask &= ~hash_bits;
+}
+
+static __rte_always_inline void unset_bits_and_log(uint64_t *hash_mask, uint64_t hash_bits)
+{
+ char rss_buffer[4096];
+ uint16_t rss_buffer_len = sizeof(rss_buffer);
+
+ if (sprint_nt_rss_mask(rss_buffer, rss_buffer_len, " ", *hash_mask & hash_bits) == 0)
+ NT_LOG(DBG, FILTER, "Configured RSS types:%s", rss_buffer);
+ unset_bits(hash_mask, hash_bits);
+}
+
+static __rte_always_inline void unset_bits_if_all_enabled(uint64_t *hash_mask, uint64_t hash_bits)
+{
+ if (all_bits_enabled(*hash_mask, hash_bits))
+ unset_bits(hash_mask, hash_bits);
+}
+
+int hsh_set(struct flow_nic_dev *ndev, int hsh_idx, struct nt_eth_rss_conf rss_conf)
+{
+ uint64_t fields = rss_conf.rss_hf;
+
+ char rss_buffer[4096];
+ uint16_t rss_buffer_len = sizeof(rss_buffer);
+
+ if (sprint_nt_rss_mask(rss_buffer, rss_buffer_len, " ", fields) == 0)
+ NT_LOG(DBG, FILTER, "Requested RSS types:%s", rss_buffer);
+
+ /*
+ * configure all (Q)Words usable for hash calculation
+ * Hash can be calculated from 4 independent header parts:
+ * | QW0 | Qw4 | W8| W9|
+ * word | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+ */
+ struct hsh_words words[HSH_WORDS_SIZE] = {
+ { 0, HW_HSH_RCP_QW0_PE, HW_HSH_RCP_QW0_OFS, 128, true },
+ { 4, HW_HSH_RCP_QW4_PE, HW_HSH_RCP_QW4_OFS, 128, true },
+ { 8, HW_HSH_RCP_W8_PE, HW_HSH_RCP_W8_OFS, 32, true },
+ /* not supported for Toeplitz */
+ { 9, HW_HSH_RCP_W9_PE, HW_HSH_RCP_W9_OFS, 32, true },
+ };
+
+ int res = 0;
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_PRESET_ALL, hsh_idx, 0, 0);
+ /* enable hashing */
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_LOAD_DIST_TYPE, hsh_idx, 0, 2);
+
+ /* configure selected hash function and its key */
+ bool toeplitz = false;
+ switch (rss_conf.algorithm) {
+ case RTE_ETH_HASH_FUNCTION_DEFAULT:
+ /* Use default NTH10 hashing algorithm */
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_TOEPLITZ, hsh_idx, 0, 0);
+ /* Use 1st 32-bits from rss_key to configure NTH10 SEED */
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_SEED, hsh_idx, 0,
+ rss_conf.rss_key[0] << 24 | rss_conf.rss_key[1] << 16 |
+ rss_conf.rss_key[2] << 8 | rss_conf.rss_key[3]);
+ break;
+ case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
+ toeplitz = true;
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_TOEPLITZ, hsh_idx, 0, 1);
+ uint8_t empty_key = 0;
+
+ /* Toeplitz key (always 40B) words have to be programmed in reverse order */
+ for (uint8_t i = 0; i <= (MAX_RSS_KEY_LEN - 4); i += 4) {
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_K, hsh_idx, 9 - i / 4,
+ rss_conf.rss_key[i] << 24 | rss_conf.rss_key[i + 1] << 16 |
+ rss_conf.rss_key[i + 2] << 8 | rss_conf.rss_key[i + 3]);
+ NT_LOG(DBG, FILTER,
+ "hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_K, %d, %d, 0x%" PRIX32 ")",
+ hsh_idx, 9 - i / 4, rss_conf.rss_key[i] << 24 |
+ rss_conf.rss_key[i + 1] << 16 | rss_conf.rss_key[i + 2] << 8 |
+ rss_conf.rss_key[i + 3]);
+ empty_key |= rss_conf.rss_key[i] | rss_conf.rss_key[i + 1] |
+ rss_conf.rss_key[i + 2] | rss_conf.rss_key[i + 3];
+ }
+
+ if (empty_key == 0) {
+ NT_LOG(ERR, FILTER, "Toeplitz key must be configured. Key with all bytes set to zero is not allowed.");
+ return -1;
+ }
+ words[HSH_WORDS_W9].free = false;
+ NT_LOG(DBG, FILTER, "Toeplitz hashing is enabled thus W9 and P_MASK cannot be used.");
+ break;
+ default:
+ NT_LOG(ERR, FILTER, "Unknown hashing function %d requested", rss_conf.algorithm);
+ return -1;
+ }
+
+ /* indication that some IPv6 flag is present */
+ bool ipv6 = fields & (NT_ETH_RSS_IPV6_MASK);
+ /* store proto mask for later use at IP and L4 checksum handling */
+ uint64_t l4_proto_mask = fields &
+ (RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV4_UDP |
+ RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_NONFRAG_IPV4_OTHER |
+ RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_NONFRAG_IPV6_UDP |
+ RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_NONFRAG_IPV6_OTHER |
+ RTE_ETH_RSS_IPV6_TCP_EX | RTE_ETH_RSS_IPV6_UDP_EX);
+
+ /* outermost headers are used by default, so innermost bit takes precedence if detected */
+ bool outer = (fields & RTE_ETH_RSS_LEVEL_INNERMOST) ? false : true;
+ unset_bits(&fields, RTE_ETH_RSS_LEVEL_MASK);
+
+ if (fields == 0) {
+ NT_LOG(ERR, FILTER, "RSS hash configuration 0x%" PRIX64 " is not valid.",
+ rss_conf.rss_hf);
+ return -1;
+ }
+
+ /* indication that IPv4 `protocol` or IPv6 `next header` fields shall be part of the hash */
+ bool l4_proto_hash = false;
+
+ /*
+ * check if SRC_ONLY & DST_ONLY are used simultaneously;
+ * According to DPDK, we shall behave like none of these bits is set
+ */
+ unset_bits_if_all_enabled(&fields, RTE_ETH_RSS_L2_SRC_ONLY | RTE_ETH_RSS_L2_DST_ONLY);
+ unset_bits_if_all_enabled(&fields, RTE_ETH_RSS_L3_SRC_ONLY | RTE_ETH_RSS_L3_DST_ONLY);
+ unset_bits_if_all_enabled(&fields, RTE_ETH_RSS_L4_SRC_ONLY | RTE_ETH_RSS_L4_DST_ONLY);
+
+ /* L2 */
+ if (fields & (RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2_SRC_ONLY | RTE_ETH_RSS_L2_DST_ONLY)) {
+ if (outer) {
+ if (fields & RTE_ETH_RSS_L2_SRC_ONLY) {
+ NT_LOG(DBG, FILTER, "Set outer src MAC hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L2,
+ 6, 48, toeplitz);
+ } else if (fields & RTE_ETH_RSS_L2_DST_ONLY) {
+ NT_LOG(DBG, FILTER, "Set outer dst MAC hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L2,
+ 0, 48, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set outer src & dst MAC hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L2,
+ 0, 96, toeplitz);
+ }
+ } else {
+ if (fields & RTE_ETH_RSS_L2_SRC_ONLY) {
+ NT_LOG(DBG, FILTER, "Set inner src MAC hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L2,
+ 6, 48, toeplitz);
+ } else if (fields & RTE_ETH_RSS_L2_DST_ONLY) {
+ NT_LOG(DBG, FILTER, "Set inner dst MAC hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L2,
+ 0, 48, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner src & dst MAC hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L2,
+ 0, 96, toeplitz);
+ }
+ }
+ unset_bits_and_log(&fields, RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2_SRC_ONLY |
+ RTE_ETH_RSS_L2_DST_ONLY);
+ }
+
+ /*
+ * VLAN support of multiple VLAN headers,
+ * where S-VLAN is the first and C-VLAN the last VLAN header
+ */
+ if (fields & RTE_ETH_RSS_C_VLAN) {
+ /*
+ * use MPLS protocol offset, which points
+ * just after ethertype with relative
+ * offset -6 (i.e. 2 bytes
+ * of ethertype & size + 4 bytes of VLAN header field)
+ * to access last vlan header
+ */
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer C-VLAN hasher.");
+ /*
+ * use whole 32-bit 802.1a tag - backward compatible
+ * with VSWITCH implementation
+ */
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_MPLS,
+ -6, 32, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner C-VLAN hasher.");
+ /*
+ * use whole 32-bit 802.1a tag - backward compatible
+ * with VSWITCH implementation
+ */
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_MPLS,
+ -6, 32, toeplitz);
+ }
+ unset_bits_and_log(&fields, RTE_ETH_RSS_C_VLAN);
+ }
+
+ if (fields & RTE_ETH_RSS_S_VLAN) {
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer S-VLAN hasher.");
+ /*
+ * use whole 32-bit 802.1a tag - backward compatible
+ * with VSWITCH implementation
+ */
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_FIRST_VLAN,
+ 0, 32, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner S-VLAN hasher.");
+ /*
+ * use whole 32-bit 802.1a tag - backward compatible
+ * with VSWITCH implementation
+ */
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_VLAN,
+ 0, 32, toeplitz);
+ }
+ unset_bits_and_log(&fields, RTE_ETH_RSS_S_VLAN);
+ }
+
+ /* L2 payload */
+ /* calculate hash of 128-bits of l2 payload;
+ * Use MPLS protocol offset to address the beginning
+ * of L2 payload even if MPLS header is not present
+ */
+ if (fields & RTE_ETH_RSS_L2_PAYLOAD) {
+ uint64_t outer_fields_enabled = 0;
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer L2 payload hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_MPLS,
+ 0, 128, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner L2 payload hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_MPLS,
+ 0, 128, toeplitz);
+ outer_fields_enabled = fields & RTE_ETH_RSS_GTPU;
+ }
+ /*
+ * L2 PAYLOAD hashing overrides all L3 & L4 RSS flags.
+ * Thus we can clear all remaining (supported)
+ * RSS flags...
+ */
+ unset_bits_and_log(&fields, NT_ETH_RSS_OFFLOAD_MASK);
+ /*
+ * ...but in case of INNER L2 PAYLOAD we must process
+ * "always outer" GTPU field if enabled
+ */
+ fields |= outer_fields_enabled;
+ }
+
+ /* L3 + L4 protocol number */
+ if (fields & RTE_ETH_RSS_IPV4_CHKSUM) {
+ /* only IPv4 checksum is supported by DPDK RTE_ETH_RSS_* types */
+ if (ipv6) {
+ NT_LOG(ERR, FILTER, "RSS: IPv4 checksum requested with IPv6 header hashing!");
+ res = 1;
+ } else {
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer IPv4 checksum hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L3,
+ 10, 16, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner IPv4 checksum hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L3,
+ 10, 16, toeplitz);
+ }
+ }
+ /*
+ * L3 checksum is made from whole L3 header, i.e. no need to process other
+ * L3 hashing flags
+ */
+ unset_bits_and_log(&fields, RTE_ETH_RSS_IPV4_CHKSUM | NT_ETH_RSS_IP_MASK);
+ }
+
+ if (fields & NT_ETH_RSS_IP_MASK) {
+ if (ipv6) {
+ if (outer) {
+ if (fields & RTE_ETH_RSS_L3_SRC_ONLY) {
+ NT_LOG(DBG, FILTER, "Set outer IPv6/IPv4 src hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_FINAL_IP_DST,
+ -16, 128, toeplitz);
+ } else if (fields & RTE_ETH_RSS_L3_DST_ONLY) {
+ NT_LOG(DBG, FILTER, "Set outer IPv6/IPv4 dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_FINAL_IP_DST,
+ 0, 128, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set outer IPv6/IPv4 src & dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_FINAL_IP_DST,
+ -16, 128, toeplitz);
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_FINAL_IP_DST,
+ 0, 128, toeplitz);
+ }
+ } else {
+ if (fields & RTE_ETH_RSS_L3_SRC_ONLY) {
+ NT_LOG(DBG, FILTER, "Set inner IPv6/IPv4 src hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words,
+ DYN_TUN_FINAL_IP_DST, -16, 128, toeplitz);
+ } else if (fields & RTE_ETH_RSS_L3_DST_ONLY) {
+ NT_LOG(DBG, FILTER, "Set inner IPv6/IPv4 dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words,
+ DYN_TUN_FINAL_IP_DST, 0, 128, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner IPv6/IPv4 src & dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words,
+ DYN_TUN_FINAL_IP_DST, -16, 128, toeplitz);
+ res |= hsh_set_part(ndev, hsh_idx, words,
+ DYN_TUN_FINAL_IP_DST, 0, 128, toeplitz);
+ }
+ }
+ /* check if fragment ID shall be part of hash */
+ if (fields & (RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_FRAG_IPV6)) {
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer IPv6/IPv4 fragment ID hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_ID_IPV4_6,
+ 0, 32, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner IPv6/IPv4 fragment ID hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_ID_IPV4_6,
+ 0, 32, toeplitz);
+ }
+ }
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_AUTO_IPV4_MASK,
+ hsh_idx, 0, 1);
+ } else {
+ /* IPv4 */
+ if (outer) {
+ if (fields & RTE_ETH_RSS_L3_SRC_ONLY) {
+ NT_LOG(DBG, FILTER, "Set outer IPv4 src only hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L3,
+ 12, 32, toeplitz);
+ } else if (fields & RTE_ETH_RSS_L3_DST_ONLY) {
+ NT_LOG(DBG, FILTER, "Set outer IPv4 dst only hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L3,
+ 16, 32, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set outer IPv4 src & dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L3,
+ 12, 64, toeplitz);
+ }
+ } else {
+ if (fields & RTE_ETH_RSS_L3_SRC_ONLY) {
+ NT_LOG(DBG, FILTER, "Set inner IPv4 src only hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L3,
+ 12, 32, toeplitz);
+ } else if (fields & RTE_ETH_RSS_L3_DST_ONLY) {
+ NT_LOG(DBG, FILTER, "Set inner IPv4 dst only hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L3,
+ 16, 32, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner IPv4 src & dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L3,
+ 12, 64, toeplitz);
+ }
+ }
+ /* check if fragment ID shall be part of hash */
+ if (fields & RTE_ETH_RSS_FRAG_IPV4) {
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer IPv4 fragment ID hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_ID_IPV4_6,
+ 0, 16, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner IPv4 fragment ID hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_ID_IPV4_6,
+ 0, 16, toeplitz);
+ }
+ }
+ }
+
+ /* check if L4 protocol type shall be part of hash */
+ if (l4_proto_mask)
+ l4_proto_hash = true;
+ unset_bits_and_log(&fields, NT_ETH_RSS_IP_MASK);
+ }
+
+ /* L4 */
+ if (fields & (RTE_ETH_RSS_PORT | RTE_ETH_RSS_L4_SRC_ONLY |
+ RTE_ETH_RSS_L4_DST_ONLY)) {
+ if (outer) {
+ if (fields & RTE_ETH_RSS_L4_SRC_ONLY) {
+ NT_LOG(DBG, FILTER, "Set outer L4 src hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L4,
+ 0, 16, toeplitz);
+ } else if (fields & RTE_ETH_RSS_L4_DST_ONLY) {
+ NT_LOG(DBG, FILTER, "Set outer L4 dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L4,
+ 2, 16, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set outer L4 src & dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L4,
+ 0, 32, toeplitz);
+ }
+ } else {
+ if (fields & RTE_ETH_RSS_L4_SRC_ONLY) {
+ NT_LOG(DBG, FILTER, "Set inner L4 src hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L4,
+ 0, 16, toeplitz);
+ } else if (fields & RTE_ETH_RSS_L4_DST_ONLY) {
+ NT_LOG(DBG, FILTER, "Set inner L4 dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L4,
+ 2, 16, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner L4 src & dst hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L4,
+ 0, 32, toeplitz);
+ }
+ }
+ l4_proto_hash = true;
+ unset_bits_and_log(&fields, RTE_ETH_RSS_PORT | RTE_ETH_RSS_L4_SRC_ONLY |
+ RTE_ETH_RSS_L4_DST_ONLY);
+ }
+
+ /* IPv4 protocol / IPv6 next header fields */
+ if (l4_proto_hash) {
+ /* NOTE: HW_HSH_RCP_P_MASK is not supported for
+ *Toeplitz and thus one of SW0, SW4 or W8
+ * must be used to hash on `protocol` field of IPv4 or
+ * `next header` field of IPv6 header.
+ */
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer L4 protocol type / next header hasher.");
+ if (toeplitz) {
+ if (ipv6)
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L3, 6, 8,
+ toeplitz);
+ else
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L3, 9, 8,
+ toeplitz);
+ } else {
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_P_MASK,
+ hsh_idx, 0, 1);
+ res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_TNL_P,
+ hsh_idx, 0, 0);
+ }
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner L4 protocol type / next header hasher.");
+ if (toeplitz) {
+ if (ipv6) {
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L3, 6, 8,
+ toeplitz);
+ } else {
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L3, 9, 8,
+ toeplitz);
+ }
+ } else {
+ res |= hw_mod_hsh_rcp_set(&ndev->be,
+ HW_HSH_RCP_P_MASK, hsh_idx, 0, 1);
+ res |= hw_mod_hsh_rcp_set(&ndev->be,
+ HW_HSH_RCP_TNL_P, hsh_idx, 0, 1);
+ }
+ }
+ l4_proto_hash = false;
+ }
+
+ /*
+ * GTPU - for UPF use cases we always use TEID from outermost GTPU header
+ * even if other headers are innermost
+ */
+ if (fields & RTE_ETH_RSS_GTPU) {
+ NT_LOG(DBG, FILTER, "Set outer GTPU TEID hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L4_PAYLOAD, 4, 32, toeplitz);
+ unset_bits_and_log(&fields, RTE_ETH_RSS_GTPU);
+ }
+
+ /* Checksums */
+ /* only UDP, TCP and SCTP checksums are supported */
+ if (fields & RTE_ETH_RSS_L4_CHKSUM) {
+ switch (l4_proto_mask) {
+ case RTE_ETH_RSS_NONFRAG_IPV4_UDP:
+ case RTE_ETH_RSS_NONFRAG_IPV6_UDP:
+ case RTE_ETH_RSS_IPV6_UDP_EX:
+ case RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_NONFRAG_IPV6_UDP:
+ case RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_IPV6_UDP_EX:
+ case RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_IPV6_UDP_EX:
+ case RTE_ETH_RSS_UDP_COMBINED:
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer UDP checksum hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L4, 6, 16,
+ toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner UDP checksum hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L4, 6, 16,
+ toeplitz);
+ }
+ unset_bits_and_log(&fields, RTE_ETH_RSS_L4_CHKSUM | l4_proto_mask);
+ break;
+ case RTE_ETH_RSS_NONFRAG_IPV4_TCP:
+ case RTE_ETH_RSS_NONFRAG_IPV6_TCP:
+ case RTE_ETH_RSS_IPV6_TCP_EX:
+ case RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV6_TCP:
+ case RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_IPV6_TCP_EX:
+ case RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_IPV6_TCP_EX:
+ case RTE_ETH_RSS_TCP_COMBINED:
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer TCP checksum hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words,
+ DYN_L4, 16, 16, toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner TCP checksum hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words,
+ DYN_TUN_L4, 16, 16, toeplitz);
+ }
+ unset_bits_and_log(&fields, RTE_ETH_RSS_L4_CHKSUM | l4_proto_mask);
+ break;
+ case RTE_ETH_RSS_NONFRAG_IPV4_SCTP:
+ case RTE_ETH_RSS_NONFRAG_IPV6_SCTP:
+ case RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_NONFRAG_IPV6_SCTP:
+ if (outer) {
+ NT_LOG(DBG, FILTER, "Set outer SCTP checksum hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_L4, 8, 32,
+ toeplitz);
+ } else {
+ NT_LOG(DBG, FILTER, "Set inner SCTP checksum hasher.");
+ res |= hsh_set_part(ndev, hsh_idx, words, DYN_TUN_L4, 8, 32,
+ toeplitz);
+ }
+ unset_bits_and_log(&fields, RTE_ETH_RSS_L4_CHKSUM | l4_proto_mask);
+ break;
+ case RTE_ETH_RSS_NONFRAG_IPV4_OTHER:
+ case RTE_ETH_RSS_NONFRAG_IPV6_OTHER:
+ /* none or unsupported protocol was chosen */
+ case 0:
+ NT_LOG(ERR, FILTER, "L4 checksum hashing is supported only for UDP, TCP and SCTP protocols");
+ res = -1;
+ break;
+ /* multiple L4 protocols were selected */
+ default:
+ NT_LOG(ERR, FILTER, "L4 checksum hashing can be enabled just for one of UDP, TCP or SCTP protocols");
+ res = -1;
+ break;
+ }
+ }
+
+ if (fields || res != 0) {
+ hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_PRESET_ALL, hsh_idx, 0, 0);
+ if (sprint_nt_rss_mask(rss_buffer, rss_buffer_len, " ", rss_conf.rss_hf) == 0) {
+ NT_LOG(ERR, FILTER, "RSS configuration%s is not supported for hash func %s.",
+ rss_buffer, (enum rte_eth_hash_function)toeplitz ?
+ "Toeplitz" : "NTH10");
+ } else {
+ NT_LOG(ERR, FILTER, "RSS configuration 0x%" PRIX64 " is not supported for hash func %s.",
+ rss_conf.rss_hf, (enum rte_eth_hash_function)toeplitz ?
+ "Toeplitz" : "NTH10");
+ }
+ return -1;
+ }
+
+ return res;
+}
diff --git a/drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.h b/drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.h
new file mode 100644
index 0000000000..38901b3e8a
--- /dev/null
+++ b/drivers/net/ntnic/nthw/flow_api/flow_hsh_cfg.h
@@ -0,0 +1,17 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Napatech A/S
+ */
+
+#ifndef _FLOW_HSH_CFG_H_
+#define _FLOW_HSH_CFG_H_
+
+#include <rte_ethdev.h>
+
+#include "hw_mod_backend.h"
+#include "flow_api.h"
+
+int hsh_set(struct flow_nic_dev *ndev, int hsh_idx,
+ struct nt_eth_rss_conf rss_conf);
+
+#endif /* _FLOW_HSH_CFG_H_ */
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_hw_db_inline.c b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_hw_db_inline.c
index ffab643f56..22cbf61b60 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_hw_db_inline.c
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_hw_db_inline.c
@@ -2,13 +2,14 @@
* Copyright(c) 2023 Napatech A/S
*/
+#include "rte_common.h"
#include "hw_mod_backend.h"
#include "flow_api_engine.h"
#include "flow_api_hw_db_inline.h"
#include "flow_api_profile_inline_config.h"
-#include "rte_common.h"
+#include "flow_hsh_cfg.h"
#define HW_DB_INLINE_ACTION_SET_NB 512
#define HW_DB_INLINE_MATCH_SET_NB 512
@@ -2844,7 +2845,7 @@ struct hw_db_hsh_idx hw_db_inline_hsh_add(struct flow_nic_dev *ndev, void *db_ha
tmp_rss_conf.rss_hf = data->hash_mask;
memcpy(tmp_rss_conf.rss_key, data->key, MAX_RSS_KEY_LEN);
tmp_rss_conf.algorithm = data->func;
- int res = flow_nic_set_hasher_fields(ndev, idx.ids, tmp_rss_conf);
+ int res = hsh_set(ndev, idx.ids, tmp_rss_conf);
if (res != 0) {
idx.error = 1;
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
index 574e51c2fa..e5abd372bc 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
@@ -20,6 +20,7 @@
#include "flow_api_profile_inline.h"
#include "ntnic_mod_reg.h"
+#include "flow_hsh_cfg.h"
#include <rte_spinlock.h>
#include <rte_common.h>
@@ -44,12 +45,6 @@
#define NT_VIOLATING_MBR_CFN 0
#define NT_VIOLATING_MBR_QSL 1
-#define RTE_ETH_RSS_UDP_COMBINED \
- (RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_IPV6_UDP_EX)
-
-#define RTE_ETH_RSS_TCP_COMBINED \
- (RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_IPV6_TCP_EX)
-
#define NT_FLM_OP_UNLEARN 0
#define NT_FLM_OP_LEARN 1
@@ -3809,116 +3804,6 @@ static struct flow_handle *create_flow_filter(struct flow_eth_dev *dev, struct n
return NULL;
}
-/*
- * FPGA uses up to 10 32-bit words (320 bits) for hash calculation + 8 bits for L4 protocol number.
- * Hashed data are split between two 128-bit Quad Words (QW)
- * and two 32-bit Words (W), which can refer to different header parts.
- */
-enum hsh_words_id {
- HSH_WORDS_QW0 = 0,
- HSH_WORDS_QW4,
- HSH_WORDS_W8,
- HSH_WORDS_W9,
- HSH_WORDS_SIZE,
-};
-
-/* struct with details about hash QWs & Ws */
-struct hsh_words {
- /*
- * index of W (word) or index of 1st word of QW (quad word)
- * is used for hash mask calculation
- */
- uint8_t index;
- enum hw_hsh_e pe; /* offset to header part, e.g. beginning of L4 */
- enum hw_hsh_e ofs; /* relative offset in BYTES to 'pe' header offset above */
- uint16_t bit_len; /* max length of header part in bits to fit into QW/W */
- bool free; /* only free words can be used for hsh calculation */
-};
-
-static enum hsh_words_id get_free_word(struct hsh_words *words, uint16_t bit_len)
-{
- enum hsh_words_id ret = HSH_WORDS_SIZE;
- uint16_t ret_bit_len = UINT16_MAX;
-
- for (enum hsh_words_id i = HSH_WORDS_QW0; i < HSH_WORDS_SIZE; i++) {
- if (words[i].free && bit_len <= words[i].bit_len &&
- words[i].bit_len < ret_bit_len) {
- ret = i;
- ret_bit_len = words[i].bit_len;
- }
- }
-
- return ret;
-}
-
-static int flow_nic_set_hasher_part_inline(struct flow_nic_dev *ndev, int hsh_idx,
- struct hsh_words *words, uint32_t pe, uint32_t ofs,
- int bit_len, bool toeplitz)
-{
- int res = 0;
-
- /* check if there is any free word, which can accommodate header part of given 'bit_len' */
- enum hsh_words_id word = get_free_word(words, bit_len);
-
- if (word == HSH_WORDS_SIZE) {
- NT_LOG(ERR, FILTER, "Cannot add additional %d bits into hash", bit_len);
- return -1;
- }
-
- words[word].free = false;
-
- res |= hw_mod_hsh_rcp_set(&ndev->be, words[word].pe, hsh_idx, 0, pe);
- NT_LOG(DBG, FILTER, "hw_mod_hsh_rcp_set(&ndev->be, %d, %d, 0, %d)", words[word].pe,
- hsh_idx, pe);
- res |= hw_mod_hsh_rcp_set(&ndev->be, words[word].ofs, hsh_idx, 0, ofs);
- NT_LOG(DBG, FILTER, "hw_mod_hsh_rcp_set(&ndev->be, %d, %d, 0, %d)", words[word].ofs,
- hsh_idx, ofs);
-
- /* set HW_HSH_RCP_WORD_MASK based on used QW/W and given 'bit_len' */
- int mask_bit_len = bit_len;
- uint32_t mask = 0x0;
- uint32_t toeplitz_mask[9] = { 0x0 };
- /* iterate through all words of QW */
- uint16_t words_count = words[word].bit_len / 32;
-
- for (uint16_t mask_off = 1; mask_off <= words_count; mask_off++) {
- if (mask_bit_len >= 32) {
- mask_bit_len -= 32;
- mask = 0xffffffff;
-
- } else if (mask_bit_len > 0) {
- mask = 0xffffffff >> (32 - mask_bit_len) << (32 - mask_bit_len);
- mask_bit_len = 0;
-
- } else {
- mask = 0x0;
- }
-
- /* reorder QW words mask from little to big endian */
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, hsh_idx,
- words[word].index + words_count - mask_off, mask);
- NT_LOG_DBGX(DBG, FILTER,
- "hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_WORD_MASK, %d, %d, 0x%08" PRIX32
- ")",
- hsh_idx, words[word].index + words_count - mask_off, mask);
- toeplitz_mask[words[word].index + mask_off - 1] = mask;
- }
-
- if (toeplitz) {
- NT_LOG(DBG, FILTER,
- "Partial Toeplitz RSS key mask: %08" PRIX32 " %08" PRIX32 " %08" PRIX32
- " %08" PRIX32 " %08" PRIX32 " %08" PRIX32 " %08" PRIX32 " %08" PRIX32
- " %08" PRIX32 "",
- toeplitz_mask[0], toeplitz_mask[1], toeplitz_mask[2], toeplitz_mask[3],
- toeplitz_mask[4], toeplitz_mask[5], toeplitz_mask[6], toeplitz_mask[7],
- toeplitz_mask[8]);
- NT_LOG(DBG, FILTER,
- " MSB LSB");
- }
-
- return res;
-}
-
/*
* Public functions
*/
@@ -3982,8 +3867,16 @@ int initialize_flow_management_of_ndev_profile_inline(struct flow_nic_dev *ndev)
flow_nic_mark_resource_used(ndev, RES_PDB_RCP, 0);
- /* Set default hasher recipe to 5-tuple */
- flow_nic_set_hasher(ndev, 0, HASH_ALGO_5TUPLE);
+ /* Set default hasher recipe to 5-tuple:
+ * RTE_ETH_RSS_IPV6 - enables hashing on both IPv4/IPv6 SA and DA
+ * RTE_ETH_RSS_PORT - enables hashing on both L4 SP and DP and L4 protocol type
+ */
+ struct nt_eth_rss_conf hsh_5_tuple = {
+ .rss_key = {},
+ .rss_hf = RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_PORT,
+ .algorithm = 0,
+ };
+ hsh_set(ndev, 0, hsh_5_tuple);
hw_mod_hsh_rcp_flush(&ndev->be, 0, 1);
flow_nic_mark_resource_used(ndev, RES_HSH_RCP, 0);
@@ -4580,658 +4473,6 @@ int flow_actions_update_profile_inline(struct flow_eth_dev *dev,
return -1;
}
-static __rte_always_inline bool all_bits_enabled(uint64_t hash_mask, uint64_t hash_bits)
-{
- return (hash_mask & hash_bits) == hash_bits;
-}
-
-static __rte_always_inline void unset_bits(uint64_t *hash_mask, uint64_t hash_bits)
-{
- *hash_mask &= ~hash_bits;
-}
-
-static __rte_always_inline void unset_bits_and_log(uint64_t *hash_mask, uint64_t hash_bits)
-{
- char rss_buffer[4096];
- uint16_t rss_buffer_len = sizeof(rss_buffer);
-
- if (sprint_nt_rss_mask(rss_buffer, rss_buffer_len, " ", *hash_mask & hash_bits) == 0)
- NT_LOG(DBG, FILTER, "Configured RSS types:%s", rss_buffer);
-
- unset_bits(hash_mask, hash_bits);
-}
-
-static __rte_always_inline void unset_bits_if_all_enabled(uint64_t *hash_mask, uint64_t hash_bits)
-{
- if (all_bits_enabled(*hash_mask, hash_bits))
- unset_bits(hash_mask, hash_bits);
-}
-
-int flow_nic_set_hasher_fields_inline(struct flow_nic_dev *ndev, int hsh_idx,
- struct nt_eth_rss_conf rss_conf)
-{
- uint64_t fields = rss_conf.rss_hf;
-
- char rss_buffer[4096];
- uint16_t rss_buffer_len = sizeof(rss_buffer);
-
- if (sprint_nt_rss_mask(rss_buffer, rss_buffer_len, " ", fields) == 0)
- NT_LOG(DBG, FILTER, "Requested RSS types:%s", rss_buffer);
-
- /*
- * configure all (Q)Words usable for hash calculation
- * Hash can be calculated from 4 independent header parts:
- * | QW0 | Qw4 | W8| W9|
- * word | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
- */
- struct hsh_words words[HSH_WORDS_SIZE] = {
- { 0, HW_HSH_RCP_QW0_PE, HW_HSH_RCP_QW0_OFS, 128, true },
- { 4, HW_HSH_RCP_QW4_PE, HW_HSH_RCP_QW4_OFS, 128, true },
- { 8, HW_HSH_RCP_W8_PE, HW_HSH_RCP_W8_OFS, 32, true },
- {
- 9, HW_HSH_RCP_W9_PE, HW_HSH_RCP_W9_OFS, 32,
- true
- }, /* not supported for Toeplitz */
- };
-
- int res = 0;
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_PRESET_ALL, hsh_idx, 0, 0);
- /* enable hashing */
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_LOAD_DIST_TYPE, hsh_idx, 0, 2);
-
- /* configure selected hash function and its key */
- bool toeplitz = false;
-
- switch (rss_conf.algorithm) {
- case RTE_ETH_HASH_FUNCTION_DEFAULT:
- /* Use default NTH10 hashing algorithm */
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_TOEPLITZ, hsh_idx, 0, 0);
- /* Use 1st 32-bits from rss_key to configure NTH10 SEED */
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_SEED, hsh_idx, 0,
- rss_conf.rss_key[0] << 24 | rss_conf.rss_key[1] << 16 |
- rss_conf.rss_key[2] << 8 | rss_conf.rss_key[3]);
- break;
-
- case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
- toeplitz = true;
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_TOEPLITZ, hsh_idx, 0, 1);
- uint8_t empty_key = 0;
-
- /* Toeplitz key (always 40B) words have to be programmed in reverse order */
- for (uint8_t i = 0; i <= (MAX_RSS_KEY_LEN - 4); i += 4) {
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_K, hsh_idx, 9 - i / 4,
- rss_conf.rss_key[i] << 24 |
- rss_conf.rss_key[i + 1] << 16 |
- rss_conf.rss_key[i + 2] << 8 |
- rss_conf.rss_key[i + 3]);
- NT_LOG_DBG(DBG, FILTER,
- "hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_K, %d, %d, 0x%" PRIX32
- ")",
- hsh_idx, 9 - i / 4,
- rss_conf.rss_key[i] << 24 | rss_conf.rss_key[i + 1] << 16 |
- rss_conf.rss_key[i + 2] << 8 | rss_conf.rss_key[i + 3]);
- empty_key |= rss_conf.rss_key[i] | rss_conf.rss_key[i + 1] |
- rss_conf.rss_key[i + 2] | rss_conf.rss_key[i + 3];
- }
-
- if (empty_key == 0) {
- NT_LOG(ERR, FILTER,
- "Toeplitz key must be configured. Key with all bytes set to zero is not allowed.");
- return -1;
- }
-
- words[HSH_WORDS_W9].free = false;
- NT_LOG(DBG, FILTER,
- "Toeplitz hashing is enabled thus W9 and P_MASK cannot be used.");
- break;
-
- default:
- NT_LOG(ERR, FILTER, "Unknown hashing function %d requested", rss_conf.algorithm);
- return -1;
- }
-
- /* indication that some IPv6 flag is present */
- bool ipv6 = fields & (NT_ETH_RSS_IPV6_MASK);
- /* store proto mask for later use at IP and L4 checksum handling */
- uint64_t l4_proto_mask = fields &
- (RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV4_UDP |
- RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_NONFRAG_IPV4_OTHER |
- RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_NONFRAG_IPV6_UDP |
- RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_NONFRAG_IPV6_OTHER |
- RTE_ETH_RSS_IPV6_TCP_EX | RTE_ETH_RSS_IPV6_UDP_EX);
-
- /* outermost headers are used by default, so innermost bit takes precedence if detected */
- bool outer = (fields & RTE_ETH_RSS_LEVEL_INNERMOST) ? false : true;
- unset_bits(&fields, RTE_ETH_RSS_LEVEL_MASK);
-
- if (fields == 0) {
- NT_LOG(ERR, FILTER, "RSS hash configuration 0x%" PRIX64 " is not valid.",
- rss_conf.rss_hf);
- return -1;
- }
-
- /* indication that IPv4 `protocol` or IPv6 `next header` fields shall be part of the hash
- */
- bool l4_proto_hash = false;
-
- /*
- * check if SRC_ONLY & DST_ONLY are used simultaneously;
- * According to DPDK, we shall behave like none of these bits is set
- */
- unset_bits_if_all_enabled(&fields, RTE_ETH_RSS_L2_SRC_ONLY | RTE_ETH_RSS_L2_DST_ONLY);
- unset_bits_if_all_enabled(&fields, RTE_ETH_RSS_L3_SRC_ONLY | RTE_ETH_RSS_L3_DST_ONLY);
- unset_bits_if_all_enabled(&fields, RTE_ETH_RSS_L4_SRC_ONLY | RTE_ETH_RSS_L4_DST_ONLY);
-
- /* L2 */
- if (fields & (RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2_SRC_ONLY | RTE_ETH_RSS_L2_DST_ONLY)) {
- if (outer) {
- if (fields & RTE_ETH_RSS_L2_SRC_ONLY) {
- NT_LOG(DBG, FILTER, "Set outer src MAC hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L2, 6, 48, toeplitz);
-
- } else if (fields & RTE_ETH_RSS_L2_DST_ONLY) {
- NT_LOG(DBG, FILTER, "Set outer dst MAC hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L2, 0, 48, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set outer src & dst MAC hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L2, 0, 96, toeplitz);
- }
-
- } else if (fields & RTE_ETH_RSS_L2_SRC_ONLY) {
- NT_LOG(DBG, FILTER, "Set inner src MAC hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_L2, 6,
- 48, toeplitz);
-
- } else if (fields & RTE_ETH_RSS_L2_DST_ONLY) {
- NT_LOG(DBG, FILTER, "Set inner dst MAC hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_L2, 0,
- 48, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner src & dst MAC hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_L2, 0,
- 96, toeplitz);
- }
-
- unset_bits_and_log(&fields,
- RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2_SRC_ONLY |
- RTE_ETH_RSS_L2_DST_ONLY);
- }
-
- /*
- * VLAN support of multiple VLAN headers,
- * where S-VLAN is the first and C-VLAN the last VLAN header
- */
- if (fields & RTE_ETH_RSS_C_VLAN) {
- /*
- * use MPLS protocol offset, which points just after ethertype with relative
- * offset -6 (i.e. 2 bytes
- * of ethertype & size + 4 bytes of VLAN header field) to access last vlan header
- */
- if (outer) {
- NT_LOG(DBG, FILTER, "Set outer C-VLAN hasher.");
- /*
- * use whole 32-bit 802.1a tag - backward compatible
- * with VSWITCH implementation
- */
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_MPLS, -6,
- 32, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner C-VLAN hasher.");
- /*
- * use whole 32-bit 802.1a tag - backward compatible
- * with VSWITCH implementation
- */
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_MPLS,
- -6, 32, toeplitz);
- }
-
- unset_bits_and_log(&fields, RTE_ETH_RSS_C_VLAN);
- }
-
- if (fields & RTE_ETH_RSS_S_VLAN) {
- if (outer) {
- NT_LOG(DBG, FILTER, "Set outer S-VLAN hasher.");
- /*
- * use whole 32-bit 802.1a tag - backward compatible
- * with VSWITCH implementation
- */
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_FIRST_VLAN, 0, 32, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner S-VLAN hasher.");
- /*
- * use whole 32-bit 802.1a tag - backward compatible
- * with VSWITCH implementation
- */
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_VLAN,
- 0, 32, toeplitz);
- }
-
- unset_bits_and_log(&fields, RTE_ETH_RSS_S_VLAN);
- }
- /* L2 payload */
- /* calculate hash of 128-bits of l2 payload; Use MPLS protocol offset to address the
- * beginning of L2 payload even if MPLS header is not present
- */
- if (fields & RTE_ETH_RSS_L2_PAYLOAD) {
- uint64_t outer_fields_enabled = 0;
-
- if (outer) {
- NT_LOG(DBG, FILTER, "Set outer L2 payload hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_MPLS, 0,
- 128, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner L2 payload hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_MPLS,
- 0, 128, toeplitz);
- outer_fields_enabled = fields & RTE_ETH_RSS_GTPU;
- }
-
- /*
- * L2 PAYLOAD hashing overrides all L3 & L4 RSS flags.
- * Thus we can clear all remaining (supported)
- * RSS flags...
- */
- unset_bits_and_log(&fields, NT_ETH_RSS_OFFLOAD_MASK);
- /*
- * ...but in case of INNER L2 PAYLOAD we must process
- * "always outer" GTPU field if enabled
- */
- fields |= outer_fields_enabled;
- }
-
- /* L3 + L4 protocol number */
- if (fields & RTE_ETH_RSS_IPV4_CHKSUM) {
- /* only IPv4 checksum is supported by DPDK RTE_ETH_RSS_* types */
- if (ipv6) {
- NT_LOG(ERR, FILTER,
- "RSS: IPv4 checksum requested with IPv6 header hashing!");
- res = 1;
-
- } else if (outer) {
- NT_LOG(DBG, FILTER, "Set outer IPv4 checksum hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_L3, 10,
- 16, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner IPv4 checksum hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_L3,
- 10, 16, toeplitz);
- }
-
- /*
- * L3 checksum is made from whole L3 header, i.e. no need to process other
- * L3 hashing flags
- */
- unset_bits_and_log(&fields, RTE_ETH_RSS_IPV4_CHKSUM | NT_ETH_RSS_IP_MASK);
- }
-
- if (fields & NT_ETH_RSS_IP_MASK) {
- if (ipv6) {
- if (outer) {
- if (fields & RTE_ETH_RSS_L3_SRC_ONLY) {
- NT_LOG(DBG, FILTER, "Set outer IPv6/IPv4 src hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words,
- DYN_FINAL_IP_DST,
- -16, 128, toeplitz);
-
- } else if (fields & RTE_ETH_RSS_L3_DST_ONLY) {
- NT_LOG(DBG, FILTER, "Set outer IPv6/IPv4 dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words,
- DYN_FINAL_IP_DST, 0,
- 128, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER,
- "Set outer IPv6/IPv4 src & dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words,
- DYN_FINAL_IP_DST,
- -16, 128, toeplitz);
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words,
- DYN_FINAL_IP_DST, 0,
- 128, toeplitz);
- }
-
- } else if (fields & RTE_ETH_RSS_L3_SRC_ONLY) {
- NT_LOG(DBG, FILTER, "Set inner IPv6/IPv4 src hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_FINAL_IP_DST, -16,
- 128, toeplitz);
-
- } else if (fields & RTE_ETH_RSS_L3_DST_ONLY) {
- NT_LOG(DBG, FILTER, "Set inner IPv6/IPv4 dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_FINAL_IP_DST, 0,
- 128, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner IPv6/IPv4 src & dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_FINAL_IP_DST, -16,
- 128, toeplitz);
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_FINAL_IP_DST, 0,
- 128, toeplitz);
- }
-
- /* check if fragment ID shall be part of hash */
- if (fields & (RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_FRAG_IPV6)) {
- if (outer) {
- NT_LOG(DBG, FILTER,
- "Set outer IPv6/IPv4 fragment ID hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words,
- DYN_ID_IPV4_6, 0,
- 32, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER,
- "Set inner IPv6/IPv4 fragment ID hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words,
- DYN_TUN_ID_IPV4_6,
- 0, 32, toeplitz);
- }
- }
-
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_AUTO_IPV4_MASK, hsh_idx, 0,
- 1);
-
- } else {
- /* IPv4 */
- if (outer) {
- if (fields & RTE_ETH_RSS_L3_SRC_ONLY) {
- NT_LOG(DBG, FILTER, "Set outer IPv4 src only hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words, DYN_L3, 12,
- 32, toeplitz);
-
- } else if (fields & RTE_ETH_RSS_L3_DST_ONLY) {
- NT_LOG(DBG, FILTER, "Set outer IPv4 dst only hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words, DYN_L3, 16,
- 32, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set outer IPv4 src & dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words, DYN_L3, 12,
- 64, toeplitz);
- }
-
- } else if (fields & RTE_ETH_RSS_L3_SRC_ONLY) {
- NT_LOG(DBG, FILTER, "Set inner IPv4 src only hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_L3, 12, 32,
- toeplitz);
-
- } else if (fields & RTE_ETH_RSS_L3_DST_ONLY) {
- NT_LOG(DBG, FILTER, "Set inner IPv4 dst only hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_L3, 16, 32,
- toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner IPv4 src & dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_L3, 12, 64,
- toeplitz);
- }
-
- /* check if fragment ID shall be part of hash */
- if (fields & RTE_ETH_RSS_FRAG_IPV4) {
- if (outer) {
- NT_LOG(DBG, FILTER,
- "Set outer IPv4 fragment ID hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words,
- DYN_ID_IPV4_6, 0,
- 16, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER,
- "Set inner IPv4 fragment ID hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words,
- DYN_TUN_ID_IPV4_6,
- 0, 16, toeplitz);
- }
- }
- }
-
- /* check if L4 protocol type shall be part of hash */
- if (l4_proto_mask)
- l4_proto_hash = true;
-
- unset_bits_and_log(&fields, NT_ETH_RSS_IP_MASK);
- }
-
- /* L4 */
- if (fields & (RTE_ETH_RSS_PORT | RTE_ETH_RSS_L4_SRC_ONLY | RTE_ETH_RSS_L4_DST_ONLY)) {
- if (outer) {
- if (fields & RTE_ETH_RSS_L4_SRC_ONLY) {
- NT_LOG(DBG, FILTER, "Set outer L4 src hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L4, 0, 16, toeplitz);
-
- } else if (fields & RTE_ETH_RSS_L4_DST_ONLY) {
- NT_LOG(DBG, FILTER, "Set outer L4 dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L4, 2, 16, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set outer L4 src & dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L4, 0, 32, toeplitz);
- }
-
- } else if (fields & RTE_ETH_RSS_L4_SRC_ONLY) {
- NT_LOG(DBG, FILTER, "Set inner L4 src hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_L4, 0,
- 16, toeplitz);
-
- } else if (fields & RTE_ETH_RSS_L4_DST_ONLY) {
- NT_LOG(DBG, FILTER, "Set inner L4 dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_L4, 2,
- 16, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner L4 src & dst hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_TUN_L4, 0,
- 32, toeplitz);
- }
-
- l4_proto_hash = true;
- unset_bits_and_log(&fields,
- RTE_ETH_RSS_PORT | RTE_ETH_RSS_L4_SRC_ONLY |
- RTE_ETH_RSS_L4_DST_ONLY);
- }
-
- /* IPv4 protocol / IPv6 next header fields */
- if (l4_proto_hash) {
- /* NOTE: HW_HSH_RCP_P_MASK is not supported for Toeplitz and thus one of SW0, SW4
- * or W8 must be used to hash on `protocol` field of IPv4 or `next header` field of
- * IPv6 header.
- */
- if (outer) {
- NT_LOG(DBG, FILTER, "Set outer L4 protocol type / next header hasher.");
-
- if (toeplitz) {
- if (ipv6) {
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words, DYN_L3, 6, 8,
- toeplitz);
-
- } else {
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words, DYN_L3, 9, 8,
- toeplitz);
- }
-
- } else {
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_P_MASK, hsh_idx, 0,
- 1);
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_TNL_P, hsh_idx, 0,
- 0);
- }
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner L4 protocol type / next header hasher.");
-
- if (toeplitz) {
- if (ipv6) {
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words, DYN_TUN_L3,
- 6, 8, toeplitz);
-
- } else {
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx,
- words, DYN_TUN_L3,
- 9, 8, toeplitz);
- }
-
- } else {
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_P_MASK, hsh_idx, 0,
- 1);
- res |= hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_TNL_P, hsh_idx, 0,
- 1);
- }
- }
-
- l4_proto_hash = false;
- }
-
- /*
- * GTPU - for UPF use cases we always use TEID from outermost GTPU header
- * even if other headers are innermost
- */
- if (fields & RTE_ETH_RSS_GTPU) {
- NT_LOG(DBG, FILTER, "Set outer GTPU TEID hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words, DYN_L4_PAYLOAD, 4, 32,
- toeplitz);
- unset_bits_and_log(&fields, RTE_ETH_RSS_GTPU);
- }
-
- /* Checksums */
- /* only UDP, TCP and SCTP checksums are supported */
- if (fields & RTE_ETH_RSS_L4_CHKSUM) {
- switch (l4_proto_mask) {
- case RTE_ETH_RSS_NONFRAG_IPV4_UDP:
- case RTE_ETH_RSS_NONFRAG_IPV6_UDP:
- case RTE_ETH_RSS_IPV6_UDP_EX:
- case RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_NONFRAG_IPV6_UDP:
- case RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_IPV6_UDP_EX:
- case RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_IPV6_UDP_EX:
- case RTE_ETH_RSS_UDP_COMBINED:
- if (outer) {
- NT_LOG(DBG, FILTER, "Set outer UDP checksum hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L4, 6, 16, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner UDP checksum hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_L4, 6, 16,
- toeplitz);
- }
-
- unset_bits_and_log(&fields, RTE_ETH_RSS_L4_CHKSUM | l4_proto_mask);
- break;
-
- case RTE_ETH_RSS_NONFRAG_IPV4_TCP:
- case RTE_ETH_RSS_NONFRAG_IPV6_TCP:
- case RTE_ETH_RSS_IPV6_TCP_EX:
- case RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV6_TCP:
- case RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_IPV6_TCP_EX:
- case RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_IPV6_TCP_EX:
- case RTE_ETH_RSS_TCP_COMBINED:
- if (outer) {
- NT_LOG(DBG, FILTER, "Set outer TCP checksum hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L4, 16, 16, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner TCP checksum hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_L4, 16, 16,
- toeplitz);
- }
-
- unset_bits_and_log(&fields, RTE_ETH_RSS_L4_CHKSUM | l4_proto_mask);
- break;
-
- case RTE_ETH_RSS_NONFRAG_IPV4_SCTP:
- case RTE_ETH_RSS_NONFRAG_IPV6_SCTP:
- case RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_NONFRAG_IPV6_SCTP:
- if (outer) {
- NT_LOG(DBG, FILTER, "Set outer SCTP checksum hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_L4, 8, 32, toeplitz);
-
- } else {
- NT_LOG(DBG, FILTER, "Set inner SCTP checksum hasher.");
- res |= flow_nic_set_hasher_part_inline(ndev, hsh_idx, words,
- DYN_TUN_L4, 8, 32,
- toeplitz);
- }
-
- unset_bits_and_log(&fields, RTE_ETH_RSS_L4_CHKSUM | l4_proto_mask);
- break;
-
- case RTE_ETH_RSS_NONFRAG_IPV4_OTHER:
- case RTE_ETH_RSS_NONFRAG_IPV6_OTHER:
-
- /* none or unsupported protocol was chosen */
- case 0:
- NT_LOG(ERR, FILTER,
- "L4 checksum hashing is supported only for UDP, TCP and SCTP protocols");
- res = -1;
- break;
-
- /* multiple L4 protocols were selected */
- default:
- NT_LOG(ERR, FILTER,
- "L4 checksum hashing can be enabled just for one of UDP, TCP or SCTP protocols");
- res = -1;
- break;
- }
- }
-
- if (fields || res != 0) {
- hw_mod_hsh_rcp_set(&ndev->be, HW_HSH_RCP_PRESET_ALL, hsh_idx, 0, 0);
-
- if (sprint_nt_rss_mask(rss_buffer, rss_buffer_len, " ", rss_conf.rss_hf) == 0) {
- NT_LOG(ERR, FILTER,
- "RSS configuration%s is not supported for hash func %s.",
- rss_buffer,
- (enum rte_eth_hash_function)toeplitz ? "Toeplitz" : "NTH10");
-
- } else {
- NT_LOG(ERR, FILTER,
- "RSS configuration 0x%" PRIX64
- " is not supported for hash func %s.",
- rss_conf.rss_hf,
- (enum rte_eth_hash_function)toeplitz ? "Toeplitz" : "NTH10");
- }
-
- return -1;
- }
-
- return res;
-}
-
static void dump_flm_data(const uint32_t *data, FILE *file)
{
for (unsigned int i = 0; i < 10; ++i) {
@@ -6020,7 +5261,6 @@ static const struct profile_inline_ops ops = {
.flow_destroy_profile_inline = flow_destroy_profile_inline,
.flow_flush_profile_inline = flow_flush_profile_inline,
.flow_actions_update_profile_inline = flow_actions_update_profile_inline,
- .flow_nic_set_hasher_fields_inline = flow_nic_set_hasher_fields_inline,
.flow_get_aged_flows_profile_inline = flow_get_aged_flows_profile_inline,
/*
* Stats
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.h b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.h
index 169f71ee68..be22c9bcd1 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.h
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.h
@@ -66,10 +66,6 @@ int flow_get_aged_flows_profile_inline(struct flow_eth_dev *dev,
uint32_t nb_contexts,
struct rte_flow_error *error);
-int flow_nic_set_hasher_fields_inline(struct flow_nic_dev *ndev,
- int hsh_idx,
- struct nt_eth_rss_conf rss_conf);
-
/*
* Stats
*/
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c
index d1360cc925..9000264804 100644
--- a/drivers/net/ntnic/ntnic_ethdev.c
+++ b/drivers/net/ntnic/ntnic_ethdev.c
@@ -27,6 +27,7 @@
#include "ntnic_vfio.h"
#include "ntnic_mod_reg.h"
#include "nt_util.h"
+#include "flow_hsh_cfg.h"
#include "profile_inline/flm_age_queue.h"
#include "profile_inline/flm_evt_queue.h"
#include "rte_pmd_ntnic.h"
@@ -1672,7 +1673,7 @@ static int eth_dev_rss_hash_update(struct rte_eth_dev *eth_dev, struct rte_eth_r
tmp_rss_conf.algorithm = rss_conf->algorithm;
tmp_rss_conf.rss_hf = rss_conf->rss_hf;
- int res = flow_filter_ops->flow_nic_set_hasher_fields(ndev, hsh_idx, tmp_rss_conf);
+ int res = hsh_set(ndev, hsh_idx, tmp_rss_conf);
if (res == 0) {
flow_filter_ops->hw_mod_hsh_rcp_flush(&ndev->be, hsh_idx, 1);
diff --git a/drivers/net/ntnic/ntnic_mod_reg.h b/drivers/net/ntnic/ntnic_mod_reg.h
index 71861c6dea..8db4911262 100644
--- a/drivers/net/ntnic/ntnic_mod_reg.h
+++ b/drivers/net/ntnic/ntnic_mod_reg.h
@@ -355,10 +355,6 @@ struct profile_inline_ops {
struct flow_handle *flow, void *user_data,
struct rte_flow_error *error);
- int (*flow_nic_set_hasher_fields_inline)(struct flow_nic_dev *ndev,
- int hsh_idx,
- struct nt_eth_rss_conf rss_conf);
-
/*
* Stats
*/
@@ -467,8 +463,6 @@ struct flow_filter_ops {
/*
* Other
*/
- int (*flow_nic_set_hasher_fields)(struct flow_nic_dev *ndev, int hsh_idx,
- struct nt_eth_rss_conf rss_conf);
int (*hw_mod_hsh_rcp_flush)(struct flow_api_backend_s *be, int start_idx, int count);
int (*flow_get_aged_flows)(struct flow_eth_dev *dev,
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 26/31] net/ntnic: fix age timeout recalculation into fpga unit
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (24 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 25/31] net/ntnic: refactor RSS implementation Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 27/31] net/ntnic: rework age event generation Serhii Iliushyk
` (4 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
The FPGA scrub T parameter shall be encoded timeout using internal unit,
which is measured in 2^30 nanoseconds. It is approx 1.074 times longer
than age timeout specified in seconds. Internal method
hw_mod_flm_inf_sta_data_update_get() was updated to perform conversion
between age time and internal FPGA scrub T time unit.
Fixes: c0d44442b831 ("net/ntnic: add flow aging event")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
.../net/ntnic/nthw/flow_api/hw_mod/hw_mod_flm.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_flm.c b/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_flm.c
index 14dd95a150..5cf8264909 100644
--- a/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_flm.c
+++ b/drivers/net/ntnic/nthw/flow_api/hw_mod/hw_mod_flm.c
@@ -969,16 +969,22 @@ int hw_mod_flm_inf_sta_data_update_get(struct flow_api_backend_s *be, enum hw_fl
*
* (T[7:3] != 0) ? ((8 + T[2:0]) shift-left (T[7:3] - 1)) : T[2:0]
*
- * The maximum allowed value is 0xEF (127 years).
+ * The maximum allowed value is 0xEF (137 years).
*
* Note that this represents a lower bound on the timeout, depending on the flow
* scanner interval and overall load, the timeout can be substantially longer.
*/
uint32_t hw_mod_flm_scrub_timeout_decode(uint32_t t_enc)
{
- uint8_t t_bits_2_0 = t_enc & 0x07;
- uint8_t t_bits_7_3 = (t_enc >> 3) & 0x1F;
- return t_bits_7_3 != 0 ? ((8 + t_bits_2_0) << (t_bits_7_3 - 1)) : t_bits_2_0;
+ uint32_t t_bits_2_0 = t_enc & 0x07;
+ uint32_t t_bits_7_3 = (t_enc >> 3) & 0x1F;
+ uint32_t t_dec = t_bits_7_3 != 0 ? ((8U + t_bits_2_0) << (t_bits_7_3 - 1U))
+ : t_bits_2_0;
+ /* convert internal FPGA scrub time unit into seconds, i.e. 2^30/1e9 is
+ * approx 1.074 sec per internal unit
+ */
+ uint64_t t_sec = (uint64_t)t_dec * 1074UL / 1000UL;
+ return t_sec > UINT32_MAX ? UINT32_MAX : (uint32_t)t_sec;
}
uint32_t hw_mod_flm_scrub_timeout_encode(uint32_t t)
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 27/31] net/ntnic: rework age event generation
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (25 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 26/31] net/ntnic: fix age timeout recalculation into fpga unit Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 28/31] net/ntnic: fix group print Serhii Iliushyk
` (3 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov
From: Danylo Vodopianov <dvo-plv@napatech.com>
Add age event generating only for physical ports.
Fixes: 4033e0539435 ("net/ntnic: add flow meter")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
.../nthw/flow_api/profile_inline/flow_api_profile_inline.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
index e5abd372bc..e911860c38 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c
@@ -479,13 +479,16 @@ static void flm_mtr_read_inf_records(struct flow_eth_dev *dev, uint32_t *data, u
struct flow_handle *fh = (struct flow_handle *)flm_h.p;
struct flm_age_event_s age_event;
uint8_t port;
+ bool is_remote;
age_event.context = fh->context;
- is_remote_caller(caller_id, &port);
+ is_remote = is_remote_caller(caller_id, &port);
flm_age_queue_put(caller_id, &age_event);
- flm_age_event_set(port);
+ /* age events are supported only for physical ports */
+ if (!is_remote)
+ flm_age_event_set(port);
}
break;
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 28/31] net/ntnic: fix group print
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (26 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 27/31] net/ntnic: rework age event generation Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 29/31] net/ntnic: extend module mapping Serhii Iliushyk
` (2 subsequent siblings)
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev
Cc: mko-plv, sil-plv, ckm, stephen, Danylo Vodopianov, Oleksandr Kolomeiets
From: Danylo Vodopianov <dvo-plv@napatech.com>
Flow dump output was fixed to show original group
number for `jumps` stored in action and match sets.
Fixes: 6f0fe142caed ("net/ntnic: add flow dump")
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
drivers/net/ntnic/include/flow_api_engine.h | 2 ++
drivers/net/ntnic/nthw/flow_api/flow_group.c | 26 +++++++++++++++++++
.../profile_inline/flow_api_hw_db_inline.c | 24 ++++++++++++-----
3 files changed, 45 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ntnic/include/flow_api_engine.h b/drivers/net/ntnic/include/flow_api_engine.h
index 636c53b260..262317002f 100644
--- a/drivers/net/ntnic/include/flow_api_engine.h
+++ b/drivers/net/ntnic/include/flow_api_engine.h
@@ -425,5 +425,7 @@ int flow_group_handle_destroy(void **handle);
int flow_group_translate_get(void *handle, uint8_t owner_id, uint8_t port_id, uint32_t group_in,
uint32_t *group_out);
+int flow_group_translate_get_orig_group(void *handle, uint32_t translated_group,
+ uint32_t *group_orig);
#endif /* _FLOW_API_ENGINE_H_ */
diff --git a/drivers/net/ntnic/nthw/flow_api/flow_group.c b/drivers/net/ntnic/nthw/flow_api/flow_group.c
index f76986b178..d1fa0193e1 100644
--- a/drivers/net/ntnic/nthw/flow_api/flow_group.c
+++ b/drivers/net/ntnic/nthw/flow_api/flow_group.c
@@ -14,6 +14,7 @@
struct group_lookup_entry_s {
uint64_t ref_counter;
uint32_t *reverse_lookup;
+ uint32_t group_orig;
};
struct group_handle_s {
@@ -83,6 +84,7 @@ int flow_group_translate_get(void *handle, uint8_t owner_id, uint8_t port_id, ui
if (lookup < group_handle->group_count) {
group_handle->lookup_entries[lookup].reverse_lookup = table_ptr;
group_handle->lookup_entries[lookup].ref_counter += 1;
+ group_handle->lookup_entries[lookup].group_orig = group_in;
*table_ptr = lookup;
@@ -97,3 +99,27 @@ int flow_group_translate_get(void *handle, uint8_t owner_id, uint8_t port_id, ui
*group_out = lookup;
return 0;
}
+
+int flow_group_translate_get_orig_group(void *handle, uint32_t translated_group,
+ uint32_t *group_orig)
+{
+ struct group_handle_s *group_handle = (struct group_handle_s *)handle;
+ struct group_lookup_entry_s *lookup;
+
+ if (group_handle == NULL || translated_group >= group_handle->group_count)
+ return -1;
+
+ /* Don't translate group 0 */
+ if (translated_group == 0) {
+ *group_orig = 0;
+ return 0;
+ }
+
+ lookup = &group_handle->lookup_entries[translated_group];
+
+ if (lookup->reverse_lookup && lookup->ref_counter > 0) {
+ *group_orig = lookup->group_orig;
+ return 0;
+ }
+ return -1;
+}
diff --git a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_hw_db_inline.c b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_hw_db_inline.c
index 22cbf61b60..278be8b180 100644
--- a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_hw_db_inline.c
+++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_hw_db_inline.c
@@ -429,9 +429,14 @@ void hw_db_inline_dump(struct flow_nic_dev *ndev, void *db_handle, const struct
data->cat.ids, data->km.id1, data->km_ft.id1,
data->action_set.ids);
- if (data->jump)
- fprintf(file, " Jumps to %d\n", data->jump);
-
+ if (data->jump) {
+ uint32_t group_orig = 0;
+ if (flow_group_translate_get_orig_group(ndev->group_handle,
+ data->jump, &group_orig) < 0)
+ fprintf(file, " Jumps to %d (encoded)\n", data->jump);
+ else
+ fprintf(file, " Jumps to %d\n", group_orig);
+ }
break;
}
@@ -440,15 +445,20 @@ void hw_db_inline_dump(struct flow_nic_dev *ndev, void *db_handle, const struct
&db->action_set[idxs[i].ids].data;
fprintf(file, " ACTION_SET %d\n", idxs[i].ids);
- if (data->contains_jump)
- fprintf(file, " Jumps to %d\n", data->jump);
+ if (data->contains_jump) {
+ uint32_t group_orig = 0;
+ if (flow_group_translate_get_orig_group(ndev->group_handle,
+ data->jump, &group_orig) < 0)
+ fprintf(file, " Jumps to %d (encoded)\n", data->jump);
- else
+ else
+ fprintf(file, " Jumps to %d\n", group_orig);
+ } else {
fprintf(file,
" COT id %d, QSL id %d, SLC_LR id %d, TPE id %d, HSH id %d, SCRUB id %d\n",
data->cot.ids, data->qsl.ids, data->slc_lr.ids,
data->tpe.ids, data->hsh.ids, data->scrub.ids);
-
+ }
break;
}
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 29/31] net/ntnic: extend module mapping
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (27 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 28/31] net/ntnic: fix group print Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 30/31] net/ntnic: refactoring of the FPGA initialization Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 31/31] net/ntnic: remove tag EXPERIMENTAL Serhii Iliushyk
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen
FPGA module mapping(to string) was extended with new fpga's modules.
Signed-off-by: Serhii Iliushyk <sil-plv@napatech.com>
---
.../nthw/supported/nthw_fpga_mod_str_map.c | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/drivers/net/ntnic/nthw/supported/nthw_fpga_mod_str_map.c b/drivers/net/ntnic/nthw/supported/nthw_fpga_mod_str_map.c
index e8ed7faf0d..459cc724c2 100644
--- a/drivers/net/ntnic/nthw/supported/nthw_fpga_mod_str_map.c
+++ b/drivers/net/ntnic/nthw/supported/nthw_fpga_mod_str_map.c
@@ -6,20 +6,44 @@
#include "nthw_fpga_mod_str_map.h"
const struct nthw_fpga_mod_str_s sa_nthw_fpga_mod_str_map[] = {
+ { MOD_CAT, "CAT" },
+ { MOD_CPY, "CPY" },
+ { MOD_CSU, "CSU" },
+ { MOD_DBS, "DBS" },
+ { MOD_FLM, "FLM" },
{ MOD_GFG, "GFG" },
{ MOD_GMF, "GMF" },
{ MOD_GPIO_PHY, "GPIO_PHY" },
+ { MOD_HFU, "HFU" },
{ MOD_HIF, "HIF" },
+ { MOD_HSH, "HSH" },
{ MOD_I2CM, "I2CM" },
+ { MOD_IFR, "IFR" },
{ MOD_IIC, "IIC" },
+ { MOD_INS, "INS" },
+ { MOD_KM, "KM" },
{ MOD_MAC_PCS, "MAC_PCS" },
{ MOD_PCIE3, "PCIE3" },
+ { MOD_MAC_RX, "MAC_RX" },
+ { MOD_MAC_TX, "MAC_TX" },
{ MOD_PCI_RD_TG, "PCI_RD_TG" },
{ MOD_PCI_WR_TG, "PCI_WR_TG" },
+ { MOD_PCIE3, "PCIE3" },
+ { MOD_PDB, "PDB" },
+ { MOD_QSL, "QSL" },
{ MOD_RAC, "RAC" },
+ { MOD_RMC, "RMC" },
+ { MOD_RPF, "RPF" },
+ { MOD_RPL, "RPL" },
+ { MOD_RPP_LR, "RPP_LR" },
{ MOD_RST9563, "RST9563" },
{ MOD_SDC, "SDC" },
+ { MOD_SLC_LR, "SLC_LR" },
+ { MOD_SLC, "SLC" },
{ MOD_STA, "STA" },
{ MOD_TSM, "TSM" },
+ { MOD_TX_CPY, "TX_CPY" },
+ { MOD_TX_INS, "TX_INS" },
+ { MOD_TX_RPL, "TX_RPL" },
{ 0UL, NULL }
};
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 30/31] net/ntnic: refactoring of the FPGA initialization
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (28 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 29/31] net/ntnic: extend module mapping Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 31/31] net/ntnic: remove tag EXPERIMENTAL Serhii Iliushyk
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen
Remove unnecessary checks and logs.
Signed-off-by: Serhii Iliushyk <sil-plv@napatech.com>
---
drivers/net/ntnic/nthw/core/nthw_fpga.c | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/drivers/net/ntnic/nthw/core/nthw_fpga.c b/drivers/net/ntnic/nthw/core/nthw_fpga.c
index 88641145ec..5ca186209a 100644
--- a/drivers/net/ntnic/nthw/core/nthw_fpga.c
+++ b/drivers/net/ntnic/nthw/core/nthw_fpga.c
@@ -265,18 +265,14 @@ int nthw_fpga_init(struct fpga_info_s *p_fpga_info)
nthw_rac_rab_flush(p_nthw_rac);
p_fpga_info->mp_nthw_rac = p_nthw_rac;
- bool included = true;
struct nt200a0x_ops *nt200a0x_ops = get_nt200a0x_ops();
switch (p_fpga_info->n_nthw_adapter_id) {
case NT_HW_ADAPTER_ID_NT200A02:
if (nt200a0x_ops != NULL)
res = nt200a0x_ops->nthw_fpga_nt200a0x_init(p_fpga_info);
-
- else
- included = false;
-
break;
+
default:
NT_LOG(ERR, NTHW, "%s: Unsupported HW product id: %d", p_adapter_id_str,
p_fpga_info->n_nthw_adapter_id);
@@ -284,12 +280,6 @@ int nthw_fpga_init(struct fpga_info_s *p_fpga_info)
break;
}
- if (!included) {
- NT_LOG(ERR, NTHW, "%s: NOT INCLUDED HW product: %d", p_adapter_id_str,
- p_fpga_info->n_nthw_adapter_id);
- res = -1;
- }
-
if (res) {
NT_LOG(ERR, NTHW, "%s: status: 0x%08X", p_adapter_id_str, res);
return res;
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v1 31/31] net/ntnic: remove tag EXPERIMENTAL
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
` (29 preceding siblings ...)
2025-01-21 17:08 ` [PATCH v1 30/31] net/ntnic: refactoring of the FPGA initialization Serhii Iliushyk
@ 2025-01-21 17:08 ` Serhii Iliushyk
30 siblings, 0 replies; 34+ messages in thread
From: Serhii Iliushyk @ 2025-01-21 17:08 UTC (permalink / raw)
To: dev; +Cc: mko-plv, sil-plv, ckm, stephen, Thomas Monjalon
Since nitnic PMD driver for is fully added and verified,
the tag EXPERIMENTAL may be removed
Signed-off-by: Serhii Iliushyk <sil-plv@napatech.com>
---
MAINTAINERS | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index b86cdd266b..b04951de85 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -890,7 +890,7 @@ F: drivers/net/octeon_ep/
F: doc/guides/nics/features/octeon_ep.ini
F: doc/guides/nics/octeon_ep.rst
-Napatech ntnic - EXPERIMENTAL
+Napatech ntnic
M: Christian Koue Muf <ckm@napatech.com>
M: Serhii Iliushyk <sil-plv@napatech.com>
F: drivers/net/ntnic/
--
2.45.0
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v1 02/31] net/ntnic: add thread check return code
2025-01-21 17:07 ` [PATCH v1 02/31] net/ntnic: add thread check return code Serhii Iliushyk
@ 2025-01-21 18:24 ` Stephen Hemminger
0 siblings, 0 replies; 34+ messages in thread
From: Stephen Hemminger @ 2025-01-21 18:24 UTC (permalink / raw)
To: Serhii Iliushyk; +Cc: dev, mko-plv, ckm, Danylo Vodopianov
On Tue, 21 Jan 2025 18:07:40 +0100
Serhii Iliushyk <sil-plv@napatech.com> wrote:
> From: Danylo Vodopianov <dvo-plv@napatech.com>
>
> CI found couple coverity problems which were fixed in this commit.
>
> CID: 448965 Error handling issues (CHECKED_RETURN).
>
> Thread return code check was added.
>
> Coverity issue: 448965
> Fixes: a1ba8c473f5c ("net/ntnic: add statistics poll")
>
> Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
> ---
> drivers/net/ntnic/ntnic_ethdev.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c
> index 2a2643a106..620d023a71 100644
> --- a/drivers/net/ntnic/ntnic_ethdev.c
> +++ b/drivers/net/ntnic/ntnic_ethdev.c
> @@ -2516,8 +2516,11 @@ static int init_shutdown(void)
> NT_LOG(DBG, NTNIC, "Starting shutdown handler");
> kill_pmd = 0;
> previous_handler = signal(SIGINT, signal_handler_func_int);
> - THREAD_CREATE(&shutdown_tid, shutdown_thread, NULL);
> -
> + int ret = THREAD_CREATE(&shutdown_tid, shutdown_thread, NULL);
> + if (ret != 0) {
> + NT_LOG(ERR, NTNIC, "Failed to create shutdown thread, error code: %d", ret);
> + return -1;
> + }
> /*
> * 1 time calculation of 1 sec stat update rtc cycles to prevent stat poll
> * flooding by OVS from multiple virtual port threads - no need to be precise
> --
The whole thread, SIGINT stuff is a big mistake.
You are making all sorts of assumptions about application environment
such as SIGINT won't be used by other things, drivers creating internal threads
is a bad idea.
Also access to the flag kill_pmd is not being done in a thread safe manner.
What is it really trying to do?
IMHO, The driver should have never been merged with this stuff.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v1 03/31] net/ntnic: add return code handling
2025-01-21 17:07 ` [PATCH v1 03/31] net/ntnic: add return code handling Serhii Iliushyk
@ 2025-01-21 18:30 ` Stephen Hemminger
0 siblings, 0 replies; 34+ messages in thread
From: Stephen Hemminger @ 2025-01-21 18:30 UTC (permalink / raw)
To: Serhii Iliushyk
Cc: dev, mko-plv, ckm, Danylo Vodopianov, Oleksandr Kolomeiets
On Tue, 21 Jan 2025 18:07:41 +0100
Serhii Iliushyk <sil-plv@napatech.com> wrote:
> From: Danylo Vodopianov <dvo-plv@napatech.com>
>
> CI found couple coverity problems which were fixed in this commit.
>
> CID: 448984, 448982, 448975, 448969, 448968, 448967
> API usage errors (BAD_COMPARE).
>
> Add memcmp return value checking.
>
> Coverity issue: 448984
> Fixes: 6e8b7f11205f ("net/ntnic: add categorizer (CAT) FPGA module")
>
> Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
> ---
> drivers/net/ntnic/include/hw_mod_backend.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ntnic/include/hw_mod_backend.h b/drivers/net/ntnic/include/hw_mod_backend.h
> index f91a3ed058..40002f3343 100644
> --- a/drivers/net/ntnic/include/hw_mod_backend.h
> +++ b/drivers/net/ntnic/include/hw_mod_backend.h
> @@ -114,10 +114,10 @@ enum {
> typeof(be_module_reg) *temp_be_module = &(be_module_reg); \
> typeof(idx) tmp_idx = (idx); \
> typeof(cmp_idx) tmp_cmp_idx = (cmp_idx); \
> - if ((unsigned int)(tmp_idx) != (unsigned int)(tmp_cmp_idx)) { \
> - (void)memcmp(temp_be_module + tmp_idx, &temp_be_module[tmp_cmp_idx], \
> - sizeof(type)); \
> - } \
> + if ((unsigned int)(tmp_idx) != (unsigned int)(tmp_cmp_idx)) \
> + if (memcmp(temp_be_module + tmp_idx, &temp_be_module[tmp_cmp_idx], \
> + sizeof(type)) == 0) \
> + return 1; \
> } while (0)
>
Complex generic macros like this are brittle.
Adding a return in the middle of a loop means it will do unexpected exit of function??
^ permalink raw reply [flat|nested] 34+ messages in thread
end of thread, other threads:[~2025-01-21 18:30 UTC | newest]
Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-21 17:07 [PATCH v1 00/31] net/ntnic: bugfixes and refactoring Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 01/31] net/ntnic: fix index verification Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 02/31] net/ntnic: add thread check return code Serhii Iliushyk
2025-01-21 18:24 ` Stephen Hemminger
2025-01-21 17:07 ` [PATCH v1 03/31] net/ntnic: add return code handling Serhii Iliushyk
2025-01-21 18:30 ` Stephen Hemminger
2025-01-21 17:07 ` [PATCH v1 04/31] net/ntnic: add array index verification Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 05/31] net/ntnic: fix realloc memory leak Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 06/31] net/ntnic: fix array index verification Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 07/31] net/ntnic: add var definition transparently Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 08/31] net/ntnic: add proper var freed Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 09/31] net/ntnic: remove deadcode Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 10/31] net/ntnic: fix potentially overflow Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 11/31] net/ntnic: add null checking Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 12/31] net/ntnic: fix overflow issue Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 13/31] net/ntnic: fix untrusted loop bound Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 14/31] net/ntnic: add null checking Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 15/31] net/ntnic: move " Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 16/31] net/ntnic: fix var size Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 17/31] net/ntnic: fix var overflow Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 18/31] net/ntnic: remove dead code Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 19/31] net/ntnic: remove convert error func Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 20/31] net/ntnic: fix array verification Serhii Iliushyk
2025-01-21 17:07 ` [PATCH v1 21/31] net/ntnic: fix memory leak Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 22/31] net/ntnic: remove extra address-of operator Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 23/31] net/ntnic: remove extra check for null Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 24/31] net/ntnic: remove unused code Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 25/31] net/ntnic: refactor RSS implementation Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 26/31] net/ntnic: fix age timeout recalculation into fpga unit Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 27/31] net/ntnic: rework age event generation Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 28/31] net/ntnic: fix group print Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 29/31] net/ntnic: extend module mapping Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 30/31] net/ntnic: refactoring of the FPGA initialization Serhii Iliushyk
2025-01-21 17:08 ` [PATCH v1 31/31] net/ntnic: remove tag EXPERIMENTAL Serhii Iliushyk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).