网络设备配置¶
更新于2021-09-11
网络设备接口¶
主要由两部分组成:
- 面向应用的接口
- 配置网络设备接口---网卡配置,设置收发队列,启动网卡
- 设备信息获取接口---获取MAC地址,链路状态,速率
- 收发包接口
- 等
- 面向驱动的接口
- 分配实例
- memzone创建
- 注册回调接口
- 等
注意事项¶
- PMD默认函数都是
无锁的,不能同时在多个逻辑核上操作同一个网络设备 - 一个
收包队列只能由一个逻辑核处理,同一网口上的多个收包队列可以由多个不同的逻辑核处理 - 如果要用多个逻辑核去操作一个队列,请自行加锁保护
网卡表示¶
端口标识符¶
端口标识符,一个大于或者等于0的整数
在所有网络设备API中,网络设备使用端口标识符标识一个网口
rte_eth_dev¶
在网卡驱动程序级别,使用结构体rte_eth_dev存储网口相关信息
初始化¶
网口在EAL初始化时执行PCI探测阶段动态注册
当探测到网口时,会为该设备分配一个 rte_eth_dev 结构和一个新的端口标识符
初始化阶段在eth_dev_init中完成
设备初始化函数的作用包括:
- 重置硬件
- 检查对非易失性存储器 (NVM) 的访问
- 从 NVM 读取 MAC 地址
- ...
如果设备初始化操作成功,
该设备的端口标识符与对应关系rte_eth_dev 结构将标识有效
否则rte_eth_dev结构和`端口标识符将被释放
### 初始化API流程 * rte_eth_dev_configure()---配置网口 * rte_eth_tx_queue_setup()---配置发送队列 * rte_eth_rx_queue_setup()---配置接受队列 * rte_eth_dev_start()---启动网口
网络设备启动后,应用可以获取网络设备信息,例如:网口MAC地址,速率,物理链路状态等
并可以收发包
更改网口配置¶
如果想改变网口配置(例如:调用
rte_eth_dev_configure`` rte_eth_tx_queue_setup
rte_eth_rx_queue_setup)
则必须先调用rte_eth_dev_stop关闭网口
然后更改配置
最后调用rte_eth_rx_queue_setup启动网卡.
网卡停止时,不能调用收发包函数
注意:¶
有些配置不会在rte_eth_dev_stop()与rte_eth_dev_start()中保留,
会被保存的配置¶
-
- MTU
-
- flow control settings
-
- receive mode configuration (promiscuous mode, all-multicast mode,
- hardware checksum mode, RSS/VMDQ settings etc.)
-
- VLAN filtering configuration
-
- default MAC address
-
- MAC addresses supplied to MAC address array
-
- flow director filtering mode (but not filtering rules)
-
- NIC queue statistics mappings
不会被保存的配置¶
在调用 rte_eth_dev_start之前不被存储的配置需要重新配置
关闭网络设备¶
调用rte_eth_dev_close关闭网络设备
eth_dev_ops¶
eth_dev_ops包含一组通用函数指针,包含网卡驱动程序所有特定功能
eth_dev_ops存储在 rte_eth_dev,PCI 探测阶段初始化
性能优化¶
为了提高性能,避免额外的间接内存访问
收发包函数地址不在eth_dev_ops中,而是直接存储在rte_eth_dev中
采用轮询而不是终端来收发报文
启用接收/发送功能以利用面向突发的硬件特性(L1 缓存、预取指令、网卡头/尾寄存器) 以最小化每个数据包的 CPU 周期数,例如, * 通过避免对环形描述符进行无用的读取内存访问,或 * 通过系统地使用完全适合 L1 缓存行的指针数组边界和大小。
为了节省开销,突发收包类型函数(例如:rte_eth_rx_burst)没有错误返回值,
如果该函数多次返回0,则需要检测链路状态