簡體   English   中英

如何發送ping數據包

[英]how to send a ping packet

我已經制作了一個模塊,旨在使用ioctl命令從用戶空間(應用程序)發送ping數據包。 但是我不確定它是否發送ping數據包,因為當我嘗試通過掛接功能接收數據包時,沒有響應。 我正在將ping數據包發送到路由器(192.168.1.1)。以下是我的代碼其編譯和運行錯誤:

int device_ioctl(struct net_device *dev,struct ifreq *ifr, int cmd)
{

int len;

//printk("%s , %d",__func__,__LINE__);
switch(cmd)
{
case SIOCDEVPRIVATE:
                     printk("here it is : %s: %d\n",__func__,__LINE__);
                     break;

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)); 
                //  memset(skb->mac_header,0xFF,6*sizeof(0xFF));  
                   dev_queue_xmit(skb);

                  // kfree(skb);
  }

  return 0;
  }

  unsigned int hook_func(unsigned int hooknum, struct sk_buff *skb1, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
  {
     struct sk_buff *sock_buff;
     struct iphdr *ip1;
     struct icmphdr *icmp1;
     sock_buff = skb1;
    //printk("ihere we are::%s,%d\n",__func__,__LINE__);
    ip1 = (struct iphdr *)skb_network_header(sock_buff);
  //printk(KERN_ALERT"proto:%d,addr:%X::%X\n",ip1->protocol,ip1->saddr,ip1->daddr);
   if(ip1->protocol==1)
    {
      printk(KERN_ALERT"proto:%d,addr:%X::%X\n",ip1->protocol,ip1->saddr,ip1->daddr);
      icmp1 = (struct icmphdr *)skb_transport_header(sock_buff);
      printk(KERN_ALERT"reply type: %c,,seq : %04X\n",icmp1->type,icmp1->un.echo.id);
         }
   // kfree(sock_buff);
   return NF_ACCEPT;

     }

鈎子功能工作正常,但不確定如何發送ping數據包(有疑問,因為沒有收到回復數據包)。

問候

卡蘭

您可以使用以下命令(以root用戶身份)檢查是否可以ping通:

# tcpdump -i eth0 icmp

當然,將eth0替換為計算機的真實接口名稱。 此命令將轉儲該接口中的所有ICMP流量,因此您應該能夠查看正在發生的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM