Linux 内核中的多个 NetLink 接口



用户进程可以通过将目标的nl_pid指定为 0(对于内核)来向内核发送网络链接消息。假设有两个不同的内核模块分别注册了一个网络链路接口。然后,用户进程的消息将到达哪个模块。它是同时到达两个还是只到达一个?请考虑以下示例。

提前谢谢。

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 kerneln");
sendmsg(sock_fd, &msg, 0);

内核模块 1

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;
}

内核模块 2

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;
}

您可能希望省略血腥的细节并直接进入连接器:

https://www.kernel.org/doc/Documentation/connector/connector.txt

这是 netlink 之上的"可路由协议",它完全可以满足您的需求:将 netlink 消息路由到不同的订阅者。

一般来说,网联以"家庭"的方式运作。因此,到达端口 0(内核)的 netlink 消息将在标头中的 family 字段中调度。上面的"连接器"声明了一个这样的系列,其中包含额外的嵌套标头,以包含特定于系列的路由信息。

最新更新