相关疑难解决方法(0)

netlink_kernel_create无法使用最新的Linux内核

我在编译kernel使用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;
    }
 ....
Run Code Online (Sandbox Code Playgroud)

以前它工作正常,但现在我收到此错误.

error: too many arguments to function 'netlink_kernel_create'
Run Code Online (Sandbox Code Playgroud)

OS信息

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
Run Code Online (Sandbox Code Playgroud)

c kernel netlink

11
推荐指数
2
解决办法
7492
查看次数

我们对用户程序和Linux内核模块之间的通信有什么选择?

我是Linux内核模块编程的新手.从我到目前为止阅读的材料中,我发现用户程序有3种方式来请求服务或与Linux内核模块通信

  1. / dev中的设备文件
  2. / proc文件系统中的文件
  3. ioctl()调用

问题:我们还有哪些其他选项可用于用户程序和Linux内核模块之间的通信?

kernel-module linux-device-driver linux-kernel

7
推荐指数
2
解决办法
1651
查看次数

使用3.X linux内核的C中的Netlink套接字

嗨,我一直在努力让Netlink套接字适用于3.2 linux内核,但我似乎无法弄清楚如何做到这一点.我查看了Netlink套接字基础知识的示例,但似乎我找到的所有示例都是针对2.6内核的.

我想要找到的是如何使用Netlink套接字将信息从内核模块发送到用户模式应用程序,反之亦然?

任何帮助将不胜感激.谢谢!

c linux-kernel netlink

7
推荐指数
1
解决办法
7324
查看次数

我可以在内核空间中拥有超过 32 个 netlink 套接字吗?

我有几个需要与用户空间交互的内核模块。因此,每个模块都有一个 Netlink 套接字。

我的问题是这些套接字相互干扰。这是因为它们都注册到同一个 Netlink 地址族(因为一开始可用的地址族不多 - 最大值为 32,并且超过一半已经被保留),而且因为它们都将自己绑定到相同的 pid(内核 pid - 零)。

我希望地址家族有更多的空间。或者,更好的是,我希望可以将我的套接字绑定到其他 pid。如果一次只能打开 32 个套接字,为什么 Netlink 是首选的用户内核通道?

libnl-3 的文档

netlink 地址(端口)由 32 位整数组成。端口 0(零)是为内核保留的,指的是每个 netlink 协议族的内核端套接字。其他端口号通常指用户空间拥有的套接字,尽管这不是强制的。

最后一个说法现在看来是一个谎言。内核使用常量作为 pid,并且不导出更多通用函数:

if (netlink_insert(sk, 0))
    goto out_sock_release;
Run Code Online (Sandbox Code Playgroud)

我想我可以重新编译内核并增加地址族限制。但这些是内核模块;我不应该这样做。

我错过了什么吗?

sockets kernel-module linux-kernel netlink

5
推荐指数
1
解决办法
3075
查看次数

尝试使用`nlmsg_free(skb_out)`释放skb时内核崩溃

我正在开发一个内核模块,它通过netlink将消息发送到用户空间.

要创建消息(发送邮件): skb_out = nlmsg_new(msg_size,0);.

在发送第一条消息之后,在发送第二条消息之前,我尝试释放skb_out,nlmsg_free(skb_out)但此函数导致内核崩溃.

  • 如何修复此崩溃?

要么

  • 在发送消息后还有其他替代方法来释放skb_out吗?

这里是源代码之后:

            skb_out = nlmsg_new(msg_size,0);
    if(!skb_out)
    {
        printk(KERN_ERR "Failed to allocate new skb\n");
        return;
    }

    nlh=nlmsg_put(skb_out,0,0,NLMSG_DONE,msg_size,0);
    NETLINK_CB(skb_out).dst_group = 0; /* not in mcast group */
    strncpy(nlmsg_data(nlh),msg,msg_size);
    res=nlmsg_unicast(nl_sk,skb_out,pid);
    if(res<0)
    {
        printk(KERN_INFO "Error while sending bak to user\n");
    }

    nlmsg_free(skb_out);
Run Code Online (Sandbox Code Playgroud)

c linux-kernel

3
推荐指数
1
解决办法
1831
查看次数

谁能给我最新的netlink编程样本?

我正在编写一个使用netlink的Linux驱动程序来在用户空间和内核空间之间进行通信.但是我找不到一些有用的资料,因为netlink已经从Linux内核> = 2.6.24改变了.谁可以给我一些关于如何创建netlink套接字的建议.提前致谢!

c linux networking linux-kernel

1
推荐指数
1
解决办法
1万
查看次数