Skip to content

网络设备配置 ​


更新于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_setuprte_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,则需要检测链路状态