我使用netlink套接字和新的netlink系列有一些问题...特别是对于组。我在内核空间中使用netlink_broadcast
或nlmsg_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);
只有当NL_MYGRP
为1时,才能正确阅读流程中的消息。我无法解决问题...所有netlink系列都在linux/netlink.h
中指定,而数字20不在不存在所以我认为它可以用来指定我的新家庭。怎么了?谢谢大家。
答案 0 :(得分:1)
20。为什么不直接使用NETLINK_USERSOCK作为netlink系列?
#define NETLINK_ROUTE 0 /* Routing/device hook */
#define NETLINK_UNUSED 1 /* Unused number */
#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */
#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */
#define NETLINK_SOCK_DIAG 4 /* socket monitoring */
#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */
#define NETLINK_XFRM 6 /* ipsec */
#define NETLINK_SELINUX 7 /* SELinux event notifications */
#define NETLINK_ISCSI 8 /* Open-iSCSI */
#define NETLINK_AUDIT 9 /* auditing */
#define NETLINK_FIB_LOOKUP 10
#define NETLINK_CONNECTOR 11
#define NETLINK_NETFILTER 12 /* netfilter subsystem */
#define NETLINK_IP6_FW 13
#define NETLINK_DNRTMSG 14 /* DECnet routing messages */
#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */
#define NETLINK_GENERIC 16
/* leave room for NETLINK_DM (DM Events) */
#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */
#define NETLINK_ECRYPTFS 19
#define NETLINK_RDMA 20
#define NETLINK_CRYPTO 21 /* Crypto layer */
#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG
#define MAX_LINKS 32