linux - 如何发送数据/触发以太网网络设备驱动程序的 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 回调/将数据传输到以太网网络设备驱动程序吗?
解决方案
当然,调用驱动程序的 start_xmit 例程是您的责任。由于现在只有您可以看到您的驱动程序 :-@),这意味着您需要查看清单:
- 您的结构 net_dev_ops 是否声明 .ndo_start_xmit = <your_start_xmit>?
- 您的驱动程序中的某些例程是否充当 ndo_start_xmit 的调用者,您是否可以查看是否达到调用它的目的(大概您没有)?如果不是,为什么不呢?
- 您的驱动程序策略是否要求您发出 tx 中断?如果是这样,您能否验证它是否正在生成和处理?
- 您的驱动程序是否执行适当的 wmb() 调用以确保任何元数据已被写入/同步/对设备可见,以便它可以看到您有可用/排队发送的数据包并要求发送它?
如果您在一个已知工作的驱动程序上建模您的驱动程序,该驱动程序被选择为尽可能简单,那么所有这些点都应该从该驱动程序的代码中清晰可见。如果您这样做而不是尝试从头开始编写整个驱动程序,那么您就有更好的机会使任何设备驱动程序工作。
推荐阅读
- flutter - 如何在不使用 Firebase 的情况下在 Flutter 中进行 OTP 身份验证?
- php - 使用 Livewire + mcamara/laravel-localization 发布 404
- python - 将 int 变量保存在文本文件中
- excel - 如何检查一个 char 的存在,如果它是真的,然后做一个数学函数?
- azure - 如何检查 Azure 广告中的用户是否禁用了密码过期
- c# - 在 TPL 数据流中动态订阅/取消订阅
- c# - System.Text.Json - 反序列化可以是空字符串或类的对象
- python - 为什么我收到“ModuleNotFoundError:没有模块名称“pyperclip”?
- javascript - 使用 NodeJS req.user 的 Passport OpenIdConnect 身份验证未填充应用程序特定的用户详细信息
- c# - 为组合框设置数据源