如何在内核和用户空间之间创build一个“netlink”?

我想使用netlink在应用程序和内核空间之间进行通信。 我的Linux内核版本是2.6.28,下面是我的错误代码:

nf_sock=netlink_kernel_create(NL_PROTO,0,nl_user_skb,THIS_MODULE); 

简短的错误信息是:

 error: too few arguments to function 'netlink_kernel_create' 

在文件<linux/netlink.h> ,函数netlink_kernel_create()被定义为

 extern struct sock *netlink_kernel_create(struct net *net,int unit,unsigned int groups,void (*input)(struct sk_buff *skb),struct mutex *cb_mutex,struct module *module) 

我不明白如何使用第一个参数, net 。 有人可以解释我应该在这里使用吗?

struct net包含有关网络名称空间的信息,这是一组可用于进程的网络资源。 请注意,可能有多个网络名称空间(即网络堆栈的多个实例),但大多数驱动程序使用init_net命名空间。

你的电话应该看起来像下面这样

 nf_sock = netlink_kernel_create(&init_net, NETLINK_USERSOCK, 0, nl_rcv_func, NULL, THIS_MODULE); 

其中nl_rcv_func是一个以struct sk_buff *skb为唯一参数的函数,并处理收到的netlink消息。

你似乎一直在遵循像这样的一个指导,(从2005年开始)可能已经超过了内核的发展。 看来从内核创建netlink的内部API已经改变了。

检查本地内核树中的文档/文件夹中的某些(希望更新鲜的)文档,或者阅读代码本身。 你也可以拖曳 Linux coreel邮件列表档案,看看有没有发生过的变化。

这里是2.6.29的实际实现,如果你想把它向后谜(当然还没有在你自己的树中检查过)。

是的,struct net的确是用于net命名空间的,但是总是使用init_net是不合适的,你应该注册你自己的pernet_operations,像这样:

 static struct pernet_operations fib_net_ops = { .init = fib_net_init, .exit = fib_net_exit, }; static int __net_init fib_net_init(struct net *net) { int error; #ifdef CONFIG_IP_ROUTE_CLASSID net->ipv4.fib_num_tclassid_users = 0; #endif error = ip_fib_net_init(net); if (error < 0) goto out; error = nl_fib_lookup_init(net); if (error < 0) goto out_nlfl; error = fib_proc_init(net); if (error < 0) goto out_proc; out: return error; out_proc: nl_fib_lookup_exit(net); out_nlfl: ip_fib_net_exit(net); goto out; } static int __net_init nl_fib_lookup_init(struct net *net) { struct sock *sk; struct netlink_kernel_cfg cfg = { .input = nl_fib_input, }; sk = netlink_kernel_create(net, NETLINK_FIB_LOOKUP, &cfg); if (sk == NULL) return -EAFNOSUPPORT; net->ipv4.fibnl = sk; return 0; } 

最后:

 register_pernet_subsys(&fib_net_ops); 

我会建议用于内核/用户通信的ioctl 。 ioctl界面是标准的,在内核之间更新的机会很小。