The maximum amount of unique switching domain is supposed
to be equal to RTE_MAX_ETHPORTS. The current implementation
allows to allocate only RTE_MAX_ETHPORTS-1 domains.

Fixes: ce9250406323 ("ethdev: add switch domain allocator")
Cc: sta...@dpdk.org

Signed-off-by: Viacheslav Ovsiienko <viachesl...@mellanox.com>
---
 lib/librte_ethdev/rte_ethdev.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 6e9cb24..4c2312c 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -5065,10 +5065,10 @@ enum rte_eth_switch_domain_state {
        *domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID;
 
        for (i = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID + 1;
-               i < RTE_MAX_ETHPORTS; i++) {
-               if (rte_eth_switch_domains[i].state ==
+               i <= RTE_MAX_ETHPORTS; i++) {
+               if (rte_eth_switch_domains[i - 1].state ==
                        RTE_ETH_SWITCH_DOMAIN_UNUSED) {
-                       rte_eth_switch_domains[i].state =
+                       rte_eth_switch_domains[i - 1].state =
                                RTE_ETH_SWITCH_DOMAIN_ALLOCATED;
                        *domain_id = i;
                        return 0;
@@ -5082,14 +5082,15 @@ enum rte_eth_switch_domain_state {
 rte_eth_switch_domain_free(uint16_t domain_id)
 {
        if (domain_id == RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID ||
-               domain_id >= RTE_MAX_ETHPORTS)
+               domain_id > RTE_MAX_ETHPORTS)
                return -EINVAL;
 
-       if (rte_eth_switch_domains[domain_id].state !=
+       if (rte_eth_switch_domains[domain_id - 1].state !=
                RTE_ETH_SWITCH_DOMAIN_ALLOCATED)
                return -EINVAL;
 
-       rte_eth_switch_domains[domain_id].state = RTE_ETH_SWITCH_DOMAIN_UNUSED;
+       rte_eth_switch_domains[domain_id - 1].state =
+               RTE_ETH_SWITCH_DOMAIN_UNUSED;
 
        return 0;
 }
-- 
1.8.3.1

Reply via email to