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系列的可用多播组?我无法在手册页上找到它们。
答案 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的设计。您不会列出多播组;你的代码已经知道它们所实现的特定协议的含义,因此它会静态地订阅它。