跳转至

网络设备配置


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