每个netlink系列可以使用哪些组播组?

时间:2016-03-09 13:16:20

标签: c linux kernel netlink

netlink套接字地址结构如下所示

struct sockaddr_nl {
    sa_family_t     nl_family;  /* AF_NETLINK */
    unsigned short  nl_pad;     /* Zero. */
    pid_t           nl_pid;     /* Port ID. */
    __u32           nl_groups;  /* Multicast groups mask. */
};
man 7 netlink说,每个netlink系列都有一组32个组播组。 在哪里可以找到每个netlink系列的可用多播组?我无法在手册页上找到它们。

1 个答案:

答案 0 :(得分:0)

嗯,这不是一个很好的答案,但我相信它实际上是最接近的。

Netlink不会存储任何组元数据AFAIK。协议的用户通过黑客攻击20位域来定义他们的组以及他们想要做什么。所以你不是在询问Netlink;您是在询问Netlink的用户。此外,我听说过(虽然实际上并没有打扰)甚至用户空间也可以向任意组发送多播消息,甚至是其他用户空间客户端,因此问题也不是真正的内核范围。

如果有一个列表在某处收集这些信息,我真的会感到惊讶。 Netlink用户并不是静态的;一个内核将具有bunch of users,另一个内核将具有another bunch of users。每个用户协议将定义自己的多播组(如果有)。并且这甚至不计算由不具有使用Generic Netlink instead of Netlink常识的流浪树外核模块定义的协议。 :)

如果您很难找到这些信息的片段,那么您必须从Netlink套接字API中注意到Netlink的内核端用户{{3通过initialize nl_groups。因此,您必须找到初始化此字段的代码。例如,nl_groups似乎有control buffer field named dst_group ...一个叫NETLINK_DNRTMSG,另一个叫DNRNG_NLGRP_L1 ...祝你好运,弄清楚它们是什么。 :)

另一方面,正如您所见,用户空间代码通过DNRNG_NLGRP_L2与群组互动。您必须找到初始化此字段的代码。由于用户空间代码比内核更加分散,因此您将面临一些不合理的任务。

换句话说,我觉得你的方法(无论你做什么)并不完全符合Netlink的设计。您不会列出多播组;你的代码已经知道它们所实现的特定协议的含义,因此它会静态地订阅它。