отправить пакет проверки связи с помощью dev_queue_xmit - PullRequest
2 голосов
/ 20 февраля 2012

Я написал драйвер, который отправляет пакет 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.

привет

Каран

1 Ответ

1 голос
/ 20 февраля 2012

skb->mac_header = skb->dev->dev_addr выглядит неправильно.
Заголовок MAC должен быть скопирован в пакет до заголовка IP, и skb->data должен указывать на него. Установка skb->mac_header в этом контексте совершенно бессмысленна.

Я также не вижу, чтобы вы вычисляли контрольные суммы IP и ICMP (контрольная сумма ICMP, я думаю, является необязательной, но контрольная сумма IP является обязательной).

Я действительно не могу сказать, все ли это.
Вы должны увидеть, что является возвращаемым значением от dev_queue_xmit, а также распечатать содержимое пакета от skb->data до skb->tail и убедиться, что это действительный пакет ICMP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...