У меня есть некоторые проблемы с использованием сокетов 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. Я не могу выяснить проблему ... Все семейства сетевых ссылок указаны в linux/netlink.h
, а число 20 не существует, поэтому Я думаю, что это может быть использовано для определения моей новой семьи. Что случилось? Спасибо всем.