我在将 netlink 消息从内核模块发送到用户空间守护进程时遇到了很多麻烦。他们随机失败。在内核方面,用户端的genlmsg_unicast
失败(函数来自)失败,这是由系统调用失败引起的。EAGAIN
nl_recvmsgs_default
libnl
NLE_NOMEM
recvmsg
ENOBUFS
Netlink 消息很小,最大有效负载大小约为 300B。
这是从内核发送消息的代码:
int send_to_daemon(void* msg, int len, int command, int seq, u32 pid) {
struct sk_buff* skb;
void* msg_head;
int res, payload;
payload = GENL_HDRLEN+nla_total_size(len)+36;
skb = genlmsg_new(payload, GFP_KERNEL);
msg_head = genlmsg_put(skb, pid, seq, &psvfs_gnl_family, 0, command);
nla_put(skb, PSVFS_A_MSG, len, msg);
genlmsg_end(skb, msg_head);
genlmsg_unicast(&init_net, skb, pid);
return 0;
}
我完全不知道为什么会发生这种情况,因此我的项目将无法正常工作!我真的希望有人可以帮助我。