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

时间:2019-03-11 16:55:32

标签: c linux-kernel netfilter

我正在实现“迷你防火墙”。

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

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; //过滤入站数据包

我做错了什么?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

hook函数的类型声明根据您要编译的内核而变化。该模式似乎来自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次更改-在3.13内核时间范围内,在4.1内核时间范围内以及在4.4内核时间范围内都发生了变化,