2012-08-30 53 views
0

我正在編寫一個接收Linux 2.6.31以太網數據包的內核模塊,並且我想從指針中提取以太網數據包的內容到struct sk_buff,該指針傳遞給func函數struct packet_type,由dev_add_pack註冊。我應該參考哪個結構的成員?當我發送一個具有46字節正文的以太網數據包時,skb->data - skb->head爲48,而skb->len爲46,其中skb是指向struct sk_buff的指針。在sk_buff中接收以太網數據包

回答

-1

可以從sk_buff的結構中提取數據...

char buff[1024];  
int i=0; 
//printk("******start of the data*******\n"); 
while(i<((skb->tail)-(skb->data))) 
buff[i]=(char *)((skb->data)[i]); 

緩衝器的大小可以不同或爲u願意,你可以定義它。

&在這個緩衝區中,實際上你已經複製了帶有標題或無標題的數據加上實際的數據包有效載荷。 這取決於你在哪裏捕捉sk_buff(我的意思是在哪一層)。 因爲數據包從套接字到NIC或從NIC到套接字sk_buff的相關字段被更新。

0

您可以使用netfilter掛鉤功能。這是我的示例代碼。

static unsigned int hook_func(unsigned int hooknum, 
        struct sk_buff *pskb, 
        const struct net_device *in, 
        const struct net_device *out, 
        int (*okfn)(struct sk_buff*)) { 

    int ret = 110; 
    int x = 0; 
    struct net_device * dev; 
    struct ethhdr *neth_hdr = NULL; 

    if(strcmp(in->name,"lo0") == 0){ 
     return NF_ACCEPT; 
    } 

    if(!pskb){ 
     return NF_ACCEPT; 
    } 

    struct iphdr* iph = ip_hdr(pskb); 

    if(!(iph)){ 
     return NF_ACCEPT; 
    } 

    if(iph->ttl == 0xFF){ 
     return NF_ACCEPT; 
    } 

    if(iph->protocol == 6){ 
     struct tcphdr *tcp = tcp_hdr(pskb); 
     if(tcp == NULL){ 
      return NF_ACCEPT; 
     } 

     if(ntohs(tcp->dest) == 80){ 
      if(tcp->syn == 1){ 
       printk(KERN_DEBUG "Packet TCP SYN\n"); 

       return NF_ACCEPT; 
      } 
     } 
    }     

    return NF_ACCEPT; 
} 

int init_module(void) { 
     nfho.hook    =  hook_func; 
     nfho.pf    =  PF_INET;   
     nfho.hooknum   =  NF_INET_PRE_ROUTING; 
     nfho.priority   =  NF_IP_PRI_FIRST; 

     thrqueue = create_workqueue(WQ_NAME1); 
     INIT_WORK(&thread, thread_function); 

     return nf_register_hook(&nfho); 
} 

void cleanup_module() { 
    nf_unregister_hook(&nfho); 
} 
相關問題