2012-02-05 3 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, но не помню никаких других предложений.

пожалуйста прочитал тему: режим приема Näpi here я мог нт понять, что делать по ссылке выше .....

+0

Вы создали модуль ядра, но вы не знаете, что оно делает ... ? – Carpetsmoker

+0

@Carpetsmoker Я знаю, что он делает (на данный момент его единственная передача), но я не уверен, передает ли его пакет ping или нет, и не знает, как получить пакеты и проверить, являются ли они ответом ping с другой стороны – karan421

ответ

0

ping пакет просто ICMP-пакет с кодом 8, с отметкой времени в его данных эхо-ответ (пинг ответов) просто копирует данные из эхо-запроса и отправляет его обратно, таким образом, пинг может сказать вам, сколько время, которое потребовалось для путешествия туда и обратно (в настоящее время - предыдущая»отослано время)

я не очень хорошо знаком с ядром Linux, но не забудьте рассчитать правильный IP-и ICMP контрольной сумму

также для приема, она может лучше использовать netfilter

+0

не могли бы вы рассказать мне, как рассчитать контрольные суммы или их функции, предоставляемые ядром, чтобы вычислить его ..... – karan421

+0

@ karan421 взгляните на 'icmp_push_reply()', вызванный из 'icmp_reply()' внутри 'net/ipv4/icmp.c', как я уже сказал, я не знаком с ядром linux – jackdoe

1

Вы можете использовать wireshark, чтобы захватить весь сетевой трафик, проходящий в и из одного из ваших сетевой интерфейс. Вы сможете проверить, что пакет был отправлен, и если это действительно то, что вы ожидаете от него. Вы также сможете узнать, есть ли ответ на ваш пинг.

Что касается вашего вопроса о том, как перехватить ответ ping из вашего модуля, вы можете использовать API-интерфейс netfilter, предлагаемый ядром. Here is хорошая статья, чтобы начать с использования netfilter.

+0

, пожалуйста, см. Мой редактируйте версию моего вопроса – karan421