私は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"?)]
LinuxカーネルモジュールをC++で実装していますか? –
あなたはLinuxカーネルモジュールの "インターネットで見つかった"コードを使用していますか?著作権の意味を理解していますか? 「署名済み」とは、すべてのコードを書いたこと、またはコードの著作権を所有している人がGPLv2のライセンスを受けていることを宣誓したことを意味しますか? –
「破損したIPヘッダー」を定義します。 「不正なチェックサム」または実際には「IPヘッダーが壊れています」という意味ですか?後者の場合は、おそらく他の何かを台無しにしているでしょう。 – mfontanini