如何在2.6.24及以后版本的Linux内核中使用netlink
最近做Netlink 2.6.24 移植,网上相关的教程也不少,有些写得还十分系统,不过我拿来一测试,居然没一个能编译。后来仔细一看才发现,还是内核版本的问题。经过一番折腾,终于弄好了,下面简要介绍一下经验。
我用的redhat 5 x64 自己升级的内核,内核更新至2.6.24,而从2.6.24开始,linux内部对netlink的实现机制和调用接口进行了很大的调整,特别是函数netlink_kernel_create(),最新的参数有6个之多。而网上大多数的教程和例子程序都是针对2.6.12以前版本的内核,甚至2.4版来说的,因此连最基本的函数都无法成功编译,更不用说后面的了。
事实上,新版的Netlink简化了使用逻辑。当然我这里说的主要是内核空间编程上,对用户空间程序,netlink仍然像经典的socket程序那样简单易用。我没有去仔细研究其他细节的函数,其实其他变化影响不大,这里仅对最核心的,变化最重要的create函数介绍一下,以下是函数原型:
extern struct sock *netlink_kernel_create(struct net *net,
int unit,unsigned int groups,
void (*input)(struct sk_buff *skb)