创建Netfilter内核模块时出现编译错误

问题描述 投票:0回答:1

我正在实施一个“迷你防火墙”。

我已经实现了过滤功能,这是签名;

unsigned int minifw_inbound_filter(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in,
                                const struct net_device *out, int (*okfn)(struct sk_buff *));

当我添加netfilter内核模块时:

static struct           nf_hook_ops nfho_in;

nt init_rule_match_module(void) {
nfho_in.hook        = minifw_inbound_filter;        // filter for inbound packets
nfho_in.hooknum     = NF_INET_LOCAL_IN;             // netfilter hook for local machine bounded ipv4 packets
nfho_in.pf          = PF_INET;
nfho_in.priority    = NF_IP_PRI_FIRST;              // we set its priority higher than other hooks
nf_register_hook(&nfho_in);

我试图编译我的模块并得到一个编译错误:

错误:从不兼容的指针类型分配[-Werror = incompatible-pointer-types] nfho_in.hook = minifw_inbound_filter; //过滤入站数据包

我做错了什么?

先感谢您!

c linux-kernel netfilter
1个回答
2
投票

钩子函数的类型声明根据您正在编译的内核而改变。这种模式看起来来自2.6 kernel

当前的函数签名如下所示:

unsigned int nf_hookfn(void *priv, struct sk_buff *skb, const struct nf_hook_state *state); 

您可能正在引用旧的示例代码 - 您应该尝试找到一个与您正在编译的内核更一致的更新示例。

但是,正如Paul R在问题的评论中提到的那样,如果你想强化代码以便它可以针对linux内核的多个版本进行编译,你可以使用solution suggested in this answer,它基于内核/ RHEL环境包装它正在反对。

问题是netfilter钩子函数签名自2.6以来至少改变了三次 - 在3.13内核时间帧中,在4.1内核时间帧中,再在4.4内核时间帧中,都改变了签名。

© www.soinside.com 2019 - 2024. All rights reserved.