我已经制作了一个正在传输的模块,但我不知道我传输的数据包是否是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我无法理解从上面的链接做什么.....
答案 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
可能更好