2012-04-28 10 views
1

私はIPチェックサムを再計算する必要があるnetfilterカーネルモジュールを開発しています。私は、(インターネット上のどこかにそれを見つけた)IPチェックサムを計算するために、この機能を使用:netfilterでIPチェックサムを再計算するには?

unsigned short ComputeIPChecksum(unsigned char *data, int len) 
{ 
     long sum = 0; /* assume 32 bit long, 16 bit short */ 
    unsigned short *temp = (unsigned short *)data; 

     while(len > 1){ 
      sum += *temp++; 
      if(sum & 0x80000000) /* if high order bit set, fold */ 
       sum = (sum & 0xFFFF) + (sum >> 16); 
      len -= 2; 
     } 

     if(len)  /* take care of left over byte */ 
      sum += (unsigned short) *((unsigned char *)temp); 

     while(sum>>16) 
      sum = (sum & 0xFFFF) + (sum >> 16); 

     return ~sum; 
} 

のwiresharkで見ることによって、私は着信パケットが正常になく、発信パケットのwiresharkショー誤ったIPチェックサムのために受信されていることがわかります。 、I''veは、IPチェックサムが発信パケットのために壊れるのはなぜPRE_ROUTINGとPOST_ROUTING

static int __init init_main(void) 
{ 
    nfho.hook  = hook_func; 
    nfho.hooknum = 0; 
    nfho.pf  = PF_INET; 
    nfho.priority = NF_IP_PRI_FIRST; 

    nfho1.hook  = hook_func; 
    nfho1.hooknum = 4; 
    nfho1.pf  = PF_INET; 
    nfho1.priority = NF_IP_PRI_FIRST; 

    nf_register_hook(&nfho); 
    nf_register_hook(&nfho1); 

    return 0; 
} 

に同じフック関数をバインドさメイン

static unsigned int hook_func(unsigned int hooknum, 
         struct sk_buff *skb, 
           const struct net_device *in, 
           const struct net_device *out, 
           int (*okfn)(struct sk_buff *)) 
{ 
    sock_buff = skb; 

    if (sock_buff) 
    { 
      ip_header = (struct iphdr *)skb_network_header(sock_buff); 
      if (ip_header && ip_header->protocol == TCP) 
      { 
       ip_header->check = ComputeIPChecksum((unsigned char *)ip_header, ip_header->ihl*4); 
      } 
    } 
    return NF_ACCEPT; 
} 

そして、ここで??: はここに私のフック関数です?

のwiresharkに示すエラー:あなたは、パケットをキャプチャしている

Header checksum: 0x0000 [incorrect, should be 0x85de (maybe caused by "IP checksum offload"?)] 
+1

LinuxカーネルモジュールをC++で実装していますか? –

+0

あなたはLinuxカーネルモジュールの "インターネットで見つかった"コードを使用していますか?著作権の意味を理解していますか? 「署名済み」とは、すべてのコードを書いたこと、またはコードの著作権を所有している人がGPLv2のライセンスを受けていることを宣誓したことを意味しますか? –

+0

「破損したIPヘッダー」を定義します。 「不正なチェックサム」または実際には「IPヘッダーが壊れています」という意味ですか?後者の場合は、おそらく他の何かを台無しにしているでしょう。 – mfontanini

答えて

1

IPチェックサム(TCP/UDPチェックサムと同様に)は、ネットワークカード自体で計算できます。これがあなたのカードの場合(それは非常に一般的な機能です)、あなたのマシンでキャプチャしている場合は、チェックサムが0になると思います。

0

あなたはこのようにIPヘッダを定義した場合:

struct iphdr *iph; 

、その後

iph = (struct iphdr *) skb_header_pointer(skb, 0, 0, NULL); 

その後、あなただけの、次のようなチェックサムを再計算することができます。 How to append data on a packet from kernel space?は ありますが、一番下に自分で与えられた答えで詳細コードを見つけることができます。

/* Calculation of IP header checksum */ 
iph->check = 0; 
ip_send_check (iph); 

あなたは私の質問を見ていることがあります。そこで私は にIPとUDPヘッダーチェックサムを再計算しなければなりませんでした。

関連する問題