用户进程可以通过将目标的nl_pid指定为0(对于内核)向内核发送netlink消息。 假设有两个不同的内核模块,每个模块都注册了一个netlink接口。然后,用户进程的消息将到达哪个模块。 它到达两个还是只有一个?请考虑以下示例。
先谢谢。
struct sockaddr_nl src_addr, dest_addr;
...
...
dest_addr.nl_family = AF_NETLINK;
dest_addr.nl_pid = 0; /* For Linux Kernel */
dest_addr.nl_groups = 0; /* unicast *
...
...
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
...
...
printf("Sending message to kernel\n");
sendmsg(sock_fd, &msg, 0);
static int __init module1_init(void)
{
sk1 = netlink_kernel_create(&init_net, NETLINK_USER, 0, module1_recv_msg,
NULL, THIS_MODULE);
if (!sk1)
{
printk(KERN_ALERT "Error creating socket.\n");
return -10;
}
return 0;
}
static int __init module2_init(void)
{
sk2 = netlink_kernel_create(&init_net, NETLINK_USER, 0, module2_recv_msg,
NULL, THIS_MODULE);
if (!sk2)
{
printk(KERN_ALERT "Error creating socket.\n");
return -10;
}
return 0;
}
答案 0 :(得分:0)
您可能希望省略血腥细节并直接进入连接器:
https://www.kernel.org/doc/Documentation/connector/connector.txt
这是一个可路由的协议"在netlink之上,它完全符合您的要求:将netlink消息路由到各个订户。
一般来说,netlink以" family"的形式运作。因此,在头部的族字段上调度命中端口0(内核)的netlink消息。 "连接器"上面声明了一个这样的系列,它带有额外的嵌套标题,以包含特定于系列的路由信息。