Linux kernel linux内核中的多个netlink接口

Linux kernel linux内核中的多个netlink接口,linux-kernel,linux-device-driver,device-driver,ethernet,Linux Kernel,Linux Device Driver,Device Driver,Ethernet,通过将目标的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 */ de

通过将目标的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);
内核模块1 内核模块2
您可能希望忽略血淋淋的细节,直接转到连接器:

这是netlink之上的一个“可路由协议”,它正是您想要的:将netlink消息路由到各种订阅者


一般而言,netlink以“家庭”的形式运作。因此,到达端口0(内核)的netlink消息将在报头中的family字段上调度。上面的“连接器”声明了一个这样的系列,其中包含一个系列特定的路由信息。

您甚至可以为同一系列创建两个netlink内核套接字吗?您不能这样做,因为套接字端口ID相同(0是netlink处理程序文件中内核的硬编码)。
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;
}