The mac_addr_add API describes that only the 0 pool should be passed
unless VMDq has been enabled, though there was no validation so far.
Add such a check, then cleanup the related operations (adding, removing,
restoring).

As a side effect, the net/cnxk does not need to manually reset the
mac_pool_sel[] array.

Signed-off-by: David Marchand <[email protected]>
---
 drivers/net/cnxk/cnxk_ethdev_ops.c |  1 -
 lib/ethdev/rte_ethdev.c            | 28 +++++++++++++++++++++-------
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/drivers/net/cnxk/cnxk_ethdev_ops.c 
b/drivers/net/cnxk/cnxk_ethdev_ops.c
index 49e77e49a6..75decf7098 100644
--- a/drivers/net/cnxk/cnxk_ethdev_ops.c
+++ b/drivers/net/cnxk/cnxk_ethdev_ops.c
@@ -1240,7 +1240,6 @@ cnxk_nix_mc_addr_list_configure(struct rte_eth_dev 
*eth_dev, struct rte_ether_ad
                /* Update address in NIC data structure */
                rte_ether_addr_copy(&mc_addr_set[i], &data->mac_addrs[j]);
                rte_ether_addr_copy(&mc_addr_set[i], &dev->dmac_addrs[j]);
-               data->mac_pool_sel[j] = RTE_BIT64(0);
        }
 
        roc_nix_npc_promisc_ena_dis(nix, true);
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 2edc7a362e..9577b7d848 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -1680,7 +1680,10 @@ eth_dev_mac_restore(struct rte_eth_dev *dev,
                                continue;
 
                        pool = 0;
-                       pool_mask = dev->data->mac_pool_sel[i];
+                       if ((dev->data->dev_conf.rxmode.mq_mode & 
RTE_ETH_MQ_RX_VMDQ_FLAG) != 0)
+                               pool_mask = dev->data->mac_pool_sel[i];
+                       else
+                               pool_mask = 1;
 
                        do {
                                if (pool_mask & UINT64_C(1))
@@ -5390,8 +5393,9 @@ rte_eth_dev_mac_addr_add(uint16_t port_id, struct 
rte_ether_addr *addr,
                        uint32_t pool)
 {
        struct rte_eth_dev *dev;
-       int index;
        uint64_t pool_mask;
+       bool vmdq;
+       int index;
        int ret;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
@@ -5416,6 +5420,12 @@ rte_eth_dev_mac_addr_add(uint16_t port_id, struct 
rte_ether_addr *addr,
                RTE_ETHDEV_LOG_LINE(ERR, "Pool ID must be 0-%d", 
RTE_ETH_64_POOLS - 1);
                return -EINVAL;
        }
+       vmdq = (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_VMDQ_FLAG) 
!= 0;
+       if (!vmdq && pool != 0) {
+               RTE_ETHDEV_LOG_LINE(ERR, "Port %u: VMDq is not configured (pool 
%d)",
+                       port_id, pool);
+               return -EINVAL;
+       }
 
        index = eth_dev_get_mac_addr_index(port_id, addr);
        if (index < 0) {
@@ -5425,7 +5435,7 @@ rte_eth_dev_mac_addr_add(uint16_t port_id, struct 
rte_ether_addr *addr,
                                port_id);
                        return -ENOSPC;
                }
-       } else {
+       } else if (vmdq) {
                pool_mask = dev->data->mac_pool_sel[index];
 
                /* Check if both MAC address and pool is already there, and do 
nothing */
@@ -5440,8 +5450,10 @@ rte_eth_dev_mac_addr_add(uint16_t port_id, struct 
rte_ether_addr *addr,
                /* Update address in NIC data structure */
                rte_ether_addr_copy(addr, &dev->data->mac_addrs[index]);
 
-               /* Update pool bitmap in NIC data structure */
-               dev->data->mac_pool_sel[index] |= RTE_BIT64(pool);
+               if (vmdq) {
+                       /* Update pool bitmap in NIC data structure */
+                       dev->data->mac_pool_sel[index] |= RTE_BIT64(pool);
+               }
        }
 
        ret = eth_err(port_id, ret);
@@ -5486,8 +5498,10 @@ rte_eth_dev_mac_addr_remove(uint16_t port_id, struct 
rte_ether_addr *addr)
        /* Update address in NIC data structure */
        rte_ether_addr_copy(&null_mac_addr, &dev->data->mac_addrs[index]);
 
-       /* reset pool bitmap */
-       dev->data->mac_pool_sel[index] = 0;
+       if ((dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_VMDQ_FLAG) != 
0) {
+               /* reset pool bitmap */
+               dev->data->mac_pool_sel[index] = 0;
+       }
 
        rte_ethdev_trace_mac_addr_remove(port_id, addr);
 
-- 
2.53.0

Reply via email to