2012-02-17 111 views
0

我已经制作了一个模块,旨在使用ioctl命令从用户空间(应用程序)发送ping数据包。但是我不确定它是否发送ping数据包,因为当我试图通过钩子函数接收数据包时,没有回复它。我发送的ping包的路由器(192.168.1.1)。继是我的代码的编译和运行W/O错误:如何发送ping数据包

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包(以怀疑是因为没有收到回复数据包)。

问候

卡兰

+0

那么,不知道这是否会有所帮助,但ping是icmp echo请求,而不是icmp echo。 – 2012-02-17 22:49:11

回答

1

如果ping使用以下命令走出去你的箱子,因为根可以检查:

# tcpdump -i eth0 icmp 

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