Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux中UDP数据包从内核到用户空间的路径_C_Linux_Udp_Linux Device Driver - Fatal编程技术网

C Linux中UDP数据包从内核到用户空间的路径

C Linux中UDP数据包从内核到用户空间的路径,c,linux,udp,linux-device-driver,C,Linux,Udp,Linux Device Driver,我正在维护一些网络驱动程序,我遇到了一些数据丢失的问题。其效果是,当我使用ping或nping发送例如ICMP或UDP ping时,一些UDP/ICMP数据包丢失 我确信在传输的ping/nping端,ping应答由我的驱动程序和内核接收(tcpdump将传入的udp或icmp数据包显示为应答) 但应用程序ping/nping有时会显示80%的数据包丢失。我怀疑这些数据包丢失在内核和用户空间之间的某个地方 我知道,对于UDP,有一个过程UDP_rcv()用于维护UDP数据包,但我不知道在将数据包

我正在维护一些网络驱动程序,我遇到了一些数据丢失的问题。其效果是,当我使用ping或nping发送例如ICMP或UDP ping时,一些UDP/ICMP数据包丢失

我确信在传输的ping/nping端,ping应答由我的驱动程序和内核接收(tcpdump将传入的udp或icmp数据包显示为应答)

但应用程序ping/nping有时会显示80%的数据包丢失。我怀疑这些数据包丢失在内核和用户空间之间的某个地方

我知道,对于UDP,有一个过程UDP_rcv()用于维护UDP数据包,但我不知道在将数据包传递到用户空间应用程序的路径中,下一个过程是哪个过程

Linux内核版本为3.3.8

我的问题是-如何跟踪数据包从驱动程序到用户空间套接字缓冲区的整个转换路径?

udp\u rcv()
是一个回调,作为
.handler
传递到
struct net\u protocol
。 您可以查看此处理程序字段在结构中的用法,也可以查看是否发生了错误。有一个回调
错误处理程序
。这里可能会发生数据包丢失,并且会调用错误处理程序


请记住,UDP不能保证100%的传输成功,100个数据包中可能有一个丢失。(:

可能是吗?我正在为一些嵌入式系统编写此驱动程序,不幸的是没有对systemtap的支持。还有其他多种跟踪内核的选项:kprobes、ftrace、
pr_debug()
。但是您确定需要跟踪所有路径吗?您没有尝试将调试打印添加到您自己的驱动程序中吗?是的,我的驱动程序中有调试printk,它们打印有关接收到的数据包的信息,并且这些数据包成功地传递到内核。内核还报告接收数据(它还包含我的printk)。问题似乎在内核和用户空间之间。不幸的是,在我的例子中没有调用err_处理程序