Two issues affect fail-safe MAC address handling:

- fs_mac_addr_add() grew the pool but set nb_mac_addr to the index of
  the new entry instead of the entry count (index + 1). The pool size
  was off by one and the last added address was dropped when the
  configuration was replayed to a sub-device.

- fs_eth_dev_conf_apply() replayed every slot of the MAC address array
  to a (re)plugged sub-device, including slots left zeroed by a
  previous remove, which made rte_eth_dev_mac_addr_add() fail on the
  all-zero address.

Set nb_mac_addr to index + 1 and skip zeroed slots when replaying the
MAC addresses.

Fixes: a46f8d584eb8 ("net/failsafe: add fail-safe PMD")
Fixes: ebea83f899d8 ("net/failsafe: add plug-in support")
Cc: [email protected]
Signed-off-by: Sandeep Penigalapati <[email protected]>
---
 drivers/net/failsafe/failsafe_ether.c | 3 +++
 drivers/net/failsafe/failsafe_ops.c   | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/failsafe/failsafe_ether.c 
b/drivers/net/failsafe/failsafe_ether.c
index 1702b1a604..21779f9be8 100644
--- a/drivers/net/failsafe/failsafe_ether.c
+++ b/drivers/net/failsafe/failsafe_ether.c
@@ -177,6 +177,9 @@ fs_eth_dev_conf_apply(struct rte_eth_dev *dev,
                struct rte_ether_addr *ea;
 
                ea = &dev->data->mac_addrs[i];
+               /* Removed addresses leave a zeroed slot. */
+               if (rte_is_zero_ether_addr(ea))
+                       continue;
                ret = rte_eth_dev_mac_addr_add(PORT_ID(sdev), ea,
                                PRIV(dev)->mac_addr_pool[i]);
                if (ret) {
diff --git a/drivers/net/failsafe/failsafe_ops.c 
b/drivers/net/failsafe/failsafe_ops.c
index 79aa57cb35..56c7c884a1 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -1460,7 +1460,7 @@ fs_mac_addr_add(struct rte_eth_dev *dev,
        }
        if (index >= PRIV(dev)->nb_mac_addr) {
                DEBUG("Growing mac_addrs array");
-               PRIV(dev)->nb_mac_addr = index;
+               PRIV(dev)->nb_mac_addr = index + 1;
        }
        PRIV(dev)->mac_addr_pool[index] = vmdq;
        fs_unlock(dev, 0);
-- 
2.34.1

Reply via email to