我正在实现“迷你防火墙”。
我已经实现了过滤功能,这就是签名;
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; //过滤入站数据包
我做错了什么?
提前谢谢!
答案 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内核时间范围内都发生了变化,