新しい netlink ファミリで netlink ソケットを使用すると、いくつかの問題があります...特にグループで。netlink_broadcast
カーネル空間でorメソッドを使用nlmsg_multicast
して、メッセージをユーザー空間に送信します。たとえば、定義を含むヘッダーがあります。
#define NETLINK_MYFAMILY 20
#define NL_MYGRP 2
ソケットを開き、ネットリンク アドレスにバインドするプロセス:
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の場合にのみ、プロセス内のメッセージを正しく読み取ることができますNL_MYGRP
。問題がわかりません...すべての netlink ファミリが指定されてlinux/netlink.h
おり、番号 20 が存在しないため、私の指定に使用できると思います新しい家族。なにが問題ですか?皆さん、ありがとうございました。