カーネル モジュールからユーザー空間デーモンに netlink メッセージを送信するのに多くの問題があります。それらはランダムに失敗します。カーネル側では、ユーザー側では(function from ) が失敗し、syscall が で失敗し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;
}
なぜこれが起こっているのか、まったくわかりません。そのため、私のプロジェクトは機能しません。誰かがそれを手伝ってくれることを本当に願っています。