我正在编写一个内核模块(更具体地说,是一个Netfilter模块)用于Linux。我试图使其兼容各种版本的内核,但入口函数给我带来了麻烦。
从LXR上可以看到,nf_hookfn类型定义在3.13内核中发生了变化。 Linux 3.12及之前版本:
然而,我们有一台红帽机器声称正在使用内核3.10.0-123.4.4.el7.x86_64,但它的netlink.h文件却显示:
我错过了哪个文档?从来没有任何文件提示我内核API依赖于内核版本和发行版,这毫无意义。
更重要的是,我该怎么办?nf_hookfn是一个typedef,而不是宏,所以我不能在我的函数定义中直接使用它。 可能会让事情变得更容易的一件事是,我从来没有使用那个参数。
我肯定不是第一个遇到这种情况的人吧?我的意思是,nf_hookfn是任何Netfilter模块的入口点;你会认为他们通过更改它而破坏了成千上万的驱动程序。
从LXR上可以看到,nf_hookfn类型定义在3.13内核中发生了变化。 Linux 3.12及之前版本:
typedef unsigned int nf_hookfn(unsigned int hooknum, (...));
typedef unsigned int nf_hookfn(const struct nf_hook_ops *ops, (...));
然而,我们有一台红帽机器声称正在使用内核3.10.0-123.4.4.el7.x86_64,但它的netlink.h文件却显示:
typedef unsigned int nf_hookfn(const struct nf_hook_ops *ops, (...));
我仿佛在写3.13+版本的代码。
它导致我的模块产生警告,因为它彻底破坏了我根据内核版本不同定义函数的尝试:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
#define HOOK_ARG_TYPE const struct nf_hook_ops *
#else
#define HOOK_ARG_TYPE unsigned int
#endif
我错过了哪个文档?从来没有任何文件提示我内核API依赖于内核版本和发行版,这毫无意义。
更重要的是,我该怎么办?nf_hookfn是一个typedef,而不是宏,所以我不能在我的函数定义中直接使用它。 可能会让事情变得更容易的一件事是,我从来没有使用那个参数。
我肯定不是第一个遇到这种情况的人吧?我的意思是,nf_hookfn是任何Netfilter模块的入口点;你会认为他们通过更改它而破坏了成千上万的驱动程序。