网络设备模块相当于ping

时间:2012-02-05 14:12:45

标签: c linux linux-kernel linux-device-driver

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

 icmp.type = 8;
 icmp.code = 0;
 icmp.un.echo.sequence = i;
 ip4.protocol = 1; //for icmp protocol
 ip4.frag_off = 0;
 ip4.daddr = in_aton(procfs_buffer);
 ip4.saddr = in_aton(ifr->ifr_addr.sa_data);

 len = sizeof(data);

 skb = dev_alloc_skb(1500);
 skb->dev = __dev_get_by_name(&init_net,"wlan0");
 skb_reserve(skb,NET_IP_ALIGN); // header of 2 bytes; increments tail and 
                                // data pointer
 skb->data = skb_put(skb,sizeof(len)); // increments all pointer or adds data
 memcpy(data,skb->data,len);

 skb->transport_header =skb_push(skb,sizeof(icmp));
 memset(skb->transport_header,0,sizeof(struct icmphdr));
 memcpy(skb->transport_header,&icmp,sizeof(struct icmphdr));

 skb->network_header=skb_push(skb,sizeof(ip4));
 memset(skb->network_header,0,sizeof(struct iphdr));
 memcpy(skb->network_header,&ip4,sizeof(struct iphdr));

 // printk("i::%d\n",i);
 // skb->mac_header = skb_push(skb,6*sizeof(0xFF));
 // memset(skb->mac_header,0xFF,6*sizeof(0xFF));
 dev_queue_xmit(skb);
 kfree(skb);

我怎么知道它是我正在创建和传输的ping数据包?此外,我想接收ping数据包以响应我传输的ping数据包。我想使用napi,但不介意任何其他建议。

请阅读一个主题:接收napi模式here我无法理解从上面的链接做什么.....

2 个答案:

答案 0 :(得分:1)

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

关于如何拦截模块中的ping答案的问题,您可以使用内核提供的netfilter API。 Here is一篇开始使用netfilter的好文章。

答案 1 :(得分:0)

ping数据包只是代码为8的icmp数据包,其数据中包含时间戳 icmp echo reply(ping reply)只是复制icmp echo请求中的数据并将其发送回去,这样ping可以告诉你往返需要多长时间(现在 - 上一次“发送时间”)

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

也是为了接收,使用netfilter

可能更好