2012-02-05 51 views
0

我做了一个模块正在传输,但我不知道我传输的数据包是否是ping数据包。代码如下所示:网络设备模块相当于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我能理解NT如何从上面的链接做.....

+0

你做了一个内核模块,但你不知道是什么它确实......? – Carpetsmoker 2012-02-05 14:17:09

+0

@Carpetsmoker我知道它在做什么(在这一点上它是唯一的传输),但我不确定它是否传输ping包,不知道如何接收包并检查它们是否是来自另一端的ping响应 – karan421 2012-02-05 14:29:28

回答

0

一个ping包是简单地码8的ICMP数据包,在其数据的时间戳 ICMP回显应答(ping回复)只是复制从ICMP回应请求的数据并将其发送回,这样的ping可以告诉你有多少时间花费在往返(现在 - 下一页” sended时间)

我不是很熟悉的Linux内核,但一定要计算出正确的IP和ICMP校验

还用于接收,它可能更好地使用netfilter

+0

请问能告诉我如何计算校验和或者是由内核提供的内核函数来计算它..... – karan421 2012-02-20 09:04:42

+0

@ karan421看看'icmp_push_reply()'从'icmp_reply()'调用'在'net/ipv4/icmp.c'里面,就像我说的,我不熟悉linux内核 – jackdoe 2012-02-20 10:06:42

1

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

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

+0

请看我的编辑我的问题的版本 – karan421 2012-02-05 18:22:33