【问题标题】:Path of the UDP packet from kernel to user-space in LinuxLinux内核到用户空间的UDP数据包路径
【发布时间】: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


【解决方案1】:

udp_rcv() 是作为.handler 传递给struct net_protocol 的回调。 您可以查看结构中此处理程序字段的用法,也可以查看是否发生了一些错误。有一个回调err_handler。也许这里发生丢包,会调用错误处理程序。

P。 S. 请记住,UDP 不能保证 100% 的传输成功,并且每 100 个数据包中的一个丢失数据包可能是预期的行为。 (:

【讨论】:

  • 不幸的是,在我的情况下没有调用 err_handler
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 2010-12-21
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多