Re: [PATCH v4 1/4] ethdev: add apis to support access device info
flat view
From: Wang, Liang-min <hidden>
Date: 2015-06-11 21:51:30
-----Original Message----- From: Ananyev, Konstantin Sent: Thursday, June 11, 2015 9:07 AM To: Wang, Liang-min; dev@dpdk.org Subject: RE: [dpdk-dev] [PATCH v4 1/4] ethdev: add apis to support access device infoquoted
-----Original Message----- From: Wang, Liang-min Sent: Thursday, June 11, 2015 1:58 PM To: Ananyev, Konstantin; dev@dpdk.org Subject: RE: [dpdk-dev] [PATCH v4 1/4] ethdev: add apis to support access device info Hi Konstantin,quoted
-----Original Message----- From: Ananyev, Konstantin Sent: Thursday, June 11, 2015 8:26 AM To: Wang, Liang-min; dev@dpdk.org Cc: Wang, Liang-min Subject: RE: [dpdk-dev] [PATCH v4 1/4] ethdev: add apis to support access device info Hi Larry,quoted
-----Original Message----- From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Liang-Min Larry Wang Sent: Wednesday, June 10, 2015 4:10 PM To: dev@dpdk.org Cc: Wang, Liang-min Subject: [dpdk-dev] [PATCH v4 1/4] ethdev: add apis to support access device info add new apis: - rte_eth_dev_default_mac_addr_set - rte_eth_dev_reg_leng - rte_eth_dev_reg_info - rte_eth_dev_eeprom_leng - rte_eth_dev_get_eeprom - rte_eth_dev_set_eeprom - rte_eth_dev_get_ringparam - rte_eth_dev_set_ringparam to enable reading device parameters (mac-addr, register, eeprom, ring) based upon ethtool alike data parameter specification. Signed-off-by: Liang-Min Larry Wang <redacted> --- lib/librte_ether/Makefile | 1 + lib/librte_ether/rte_eth_dev_info.h | 80 +++++++++++++++++ lib/librte_ether/rte_ethdev.c | 159+++++++++++++++++++++++++++++++++quoted
lib/librte_ether/rte_ethdev.h | 158++++++++++++++++++++++++++++++++quoted
lib/librte_ether/rte_ether_version.map | 8 ++ 5 files changed, 406 insertions(+) create mode 100644 lib/librte_ether/rte_eth_dev_info.hdiff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile index c0e5768..05209e9 100644 --- a/lib/librte_ether/Makefile +++ b/lib/librte_ether/Makefile@@ -51,6 +51,7 @@ SRCS-y += rte_ethdev.c SYMLINK-y-include +=rte_ether.h SYMLINK-y-include += rte_ethdev.h SYMLINK-y-include += rte_eth_ctrl.h +SYMLINK-y-include += rte_eth_dev_info.h # this lib depends upon: DEPDIRS-y += lib/librte_eal lib/librte_mempool lib/librte_ring lib/librte_mbuf diff --git a/lib/librte_ether/rte_eth_dev_info.h b/lib/librte_ether/rte_eth_dev_info.h new file mode 100644 index 0000000..002c4b5--- /dev/null +++ b/lib/librte_ether/rte_eth_dev_info.h@@ -0,0 +1,80 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2015 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the abovecopyrightquoted
quoted
quoted
+ * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote productsderivedquoted
quoted
quoted
+ * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ANDCONTRIBUTORSquoted
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,BUTquoted
quoted
NOTquoted
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY ANDFITNESS FORquoted
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THECOPYRIGHTquoted
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,INCIDENTAL,quoted
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING,quoted
quoted
BUT NOTquoted
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE,quoted
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVERCAUSEDquoted
quoted
AND ON ANYquoted
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,ORquoted
quoted
TORTquoted
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAYOUTquoted
quoted
OF THE USEquoted
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCHDAMAGE.quoted
+ */ + +#ifndef _RTE_ETH_DEV_INFO_H_ +#define _RTE_ETH_DEV_INFO_H_ + + +/* + * Placeholder for accessing device registers */ struct +rte_dev_reg_info { + void *buf; /**< Buffer for register */ + uint32_t offset; /**< Offset for 1st register to fetch */ + uint32_t leng; /**< Number of registers to fetch */ + uint32_t version; /**< Device version */ }; + +/* + * Placeholder for accessing device eeprom */ struct +rte_dev_eeprom_info { + void *buf; /**< Buffer for eeprom */ + uint32_t offset; /**< Offset for 1st eeprom location to access */ + uint32_t leng; /**< Length of eeprom region to access */ + uint32_t magic; /**< Device ID */ }; + +/* + * Placeholder for accessing device ring parameters */ struct +rte_dev_ring_info { + uint32_t rx_pending; /**< Number of outstanding Rx ring */ + uint32_t tx_pending; /**< Number of outstanding Tx ring */ + uint32_t rx_max_pending; /**< Maximum number of outstanding Rxring */quoted
+ uint32_t tx_max_pending; /**< Maximum number of outstanding Txringquoted
+*/ }; + +/* + * A data structure captures information as defined in struct +ifla_vf_info + * for user-space api + */ +struct rte_dev_vf_info { + uint32_t vf; + uint8_t mac[ETHER_ADDR_LEN]; + uint32_t vlan; + uint32_t tx_rate; + uint32_t spoofchk; +};Wonder what that structure is for? I can't see it used in any function below?Good catch, this is designed for other ethtool ops that I did not include inthis release, I will remove this from next fix.quoted
quoted
quoted
+ +#endif /* _RTE_ETH_DEV_INFO_H_ */diff --git a/lib/librte_ether/rte_ethdev.cb/lib/librte_ether/rte_ethdev.c index 5a94654..186e85c 100644--- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c@@ -2751,6 +2751,32 @@ rte_eth_dev_mac_addr_remove(uint8_tport_id,quoted
struct ether_addr *addr) } int +rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct +ether_addr +*addr) { + struct rte_eth_dev *dev; + const int index = 0; + const uint32_t pool = 0; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + dev = &rte_eth_devices[port_id]; + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_remove, -ENOTSUP);quoted
+ FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_add, -ENOTSUP);quoted
+ + /* Update NIC default MAC address*/ + (*dev->dev_ops->mac_addr_remove)(dev, index); + (*dev->dev_ops->mac_addr_add)(dev, addr, index, pool); + + /* Update default address in NIC data structure */ + ether_addr_copy(addr, &dev->data->mac_addrs[index]); + + return 0; +} + +int rte_eth_dev_set_vf_rxmode(uint8_t port_id, uint16_t vf, uint16_t rx_mode, uint8_t on) { @@ -3627,3+3653,136 @@quoted
quoted
quoted
rte_eth_remove_tx_callback(uint8_t port_id,uint16_t queue_id,quoted
/* Callback wasn't found. */ return -EINVAL; } + +int +rte_eth_dev_reg_leng(uint8_t port_id) { + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + if ((dev= &rte_eth_devices[port_id]) == NULL) { + PMD_DEBUG_TRACE("Invalid port device\n"); + return -ENODEV; + } + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_reg_length, -ENOTSUP);quoted
+ return (*dev->dev_ops->get_reg_length)(dev); +} + +int +rte_eth_dev_reg_info(uint8_t port_id, struct rte_dev_reg_info +*info) { + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + if ((dev= &rte_eth_devices[port_id]) == NULL) { + PMD_DEBUG_TRACE("Invalid port device\n"); + return -ENODEV; + } + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_reg, -ENOTSUP); + return (*dev->dev_ops->get_reg)(dev, info); }Seems that *get_reg* stuff, will be really good addition for DPDK debugging abilities. Though, I'd suggest we change it a bit to make more generic and flexible: Introduce rte_eth_reg_read/rte_eth_reg_write(), or probably even better rte_pcidev_reg_read /rte_pcidev_reg_write atEAL.quoted
quoted
Something similar to what port_pci_reg_read/port_pci_reg_write() are doing now at testpmd.h. struct rte_pcidev_reg_info { const char *name; uint32_t endianes, bar, offset, size, count; }; int rte_pcidev_reg_read(const struct rte_pci_device *, const struct rte_pcidev_reg_info *, uint64_t *reg_val); Then: int rte_eth_dev_get_reg_info(port_id, const struct rte_pcidev_reg_info **info); So each device would store in info a pointer to an array of it's register descriptions (finished by zero elem?). Then your ethtool (or any other upper layer) can do the following to read all device regs:The proposed reg info structure allows future improvement to supportindividual register read/write.quoted
Also, because each NIC device has a very distinguish register definition. So, the plan is to have more comprehensive interface to support query operation (for example, register name) before introduce individual/groupregister access.quoted
Points taken, the support will be in future release.Sorry, didn't get you. So you are ok to make these changes in next patch version?
I would like to get a consensus from dpdk community on how to provide register information. Currently, it's designed for debug dumping. The register information is very hardware dependent. Need to consider current supported NIC device and future devices for DPDK, so we won't make it a bulky interface.
quoted
quoted
const struct rte_eth_dev_reg_info *reg_info; struct rte_eth_dev_info dev_info; rte_eth_dev_info_get(pid, &dev_info); rte_eth_dev_get_reg_info(port_id, ®_info); for (i = 0; reg_info[i].name != NULL; i++) { ... rte_pcidev_read_reg(dev_info. pci_dev, reg_info[i], &v); .. }quoted
+ +int +rte_eth_dev_eeprom_leng(uint8_t port_id) { + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + if ((dev= &rte_eth_devices[port_id]) == NULL) { + PMD_DEBUG_TRACE("Invalid port device\n"); + return -ENODEV; + } + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_eeprom_length, -ENOTSUP);quoted
+ return (*dev->dev_ops->get_eeprom_length)(dev); +} + +int +rte_eth_dev_get_eeprom(uint8_t port_id, struct +rte_dev_eeprom_info +*info) { + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + if ((dev= &rte_eth_devices[port_id]) == NULL) { + PMD_DEBUG_TRACE("Invalid port device\n"); + return -ENODEV; + } + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_eeprom, -ENOTSUP);quoted
+ return (*dev->dev_ops->get_eeprom)(dev, info); } + +int +rte_eth_dev_set_eeprom(uint8_t port_id, struct +rte_dev_eeprom_info +*info) { + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + if ((dev= &rte_eth_devices[port_id]) == NULL) { + PMD_DEBUG_TRACE("Invalid port device\n"); + return -ENODEV; + } + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->set_eeprom, -ENOTSUP);quoted
+ return (*dev->dev_ops->set_eeprom)(dev, info); } + +int +rte_eth_dev_get_ringparam(uint8_t port_id, struct +rte_dev_ring_info +*info) { + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + if ((dev= &rte_eth_devices[port_id]) == NULL) { + PMD_DEBUG_TRACE("Invalid port device\n"); + return -ENODEV; + } + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_ringparam, -ENOTSUP);quoted
+ return (*dev->dev_ops->get_ringparam)(dev, info); }I think it will be a useful addition to the ethdev API to have an ability to retrieve current RX/TX queue parameters. Though again, it need to be more generic, so it could be useful for non- ethtool upper layer too. So I suggest to modify it a bit. Something like that: struct rte_eth_tx_queue_info { struct rte_eth_txconf txconf; uint32_t nb_tx_desc; uint32_t nb_max_tx_desc; /*max allowable TXDs for that queue */ uint32_t nb_tx_free; /* number of free TXDs at the moment ofcall.quoted
quoted
*/ /* other tx queue data. */ }; int rte_etdev_get_tx_queue_info(portid, queue_id, struct rte_eth_tx_queue_info *qinfo) Then, your upper layer ethtool wrapper, can implement yours ethtool_get_ringparam() by: ... struct rte_eth_tx_queue_info qinfo; rte_ethdev_get_tx_queue_info(port, 0, &qinfo); ring_param->tx_pending = qinfo.nb_tx_desc - rte_eth_rx_queue_count(port, 0); Or probably even: ring_param->tx_pending = qinfo.nb_tx_desc - qinfo.nb_tx_free; Same for RX.For now, this descriptor ring information is used by the ethtool op. To make this interface simple, i.e. caller doesn't need to access otherqueue information. I just repeat what I said to you in off-line conversation: ethdev API is not equal ethtool API. It is ok to add a new function/structure to ethdev if it really needed, but we should do mechanical one to one copy. It is much better to add a function/structure that would be more generic, and suit other users, not only ethtool. There is no point to have dozen functions in rte_ethdev API providing similar information. BTW, I don't see how API I proposed is much more complex, then yours one.
The ring parameter is a run-time information which is different than data structure described in this discussion. It's the desire of this patch to separate each data structure to avoid cross dependency.
Konstantinquoted
The plan it so keep this information as it is. For the expansion, the ethdev can invoke the same dev op to add thisinformation.quoted
quoted
quoted
+ +int +rte_eth_dev_set_ringparam(uint8_t port_id, struct +rte_dev_ring_info +*info) { + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + if ((dev= &rte_eth_devices[port_id]) == NULL) { + PMD_DEBUG_TRACE("Invalid port device\n"); + return -ENODEV; + } + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->set_ringparam, -ENOTSUP);quoted
+ return (*dev->dev_ops->set_ringparam)(dev, info); }I am a bit confused, what particular value of rte_dev_ring_info will be allowed to change? You can't change number of RXD/TXD at runtime. You have to stop the device first, and then reconfigure particularqueue(s).quoted
quoted
Again, you can't reset RXF/TXD without stopping RX/TX first. So what that function is supposed to do? As I can see currently, none of the PMD in your patch support it.Exactly, setting RXD/TXD will require some change on kernel (RX/TX burst)function.quoted
As you already observe that there is no dev_op registered for set_ring. The API is created as a placeholder for future implementation. There are a couple of idea thrown around (such as mono-increase/decrease to avoid buffer overrun).quoted
Any suggestion is welcome.quoted
Konstantinquoted
diff --git a/lib/librte_ether/rte_ethdev.hb/lib/librte_ether/rte_ethdev.h index 16dbe00..8f99f0d 100644--- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h@@ -182,6 +182,7 @@ extern "C" { #include <rte_devargs.h> #include "rte_ether.h" #include "rte_eth_ctrl.h" +#include "rte_eth_dev_info.h" struct rte_mbuf;@@ -1228,6 +1229,31 @@ typedef int (*eth_udp_tunnel_del_t)(structrte_eth_dev *dev,quoted
struct rte_eth_udp_tunnel *tunnel_udp);/**< @internalquoted
Delete tunneling UDP info */ +typedef int (*eth_get_reg_length_t)(struct rte_eth_dev *dev); +/**< @internal Retrieve device register count */ + +typedef int (*eth_get_reg_t)(struct rte_eth_dev *dev, + struct rte_dev_reg_info *info); /**<@internal Retrievequoted
quoted
quoted
+registers */ + +typedef int (*eth_get_eeprom_length_t)(struct rte_eth_dev *dev);/**<quoted
+@internal Retrieve eeprom size */ + +typedef int (*eth_get_eeprom_t)(struct rte_eth_dev *dev, + struct rte_dev_eeprom_info *info); /**<@internal Retrieve eepromquoted
+data */ + +typedef int (*eth_set_eeprom_t)(struct rte_eth_dev *dev, + struct rte_dev_eeprom_info *info); /**<@internal Program eepromquoted
+data */ + +typedef int (*eth_get_ringparam_t)(struct rte_eth_dev *dev, + struct rte_dev_ring_info *info); /**<@internal Retrievequoted
quoted
quoted
+device ring descriptor */ + +typedef int (*eth_set_ringparam_t)(struct rte_eth_dev *dev, + struct rte_dev_ring_info *info); /**<@internal Set devicequoted
quoted
quoted
+ring descriptor */ #ifdef RTE_NIC_BYPASS@@ -1368,6 +1394,21 @@ struct eth_dev_ops { reta_update_t reta_update; /** Query redirection table. */ reta_query_t reta_query; + + eth_get_reg_length_t get_reg_length; + /**< Get # of registers */ + eth_get_reg_t get_reg; + /**< Get registers */ + eth_get_eeprom_length_t get_eeprom_length; + /**< Get eeprom length */ + eth_get_eeprom_t get_eeprom; + /**< Get eeprom data */ + eth_set_eeprom_t set_eeprom; + /**< Set eeprom */ + eth_get_ringparam_t get_ringparam; + /**< Get descriptor ring parameters */ + eth_set_ringparam_t set_ringparam; + /**< Set descriptor ring parameters */ /* bypass control */ #ifdef RTE_NIC_BYPASS bypass_init_t bypass_init;@@ -2982,6 +3023,20 @@ int rte_eth_dev_mac_addr_add(uint8_tport,quoted
quoted
quoted
struct ether_addr *mac_addr, intrte_eth_dev_mac_addr_remove(uint8_tquoted
port, struct ether_addr *mac_addr); /** + * Set the default MAC address. + * + * @param port + * The port identifier of the Ethernet device. + * @param mac_addr + * New default MAC address. + * @return + * - (0) if successful, or *mac_addr* didn't exist. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port* invalid. + */ +int rte_eth_dev_default_mac_addr_set(uint8_t port, struct +ether_addr *mac_addr); + +/** * Update Redirection Table(RETA) of Receive Side Scaling of Ethernetdevice.quoted
* * @param port@@ -3611,6 +3666,109 @@ int rte_eth_remove_rx_callback(uint8_tport_id, uint16_t queue_id, int rte_eth_remove_tx_callback(uint8_tport_id, uint16_t queue_id,quoted
struct rte_eth_rxtx_callback *user_cb); +/** + * Retrieve number of available registers for access + * + * @param port_id + * The port identifier of the Ethernet device. + * @return + * - (>=0) number of registers if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_reg_leng(uint8_t port_id); + +/** + * Retrieve device registers and register attributes + * + * @param port_id + * The port identifier of the Ethernet device. + * @param info + * The template includes buffer for register data and attribute to befilled.quoted
+ * @return + * - (0) if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_reg_info(uint8_t port_id, struct rte_dev_reg_info +*info); + +/** + * Retrieve size of device EEPROM + * + * @param port_id + * The port identifier of the Ethernet device. + * @return + * - (>=0) EEPROM size if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_eeprom_leng(uint8_t port_id); + +/** + * Retrieve EEPROM and EEPROM attribute + * + * @param port_id + * The port identifier of the Ethernet device. + * @param info + * The template includes buffer for return EEPROM data and + * EEPROM attributes to be filled. + * @return + * - (0) if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_get_eeprom(uint8_t port_id, struct +rte_dev_eeprom_info *info); + +/** + * Program EEPROM with provided data + * + * @param port_id + * The port identifier of the Ethernet device. + * @param info + * The template includes EEPROM data for programming and + * EEPROM attributes to be filled + * @return + * - (0) if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_set_eeprom(uint8_t port_id, struct +rte_dev_eeprom_info *info); + +/** + * Retrieve device descriptor ring information + * + * @param port_id + * The port identifier of the Ethernet device. + * @param info + * The template includes device ring descriptor usage information. + * @return + * - (0) if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_get_ringparam(uint8_t port_id, struct +rte_dev_ring_info *info); + +/** + * Set device ring descriptor parameters + * + * @param port_id + * The port identifier of the Ethernet device. + * @param info + * The template includes descriptor ring parameters to be set. + * @return + * - (0) if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_set_ringparam(uint8_t port_id, struct +rte_dev_ring_info *info); + #ifdef __cplusplus } #endifdiff --git a/lib/librte_ether/rte_ether_version.mapb/lib/librte_ether/rte_ether_version.map index a2d25a6..1b1e092 100644--- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map@@ -102,6 +102,14 @@ DPDK_2.0 { rte_eth_tx_queue_setup; rte_eth_xstats_get; rte_eth_xstats_reset; + rte_eth_dev_default_mac_addr_set; + rte_eth_dev_reg_leng; + rte_eth_dev_reg_info; + rte_eth_dev_eeprom_leng; + rte_eth_dev_get_eeprom; + rte_eth_dev_set_eeprom; + rte_eth_dev_get_ringparam; + rte_eth_dev_set_ringparam; local: *; }; --2.1.4