c - 如何发送ping数据包

标签 c linux linux-kernel

我制作了一个模块,旨在从用户空间(应用程序)使用 ioctl 命令发送 ping 数据包。但是我不确定它是否发送 ping 数据包,因为当我尝试通过 Hook 函数接收数据包时,没有回复它。我正在将 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;

     }

钩子(Hook)函数工作正常,但不确定如何发送 ping 数据包(有疑问,因为没有收到回复数据包)。

问候

卡兰

最佳答案

您可以以 root 身份使用以下命令检查 ping 是否超出您的范围:

# tcpdump -i eth0 icmp

当然,将 eth0 替换为您机器的真实接口(interface)名称。 此命令将转储该接口(interface)中的所有 ICMP 流量,因此您应该能够检查发生了什么。

关于c - 如何发送ping数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9334428/

相关文章:

android - 获取适用于 Android x86 的 VBox guest 添加

c - 文件指针为 0x0 但所有 NULL 检查失败

android - 如何在 beaglebone black 上使用 RS485

linux - Linux 内核的哪一部分强制执行权限分离以及如何执行?

python - 如何检查python脚本是否启动?

Android:杀死(所有)前台运行的应用程序

c - 命令 "make menuconfig"如何使用 ncurses 库?

c - 如何推送(即刷新)发送到 TCP 流的数据

c - 访问结构数组时发生内存冲突

c - 如何初始化和使用 C11 _Atomic 变量?