2012-02-17 110 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流量,因此您應該能夠檢查發生了什麼。