Как использовать сокеты netlink с новым семейством netlink - PullRequest
2 голосов
/ 29 февраля 2012

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

1 Ответ

1 голос
/ 18 февраля 2016

20 уже используется NETLINK_RDMA.Почему бы вам просто не использовать NETLINK_USERSOCK в качестве семейства сетевых ссылок?

#define NETLINK_ROUTE       0   /* Routing/device hook              */
#define NETLINK_UNUSED      1   /* Unused number                */
#define NETLINK_USERSOCK    2   /* Reserved for user mode socket protocols  */
#define NETLINK_FIREWALL    3   /* Unused number, formerly ip_queue     */
#define NETLINK_SOCK_DIAG   4   /* socket monitoring                */
#define NETLINK_NFLOG       5   /* netfilter/iptables ULOG */
#define NETLINK_XFRM        6   /* ipsec */
#define NETLINK_SELINUX     7   /* SELinux event notifications */

#define NETLINK_ISCSI       8   /* Open-iSCSI */
#define NETLINK_AUDIT       9   /* auditing */
#define NETLINK_FIB_LOOKUP  10  
#define NETLINK_CONNECTOR   11
#define NETLINK_NETFILTER   12  /* netfilter subsystem */
#define NETLINK_IP6_FW      13
#define NETLINK_DNRTMSG     14  /* DECnet routing messages */
#define NETLINK_KOBJECT_UEVENT  15  /* Kernel messages to userspace */
#define NETLINK_GENERIC     16

/* leave room for NETLINK_DM (DM Events) */
#define NETLINK_SCSITRANSPORT   18  /* SCSI Transports */
#define NETLINK_ECRYPTFS    19
#define NETLINK_RDMA        20
#define NETLINK_CRYPTO      21  /* Crypto layer */

#define NETLINK_INET_DIAG   NETLINK_SOCK_DIAG

#define MAX_LINKS 32     
...