2012-02-17 6 views
0

나는 사용자 공간 (응용 프로그램)에서 ioctl 명령을 사용하여 핑 패킷을 보내는 것을 목표로하는 모듈을 만들었습니다. 그러나 여부를 그 패킷을 보내거나 여부 패킷을 후크 기능을 통해 거기에 아무런 응답을받을 시도하지 않기 때문에 나는 잘 모르겠습니다. 내가 라우터 핑 패킷을 전송하고 (192.168.1.1) .following 내 코드는 컴파일 및/오류 O 승 실행 중입니다 노력하고 있습니다핑 패킷을 보내는 방법

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; 

    } 

후크 기능 (에서 미세하지만 핑 패킷을 전송하는 방법을 잘 응답 패킷을받지 못하기 때문에 의심 스럽습니다.)

관련

카란

+0

글쎄,이게 도움이 될지 모르겠지만 핑은 icmp 에코 요청이 아니라 icmp 에코 요청입니다. –

답변

1
핑 루트로 다음 명령을 사용하여 상자 밖으로가는 경우가 확인할 수 있습니다

:

# tcpdump -i eth0 icmp 

이의 실제 인터페이스 이름으로 eth0을 교체하여 물론 기계. 이 명령은 해당 인터페이스의 모든 ICMP 트래픽을 덤프하므로 어떤 일이 일어나는지 확인할 수 있어야합니다.

관련 문제