This patch fix patch-287 duplicate address setting. Signed-off-by: Dengdui Huang <huangdengdui@huawei.com> (cherry picked from commit c46b089b736f2573391d7c02b1a8b518b217a12c)
112 lines
3.9 KiB
Diff
112 lines
3.9 KiB
Diff
From 9b1a4cdf89156605b4b5a5b1a5f5507423964dc9 Mon Sep 17 00:00:00 2001
|
|
From: Huisong Li <lihuisong@huawei.com>
|
|
Date: Fri, 19 May 2023 17:31:55 +0800
|
|
Subject: [PATCH] ethdev: fix MAC address occupies two entries
|
|
|
|
[ upstream commit 8f02f472a29432650d999969359d6a49ea6aadca ]
|
|
|
|
The dev->data->mac_addrs[0] will be changed to a new MAC address when
|
|
applications modify the default MAC address by .mac_addr_set(). However,
|
|
if the new default one has been added as a non-default MAC address by
|
|
.mac_addr_add(), the .mac_addr_set() didn't check this address.
|
|
As a result, this MAC address occupies two entries in the list. Like:
|
|
add(MAC1)
|
|
add(MAC2)
|
|
add(MAC3)
|
|
add(MAC4)
|
|
set_default(MAC3)
|
|
default=MAC3, the rest of the list=MAC1, MAC2, MAC3, MAC4
|
|
Note: MAC3 occupies two entries.
|
|
|
|
But .mac_addr_set() cannot remove it implicitly in case of MAC address
|
|
shrinking in the list.
|
|
So this patch adds a check on whether the new default address was
|
|
already in the list and if so requires the user to remove it first.
|
|
|
|
In addition, this patch documents the position of the default MAC
|
|
address and address unique in the list.
|
|
|
|
Fixes: 854d8ad4ef68 ("ethdev: add default mac address modifier")
|
|
Cc: stable@dpdk.org
|
|
|
|
Signed-off-by: Huisong Li <lihuisong@huawei.com>
|
|
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
|
|
Acked-by: Thomas Monjalon <thomas@monjalon.net>
|
|
Reviewed-by: Ferruh Yigit <ferruh.yigit@amd.com>
|
|
---
|
|
lib/ethdev/ethdev_driver.h | 6 +++++-
|
|
lib/ethdev/rte_ethdev.c | 10 ++++++++++
|
|
lib/ethdev/rte_ethdev.h | 4 ++++
|
|
3 files changed, 19 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
|
|
index d3de203d7a..6f539d45c6 100644
|
|
--- a/lib/ethdev/ethdev_driver.h
|
|
+++ b/lib/ethdev/ethdev_driver.h
|
|
@@ -111,7 +111,11 @@ 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 addresses.
|
|
+ * All entries are unique.
|
|
+ * The first entry (index zero) is the default address.
|
|
+ */
|
|
struct rte_ether_addr *mac_addrs;
|
|
/** Bitmap associating MAC addresses to pools */
|
|
uint64_t mac_pool_sel[RTE_ETH_NUM_RECEIVE_MAC_ADDR];
|
|
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
|
|
index 4e5499ad2d..bd5dac284d 100644
|
|
--- a/lib/ethdev/rte_ethdev.c
|
|
+++ b/lib/ethdev/rte_ethdev.c
|
|
@@ -4470,6 +4470,7 @@ int
|
|
rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr)
|
|
{
|
|
struct rte_eth_dev *dev;
|
|
+ int index;
|
|
int ret;
|
|
|
|
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
|
|
@@ -4487,6 +4488,15 @@ rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr)
|
|
|
|
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_set, -ENOTSUP);
|
|
|
|
+ /* Keep address unique in dev->data->mac_addrs[]. */
|
|
+ index = eth_dev_get_mac_addr_index(port_id, addr);
|
|
+ if (index > 0) {
|
|
+ RTE_ETHDEV_LOG(ERR,
|
|
+ "New default address for port %u was already in the address list. Please remove it first.\n",
|
|
+ port_id);
|
|
+ return -EEXIST;
|
|
+ }
|
|
+
|
|
ret = (*dev->dev_ops->mac_addr_set)(dev, addr);
|
|
if (ret < 0)
|
|
return ret;
|
|
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
|
|
index b262939a33..9df50c30b4 100644
|
|
--- a/lib/ethdev/rte_ethdev.h
|
|
+++ b/lib/ethdev/rte_ethdev.h
|
|
@@ -4167,6 +4167,9 @@ int rte_eth_dev_mac_addr_remove(uint16_t port_id,
|
|
|
|
/**
|
|
* Set the default MAC address.
|
|
+ * It replaces the address at index 0 of the MAC address list.
|
|
+ * If the address was already in the MAC address list,
|
|
+ * please remove it first.
|
|
*
|
|
* @param port_id
|
|
* The port identifier of the Ethernet device.
|
|
@@ -4177,6 +4180,7 @@ int rte_eth_dev_mac_addr_remove(uint16_t port_id,
|
|
* - (-ENOTSUP) if hardware doesn't support.
|
|
* - (-ENODEV) if *port* invalid.
|
|
* - (-EINVAL) if MAC address is invalid.
|
|
+ * - (-EEXIST) if MAC address was already in the address list.
|
|
*/
|
|
int rte_eth_dev_default_mac_addr_set(uint16_t port_id,
|
|
struct rte_ether_addr *mac_addr);
|
|
--
|
|
2.23.0
|
|
|