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 4eaa337f55..ea12e2722f 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