У меня много проблем с отправкой сообщений netlink из модуля ядра в userpace-daemon.Они случайно терпят неудачу.На стороне ядра, genlmsg_unicast
завершается с ошибкой EAGAIN
, а на стороне пользователя, nl_recvmsgs_default
(функция из libnl
) завершается с NLE_NOMEM
, что вызвано сбоем системного вызова recvmsg
с ENOBUFS
.
Сообщения Netlink малы, максимальный размер полезной нагрузки составляет ~ 300 Б.
Вот код для отправки сообщения из ядра:
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;
}
Я абсолютно не знаю, почему этопроисходит, и мой проект просто не будет работать из-за этого!Я действительно надеюсь, что кто-то может помочь мне с этим.