使用DPDK进行报文收发,网卡被DPDKPMD驱动接管,所以以前可以使用ethtool工具配置的网卡属性,现在都需要通过DPDK提供的API函数来进行配置。
《DPDK官方文档说明》中我们对DPDK官方提供的文档做了整体说明,今天来具体看一下DPDK提供的针对网卡各属性进行操作的API函数。
1、获取网卡支持的速率双工配置
int rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info);
根据port_id获取对应网卡的速率双工配置,从struct rte_eth_dev_info的speed_capa字段获取,speed_capa是一个位图, 取值可能为:
#define RTE_ETH_LINK_SPEED_AUTONEG 0 /**< Autonegotiate (all speeds) */
#define ETH_LINK_SPEED_AUTONEG RTE_ETH_LINK_SPEED_AUTONEG
#define RTE_ETH_LINK_SPEED_FIXED RTE_BIT32(0) /**< Disable autoneg (fixed speed) */
#define ETH_LINK_SPEED_FIXED RTE_ETH_LINK_SPEED_FIXED
#define RTE_ETH_LINK_SPEED_10M_HD RTE_BIT32(1) /**< 10 Mbps half-duplex */
#define ETH_LINK_SPEED_10M_HD RTE_ETH_LINK_SPEED_10M_HD
#define RTE_ETH_LINK_SPEED_10M RTE_BIT32(2) /**< 10 Mbps full-duplex */
#define ETH_LINK_SPEED_10M RTE_ETH_LINK_SPEED_10M
#define RTE_ETH_LINK_SPEED_100M_HD RTE_BIT32(3) /**< 100 Mbps half-duplex */
#define ETH_LINK_SPEED_100M_HD RTE_ETH_LINK_SPEED_100M_HD
#define RTE_ETH_LINK_SPEED_100M RTE_BIT32(4) /**< 100 Mbps full-duplex */
#define ETH_LINK_SPEED_100M RTE_ETH_LINK_SPEED_100M
#define RTE_ETH_LINK_SPEED_1G RTE_BIT32(5) /**< 1 Gbps */
#define ETH_LINK_SPEED_1G RTE_ETH_LINK_SPEED_1G
#define RTE_ETH_LINK_SPEED_2_5G RTE_BIT32(6) /**< 2.5 Gbps */
#define ETH_LINK_SPEED_2_5G RTE_ETH_LINK_SPEED_2_5G
#define RTE_ETH_LINK_SPEED_5G RTE_BIT32(7) /**< 5 Gbps */
#define ETH_LINK_SPEED_5G RTE_ETH_LINK_SPEED_5G
#define RTE_ETH_LINK_SPEED_10G RTE_BIT32(8) /**< 10 Gbps */
#define ETH_LINK_SPEED_10G RTE_ETH_LINK_SPEED_10G
#define RTE_ETH_LINK_SPEED_20G RTE_BIT32(9) /**< 20 Gbps */
#define ETH_LINK_SPEED_20G RTE_ETH_LINK_SPEED_20G
#define RTE_ETH_LINK_SPEED_25G RTE_BIT32(10) /**< 25 Gbps */
#define ETH_LINK_SPEED_25G RTE_ETH_LINK_SPEED_25G
#define RTE_ETH_LINK_SPEED_40G RTE_BIT32(11) /**< 40 Gbps */
#define ETH_LINK_SPEED_40G RTE_ETH_LINK_SPEED_40G
#define RTE_ETH_LINK_SPEED_50G RTE_BIT32(12) /**< 50 Gbps */
#define ETH_LINK_SPEED_50G RTE_ETH_LINK_SPEED_50G
#define RTE_ETH_LINK_SPEED_56G RTE_BIT32(13) /**< 56 Gbps */
#define ETH_LINK_SPEED_56G RTE_ETH_LINK_SPEED_56G
#define RTE_ETH_LINK_SPEED_100G RTE_BIT32(14) /**< 100 Gbps */
#define ETH_LINK_SPEED_100G RTE_ETH_LINK_SPEED_100G
#define RTE_ETH_LINK_SPEED_200G RTE_BIT32(15) /**< 200 Gbps */
#define ETH_LINK_SPEED_200G RTE_ETH_LINK_SPEED_200G
2、获取网卡链路状态
根据port_id获取网卡的链路状态,包括网卡速率、双工状态、网卡协商状态和up/down状态。
int rte_eth_link_get(uint16_t port_id, struct rte_eth_link *link); //设定的时间内(9s) 内不断的轮询接口状态,当获取到一次 up 就立刻返回,或者当时间耗尽时仍旧为 down 则返回 down 的状态
int rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *link); //直接读取当前状态,不需要等待
struct rte_eth_link {
uint32_t link_speed; /**< RTE_ETH_SPEED_NUM_ */ //网卡当前速率
uint16_t link_duplex : 1; /**< RTE_ETH_LINK_[HALF/FULL]_DUPLEX */ //网卡半双工/全双工状态
uint16_t link_autoneg : 1; /**< RTE_ETH_LINK_[AUTONEG/FIXED] */
//网卡协商/固定速率
uint16_t link_status : 1; /**< RTE_ETH_LINK_[DOWN/UP] */ //网卡up/down状态
} __rte_aligned(8); /**< aligned for atomic64 read/write */
3、链路状态事件
int rte_eth_dev_callback_register(uint16_t port_id,
enum rte_eth_event_type event,
rte_eth_dev_cb_fn cb_fn, void *cb_arg);
rte_eth_dev_callback_register函数注册网卡的链路状态事件,当rte_eth_event_type对应事件发生时,会触发调用cb_fn回调函数。
enum rte_eth_eve