跳转至

驱动程序测试:环回

测试原理

lotest 命令可以在高数据包负载下独立验证接收和发送数据路径的正确性,且不依赖外部服务器或网络组件。此外,它是少数能够检测接收数据路径是否正确剥离 CRC 的测试之一。

背景

lotest 使用同一台机器上的两个网络接口运行,两个接口都由 iPXE 控制。两个接口之间应使用一根网线直接连接,中间不经过交换机。

理想情况下,其中一个网络接口应属于一块已知良好的网卡,且不受你正在开发的驱动程序控制,因为这样可以把问题隔离到发送或接收数据路径之一。如果你测试的是双端口网卡,那么可以使用这两个端口作为两个接口,但要注意的是,这样将无法轻易区分发送和接收数据路径中的问题。

A network card

测试步骤

  1. 开始之前,确保你的网络接口与同一台机器上的第二个网络接口直接相连。
  2. 引导进入启用了 LOTEST_CMD 且支持这两个网络接口的 iPXE 版本。
  3. 使用 ifstat 确定你的网络接口名称(下文假定为 net0)和第二个网络接口的名称(下文假定为 net1)。
  4. 使用 lotest net0 net1 开始测试发送数据路径。
  5. 验证 lotest 显示的数据包计数器稳定而快速地增长。
  6. 使用 Ctrl-C 中止测试。
  7. 使用 lotest net1 net0 开始测试接收数据路径。
  8. 验证 lotest 显示的数据包计数器稳定而快速地增长。
  9. 使用 Ctrl-C 中止测试。

故障排除

长度不匹配

在测试接收数据路径时,如果你的驱动程序没有正确地从接收数据包中剥离以太网 CRC,你会观察到 Length mismatch 错误。理想情况下,你应将网卡配置为在硬件中剥离 CRC。如果网卡不支持,那么你可以在把接收数据包传递给 netdev_rx() 之前,将其长度减去 4 字节,以软件方式剥离 CRC:

  iob_put ( iobuf, ( len - 4 /* strip CRC */ ) );
  netdev_rx ( netdev, iobuf );