【发布时间】:2015-08-06 17:55:34
【问题描述】:
我正在维护一些网络驱动程序,但我遇到了一些丢失数据的问题。效果是,当我使用 ping 或 nping 发送例如 ICMP 或 UDP ping 时,一些 udp/icmp 数据包会丢失。
我确信在传输的 ping/nping 端,我的驱动程序和内核会收到 ping 回复(tcpdump 显示传入的 udp 或 icmp 数据包作为回复)。
但应用程序 ping/nping 有时会显示例如 80% 的数据包丢失。我怀疑这些数据包在内核和用户空间之间的某个地方丢失了。
我知道对于 UDP,有一个过程 udp_rcv() 用于维护 UDP 数据包,但我不知道在将数据包传递到用户空间应用程序的路径中下一个过程是哪个过程。
Linux 内核版本为 3.3.8。
我的问题是 - 如何跟踪数据包从我的驱动程序到用户空间套接字缓冲区的整个转换路径?
【问题讨论】:
-
也许SystemTap?
-
我正在为某些嵌入式系统编写此驱动程序,不幸的是不支持 systemtap。
-
还有多个其他选项可以跟踪内核:kprobes、ftrace、
pr_debug()。但是您确定需要跟踪所有路径吗?您没有尝试将调试打印添加到您自己的驱动程序中吗? -
是的,我的驱动程序中有调试 printk,它们打印有关接收到的数据包的信息,并且这些数据包成功传递给内核。内核还报告接收数据(它还包含我的 printk)。问题似乎出在内核和用户空间之间。
标签: c linux udp linux-device-driver