使用dev_queue_xmit发送ping数据包

时间:2012-02-20 07:34:57

标签: c linux linux-kernel

我已经写了一个驱动程序,它发送一个ping数据包但它不能正常工作(我使用tcpdump -i wlan0 icmp检查)。基本上我已经使用来自用户程序的ioctl调用来启动传输(它的工作)但模块代码中存在一些问题,以下是我的传输代码:

case WLAN_TRANSMIT :
                     icmp.type = ICMP_ECHO;
                     icmp.code = 0;
                     icmp.un.echo.sequence = i++;
                     icmp.un.echo.id = current->pid & 0xFFFF;
                     printk(KERN_ALERT"ID::%X\n",icmp.un.echo.id);
                     ip4.protocol = 0x01;                               //for icmp protocol
                     ip4.tos = 0x00;
                     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);
                    wdev = skb->dev;
                    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)); 
                    //skb->mac_header = ()
                    skb->mac_header = skb->dev->dev_addr;
                   if(dev_queue_xmit(skb)==NET_XMIT_SUCCESS)
                    printk(KERN_ALERT"success");

我正在使用dev_queue_xmit。

问候

karan

1 个答案:

答案 0 :(得分:1)

skb->mac_header = skb->dev->dev_addr看起来不对 必须在IP标头之前将MAC标头复制到数据包中,并且skb->data必须指向它。在这种情况下设置skb->mac_header毫无意义。

我也没有看到你计算IP和ICMP校验和(我认为ICMP校验和是可选的,但IP校验和是强制性的。)

我真的不知道是不是全部 您应该看到来自dev_queue_xmit的返回值是什么,并打印数据包内容,从skb->dataskb->tail并看到它们是有效的ICMP数据包。