4

我想使用 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. 有人可以解释我应该在这里使用什么吗?

4

4 回答 4

4

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

您的电话应该类似于以下内容

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

wherenl_rcv_func是一个以struct sk_buff *skb唯一参数为参数并处理接收到的 netlink 消息的函数。

于 2009-04-30T22:12:05.333 回答
2

您似乎一直在遵循诸如this one之类的指南,该指南(从 2005 年开始)很可能已被内核的开发所超越。从内核端创建网络链接的内部 API 似乎已经改变。

检查本地内核树中的 Documentation/ 文件夹以获取一些(希望是更新的)文档,或者阅读代码本身。您还可以搜索 Linux Kernel邮件列表档案,以了解似乎已经发生的任何更改。

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

于 2009-04-30T06:48:32.183 回答
1

是的,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);
于 2012-11-13T05:30:38.003 回答
-3

我建议使用ioctl进行内核/用户通信。ioctl 接口是标准的,内核之间更新的机会很小。

于 2009-04-30T09:44:44.897 回答