So this patch adds a remove operation in set default MAC API documents
this behavior.
Let's be clear here: only the new default address is removed from the rest of
the list.
Fixes: 854d8ad4ef68 ("ethdev: add default mac address modifier")
Cc: sta...@dpdk.org
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -116,7 +116,12 @@ struct rte_eth_dev_data {
uint64_t rx_mbuf_alloc_failed; /**< Rx ring mbuf allocation failures */
- /** Device Ethernet link address. @see rte_eth_dev_release_port() */
+ /**
+ * Device Ethernet link address. The index zero of the array is as the
It should be "addresses" as there can be multiple.
What means "as" above?
Can we say the first entry (index zero) is the default address?
+ * index of the default address, and other indexes can't be the same
You can split the sentence in 2 instead of ", and".
indexes -> entries
can't -> cannot
+ * as the address corresponding to index 0.
simpler: as the default address.
+ * @see rte_eth_dev_release_port()
Why referencing this function here?
+ */
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -4498,7 +4498,10 @@ rte_eth_dev_mac_addr_remove(uint16_t port_id, struct
rte_ether_addr *addr)
int
rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr
*addr)
{
+ uint64_t mac_pool_sel_bk = 0;
struct rte_eth_dev *dev;
+ uint32_t pool;
+ int index;
int ret;
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
@@ -4517,16 +4520,50 @@ rte_eth_dev_default_mac_addr_set(uint16_t port_id,
struct rte_ether_addr *addr)
if (*dev->dev_ops->mac_addr_set == NULL)
return -ENOTSUP;
+ /*
+ * If the address has been added as a non-default MAC address by
+ * rte_eth_dev_mac_addr_add API, it should be removed from
+ * dev->data->mac_addrs[].
+ */
Make is simpler:
"Keep address unique in dev->data->mac_addrs[]."
+ index = eth_dev_get_mac_addr_index(port_id, addr);
+ if (index > 0) {
+ /* Remove address in dev data structure */
+ mac_pool_sel_bk = dev->data->mac_pool_sel[index];
+ ret = rte_eth_dev_mac_addr_remove(port_id, addr);
+ if (ret < 0) {
+ RTE_ETHDEV_LOG(ERR, "Delete MAC address from the MAC list of
ethdev port %u.\n",
+ port_id);
It is not clear with this log that it failed.
+ return ret;
+ }
+ /* Reset pool bitmap */
+ dev->data->mac_pool_sel[index] = 0;
mac_pool_sel[index] is already reset in rte_eth_dev_mac_addr_remove().
+ }
ret = (*dev->dev_ops->mac_addr_set)(dev, addr);
if (ret < 0)
- return ret;
+ goto out;
/* Update default address in NIC data structure */
rte_ether_addr_copy(addr, &dev->data->mac_addrs[0]);
return 0;
-}
+out:
+ if (index > 0) {
+ pool = 0;
+ do {
+ if (mac_pool_sel_bk & UINT64_C(1)) {
+ if (rte_eth_dev_mac_addr_add(port_id, addr,
+ pool) != 0)
+ RTE_ETHDEV_LOG(ERR, "failed to restore MAC
pool id(%u) in port %u.\n",
+ pool, port_id);
+ }
+ mac_pool_sel_bk >>= 1;
+ pool++;
+ } while (mac_pool_sel_bk != 0);
+ }
+
+ return ret;
+}
Can we avoid this rollback by removing the address after mac_addr_set() succeed?