我在使用带有新的 netlink 系列的 netlink 套接字时遇到了一些问题……尤其是在组中。我在内核空间中使用netlink_broadcast
ornlmsg_multicast
方法向用户空间发送消息。例如,我有一个带有 defs 的标题:
#define NETLINK_MYFAMILY 20
#define NL_MYGRP 2
以及一个打开套接字并绑定到 netlink 地址的进程:
int sock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_MYFAMILY);
...
struct sockaddr_nl nl_addr;
memset(&nl_addr, 0, sizeof(struct sockaddr_nl));
nl_addr.nl_family = AF_NETLINK;
nl_addr.nl_pid = getpid();
nl_addr.nl_groups = NL_MYGRP;
int r = bind(sock, (struct sockaddr *)&nl_addr, sizeof(struct sockaddr_nl));
...
顽固地在内核空间中调用:
struct sock *s = netlink_kernel_create(&init_net,
NETLINK_MYFAMILY,
NL_MYGRP,
recv_cb,
NULL, THIS_MODULE);
recv_cb
当进程从用户空间发送消息时调用的回调在哪里。
现在我尝试通过以下方式向用户空间发送消息:
netlink_broadcast(s, skb, 0, NL_MYGRP, GFP_ATOMIC);
只有当 1 为 1 时,我才能正确读取该过程中的消息NL_MYGRP
。我无法找出问题所在......所有 netlink 系列都在其中指定linux/netlink.h
并且数字 20 不存在,所以我认为它可以用来指定我的新家庭。怎么了?谢谢你们。