ethdev: add API to retrieve multiple MAC addresses

Introduce rte_eth_macaddrs_get() to allow user to retrieve all ethernet
addresses assigned to given port.
Change testpmd to use this new function and avoid referencing directly
rte_eth_devices[].

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
Tested-by: Feifei Wang <feifei.wang2@arm.com>
This commit is contained in:
Konstantin Ananyev 2021-10-13 14:37:03 +01:00 committed by Ferruh Yigit
parent 7a0935239b
commit 27a300e6af
5 changed files with 66 additions and 12 deletions

View File

@ -5215,20 +5215,20 @@ show_macs(portid_t port_id)
{
char buf[RTE_ETHER_ADDR_FMT_SIZE];
struct rte_eth_dev_info dev_info;
struct rte_ether_addr *addr;
uint32_t i, num_macs = 0;
struct rte_eth_dev *dev;
dev = &rte_eth_devices[port_id];
int32_t i, rc, num_macs = 0;
if (eth_dev_info_get_print_err(port_id, &dev_info))
return;
for (i = 0; i < dev_info.max_mac_addrs; i++) {
addr = &dev->data->mac_addrs[i];
struct rte_ether_addr addr[dev_info.max_mac_addrs];
rc = rte_eth_macaddrs_get(port_id, addr, dev_info.max_mac_addrs);
if (rc < 0)
return;
for (i = 0; i < rc; i++) {
/* skip zero address */
if (rte_is_zero_ether_addr(addr))
if (rte_is_zero_ether_addr(&addr[i]))
continue;
num_macs++;
@ -5236,14 +5236,13 @@ show_macs(portid_t port_id)
printf("Number of MAC address added: %d\n", num_macs);
for (i = 0; i < dev_info.max_mac_addrs; i++) {
addr = &dev->data->mac_addrs[i];
for (i = 0; i < rc; i++) {
/* skip zero address */
if (rte_is_zero_ether_addr(addr))
if (rte_is_zero_ether_addr(&addr[i]))
continue;
rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, addr);
rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, &addr[i]);
printf(" %s\n", buf);
}
}

View File

@ -75,6 +75,11 @@ New Features
operations.
* Added multi-process support.
* **Added support to get all MAC addresses of a device.**
Added ``rte_eth_macaddrs_get`` to allow user to retrieve all Ethernet
addresses assigned to given ethernet port.
* **Added new RSS offload types for IPv4/L4 checksum in RSS flow.**
Added macros ETH_RSS_IPV4_CHKSUM and ETH_RSS_L4_CHKSUM, now IPv4 and

View File

@ -3544,6 +3544,31 @@ rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t ptype_mask,
return ret;
}
int
rte_eth_macaddrs_get(uint16_t port_id, struct rte_ether_addr *ma,
unsigned int num)
{
int32_t ret;
struct rte_eth_dev *dev;
struct rte_eth_dev_info dev_info;
if (ma == NULL) {
RTE_ETHDEV_LOG(ERR, "%s: invalid parameters\n", __func__);
return -EINVAL;
}
/* will check for us that port_id is a valid one */
ret = rte_eth_dev_info_get(port_id, &dev_info);
if (ret != 0)
return ret;
dev = &rte_eth_devices[port_id];
num = RTE_MIN(dev_info.max_mac_addrs, num);
memcpy(ma, dev->data->mac_addrs, num * sizeof(ma[0]));
return num;
}
int
rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr)
{

View File

@ -3007,6 +3007,30 @@ int rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id,
*/
int rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Retrieve the Ethernet addresses of an Ethernet device.
*
* @param port_id
* The port identifier of the Ethernet device.
* @param ma
* A pointer to an array of structures of type *ether_addr* to be filled with
* the Ethernet addresses of the Ethernet device.
* @param num
* Number of elements in the @p ma array.
* Note that rte_eth_dev_info::max_mac_addrs can be used to retrieve
* max number of Ethernet addresses for given port.
* @return
* - number of retrieved addresses if successful
* - (-ENODEV) if *port_id* invalid.
* - (-EINVAL) if bad parameter.
*/
__rte_experimental
int rte_eth_macaddrs_get(uint16_t port_id, struct rte_ether_addr *ma,
unsigned int num);
/**
* Retrieve the contextual information of an Ethernet device.
*

View File

@ -250,6 +250,7 @@ EXPERIMENTAL {
rte_mtr_meter_policy_validate;
# added in 21.11
rte_eth_macaddrs_get;
rte_eth_rx_metadata_negotiate;
};