Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 迁移到4.1.23的Netfilter内核模块-无法检索ip标头_C_Linux_Kernel Module_Netfilter - Fatal编程技术网

C 迁移到4.1.23的Netfilter内核模块-无法检索ip标头

C 迁移到4.1.23的Netfilter内核模块-无法检索ip标头,c,linux,kernel-module,netfilter,C,Linux,Kernel Module,Netfilter,我们有一个2.6内核的netfilter内核模块,现在可以移植到4.1.23。我的钩子函数看起来坏了。我无法检索数据包头 下面是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*))

我们有一个2.6内核的netfilter内核模块,现在可以移植到4.1.23。我的钩子函数看起来坏了。我无法检索数据包头

下面是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;
在4.1.23中检查netfilter.h并搜索Internet得出以下结果

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);
我没有从SADD和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");
buff=(unsigned char*)skb->data;
对于(i=0;i请尝试以下方式提取:

struct iphdr *ip_hdr = (struct iphdr *)skb_network_header(skb);
并通过以下方式访问:

printk("IP addres = %u  DEST = %u\n", ip_hdr->saddr, ip_hdr->daddr);