我如何创建一个“ netlink”内核和用户空间之间?
-
03-07-2019 - |
题
我想使用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消息的函数。
其他提示
是的,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接口是标准的,并且内核之间更新的可能性很小。
不隶属于 StackOverflow