我正在实施一个“迷你防火墙”。
我已经实现了过滤功能,这是签名;
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; //过滤入站数据包
我做错了什么?
先感谢您!
钩子函数的类型声明根据您正在编译的内核而改变。这种模式看起来来自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内核时间帧中,都改变了签名。