2017-04-24 4 views
1

2.6カーネルから4.1.23に移植されたnetfilterカーネルモジュールがあります。私のフック機能が壊れています。パケットヘッダーを取得できません。NetFilterカーネルモジュールを4.1.23に移行 - ipヘッダを取得できません

ここには2.6カーネルのコードスニペットがあります。これは長い間生産されています。

static unsigned int main_hook(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in,const struct net_device *out, int (*okfn)(struct sk_buff*)) 
{ 
    //struct sk_buff *skb = (skb_p); 
    struct iphdr *ih = (struct iphdr *)(skb->data); 
    u32 saddr = ih->saddr; 
    u32 daddr = ih->daddr; 

チェックnetfilter.hとは次のように4.1.23

static unsigned int main_hook(const struct nf_hook_ops *ops, struct sk_buff *skb, const struct nf_hook_state *state) 
     { 
      //struct sk_buff *skb = (skb_p); 
      struct iphdr *ih = (struct iphdr *)(skb->data); 
      u32 saddr = ih->saddr; 
      u32 daddr = ih->daddr; 

登録フックで以下に到達するためにインターネットを検索しました。

netfilter_ops.hook    =  main_hook; 
    netfilter_ops.pf    =  PF_INET; 
    netfilter_ops.hooknum   =  NF_INET_FORWARD; 
    netfilter_ops.priority   =  NF_IP_PRI_FIRST; 
    netfilter_ops.owner    =  THIS_MODULE; 
    nf_register_hook(&netfilter_ops); 

saddrとdaddrから送信元IPと宛先IPが取得されません。

結果ここ

static unsigned int main_hook(const struct nf_hook_ops *ops, struct sk_buff *skb, const struct nf_hook_state *state) 
{ 
    struct iphdr *ip_header = (struct iphdr *) (skb->data); 
    unsigned int src_ip = (unsigned int)ip_header->saddr; 
    unsigned int dest_ip = (unsigned int)ip_header->daddr; 
    printk("IP addres = %pI4 DEST = %pI4\n", &src_ip, &dest_ip); 
    return NF_ACCEPT; 

され、次の

削除すべてと試みた

[37501.345997] IP addres = 0.0.0.0 DEST = 0.0.0.0 
[37506.337854] IP addres = 0.0.0.0 DEST = 0.0.0.0 
[37511.345295] IP addres = 0.0.0.0 DEST = 0.0.0.0 
[37516.337132] IP addres = 0.0.0.0 DEST = 0.0.0.0 
[37521.344589] IP addres = 0.0.0.0 DEST = 0.0.0.0 
[37526.336426] IP addres = 0.0.0.0 DEST = 0.0.0.0 
[37531.343866] IP addres = 0.0.0.0 DEST = 0.0.0.0 

buff = (unsigned char *) skb->data; 
for (i=0;i<60;i++) printk("%d.", buff[i]); 
printk("\n"); 

私は、データを取得するための関数を使用してみました(skb_network_header)ジャンクあまりにも次が、取得しようとしました、こんにちは世界を書くことも試みた。 助けてください。

答えて

1

は、この方法を抽出してみてください。

struct iphdr *ip_hdr = (struct iphdr *)skb_network_header(skb); 

と、このようにアクセス:

printk("IP addres = %u DEST = %u\n", ip_hdr->saddr, ip_hdr->daddr); 
関連する問題