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:
parent
7a0935239b
commit
27a300e6af
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -250,6 +250,7 @@ EXPERIMENTAL {
|
||||
rte_mtr_meter_policy_validate;
|
||||
|
||||
# added in 21.11
|
||||
rte_eth_macaddrs_get;
|
||||
rte_eth_rx_metadata_negotiate;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user