首页 > 解决方案 > 如何发送数据/触发以太网网络设备驱动程序的 ndo_start_xmit?

问题描述

我正在开发以太网网络设备驱动程序,我遵循的步骤将设备注册为 eth1 并为其分配了 MAC 地址(a0:b0,c0,d0,e0,f0)、IPV4 地址(192.168.10.127),甚至可以查看在 /sys/class/net 设备中创建的设备。有关信息,我按照所有步骤构建了内核设备驱动程序,它生成了一个 .ko 文件并使用 insmod 加载了驱动程序。

当我使用ifconfig eth1 up --> device open 被调用, ifconfig eth1 down --> device close 被调用, 但是当我 ping 它ping -I eth1 www.google.com(something)我看不到设备传输ndo_start_xmit回调未被触发/调用。

有人可以指导我如何触发 ndo_start_xmit 回调/将数据传输到以太网网络设备驱动程序吗?

标签: linuxnetworkingkernellinux-device-driverethernet

解决方案


当然,调用驱动程序的 start_xmit 例程是您的责任。由于现在只有您可以看到您的驱动程序 :-@),这意味着需要查看清单:

  1. 您的结构 net_dev_ops 是否声明 .ndo_start_xmit = <your_start_xmit>?
  2. 您的驱动程序中的某些例程是否充当 ndo_start_xmit 的调用者,您是否可以查看是否达到调用它的目的(大概您没有)?如果不是,为什么不呢?
  3. 您的驱动程序策略是否要求您发出 tx 中断?如果是这样,您能否验证它是否正在生成和处理?
  4. 您的驱动程序是否执行适当的 wmb() 调用以确保任何元数据已被写入/同步/对设备可见,以便它可以看到您有可用/排队发送的数据包并要求发送它?

如果您在一个已知工作的驱动程序上建模您的驱动程序,该驱动程序被选择为尽可能简单,那么所有这些点都应该从该驱动程序的代码中清晰可见。如果您这样做而不是尝试从头开始编写整个驱动程序,那么您就有更好的机会使任何设备驱动程序工作。


推荐阅读