Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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 与ping等效的网络设备模块_C_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

C 与ping等效的网络设备模块

C 与ping等效的网络设备模块,c,linux,linux-kernel,linux-device-driver,C,Linux,Linux Kernel,Linux Device Driver,我制作了一个正在传输的模块,但我不知道我正在传输的数据包是否是ping数据包。代码如下所示: icmp.type=8; icmp.code=0; icmp.un.echo.sequence=i; ip4.1协议=1//适用于icmp协议 ip4.frag_off=0; ip4.daddr=in_-aton(procfs_-buffer); ip4.saddr=输入数据(ifr->ifr添加数据); len=sizeof(数据); skb=开发分配skb(1500); skb->dev=\uu d

我制作了一个正在传输的模块,但我不知道我正在传输的数据包是否是ping数据包。代码如下所示:

icmp.type=8;
icmp.code=0;
icmp.un.echo.sequence=i;
ip4.1协议=1//适用于icmp协议
ip4.frag_off=0;
ip4.daddr=in_-aton(procfs_-buffer);
ip4.saddr=输入数据(ifr->ifr添加数据);
len=sizeof(数据);
skb=开发分配skb(1500);
skb->dev=\uu dev\u get\u by\u name(&init\u net,“wlan0”);
skb_保留区(skb,净IP_对齐);//2字节的报头;增加尾部和
//数据指针
skb->data=skb_put(skb,sizeof(len));//递增所有指针或添加数据
memcpy(数据,skb->数据,len);
skb->transport_header=skb_push(skb,sizeof(icmp));
memset(skb->transport_头,0,sizeof(struct-icmphdr));
memcpy(skb->transport_头和icmp,sizeof(struct-icmphdr));
skb->network_header=skb_push(skb,sizeof(ip4));
memset(skb->network_头,0,sizeof(struct iphdr));
memcpy(skb->network_头和ip4,sizeof(struct iphdr));
//printk(“i::%d\n”,i);
//skb->mac_头=skb_推送(skb,6*sizeof(0xFF));
//memset(skb->mac_头,0xFF,6*sizeof(0xFF));
开发队列(skb);
kfree(skb);
我怎么知道这是我正在创建和传输的ping数据包?此外,我想接收ping数据包,以响应我发送的ping数据包。我想使用napi,但不介意任何其他建议

请阅读一个主题:接收napi模式我无法理解如何从上面的链接中执行…

您可以使用它捕获进出某个网络接口的所有网络流量。您将能够检查数据包是否已发送,以及它是否确实是您期望的数据包。您还可以查看ping是否有答案


关于如何从模块截取ping答案的问题,您可以使用内核提供的netfilterapi。从使用netfilter开始,这是一篇很好的文章。

a
ping
数据包就是代码为8的icmp数据包,数据中带有时间戳 icmp echo reply(ping reply)只是从icmp echo请求中复制数据并将其发送回,这样ping就可以告诉您往返所用的时间(现在为-prev“send time)

我对linux内核不是很熟悉,但一定要计算正确的ip和icmp校验和


同样对于接收,使用netfilter可能更好,因为您制作了一个内核模块,但您不知道它做什么@地毯吸烟者我知道它在做什么(在这一点上它唯一的传播)但是我不确定它是否发送了一个ping数据包,也不知道如何接收数据包并检查它们是否是来自另一方的ping响应。你能告诉我如何计算校验和,或者内核提供了多少函数来计算校验和吗…@karan421看一下
icmp\u push\u reply()
icmp\u reply()
内部调用
net/ipv4/icmp.c
,正如我所说,我不熟悉linux内核