netlink_kernel_create在最新的Linux内核版本中无法工作

11

在编译使用 netlink 函数的旧 内核 模块时,我遇到了编译器错误。

int
init_module()
{
    /* Initialize the Netlink kernel interface */
    nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);
    if(!nl_sk)
    {
            printk(KERN_INFO "failed to initialize system (error: 1001)\n");
            return -ENOMEM;
    }
 ....

之前它运行得很好,但现在我遇到了这个错误。

error: too many arguments to function 'netlink_kernel_create'

操作系统信息

uname -a

Linux ibrar-ahmed 3.8.0-17-generic #27-Ubuntu SMP Sun Apr 7 19:39:35 UTC 2013 x86_64  x86_64 x86_64 GNU/Linux
3个回答

13

只需替换

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

以下是:

struct netlink_kernel_cfg cfg = {
    .input = recv_cmd,
};

nl_sk = netlink_kernel_create(&init_net, 17, &cfg);

它应该能够工作。我也遇到了同样的问题。


6
在3.8版本中,netlink_kernel_create原型已更改为:
netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg)
(请参阅http://lxr.linux.no/linux+v3.8/include/linux/netlink.h#L48
您必须重新编写内核模块,并删除该额外参数(THIS_MODULE),以及实现netlink_kernel_cfg结构。

1
有没有可用的示例? - Ibrar Ahmed
1
有了这样一个新内核,可能不行。但是修改您的实现以适应更新的API应该是一个相当简单的过程。不幸的是,我们过去也曾经遇到过这样的问题(因为Linux内核API正在不断发展,并且经常非常不稳定)。 - Technologeeks

0
    netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg)

    struct netlink_kernel_cfg cfg = {
        .groups = SELNLGRP_MAX,
        .flags  = NL_CFG_F_NONROOT_RECV,
    };

    selnl = netlink_kernel_create(&init_net, NETLINK_SELINUX, &cfg);
    if (selnl == NULL)
        panic("SELinux:  Cannot create netlink socket.");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接