Многоадресная связь Python Netlink в ядрах выше 4

Я пытался воспроизвести пример из предыдущего сообщения SO в ядре выше 4 (4.1):

#include <linux/module.h> #include <linux/kernel.h> #include <linux/netlink.h> #include <net/netlink.h> #include <net/net_namespace.h> /* Protocol family, consistent in both kernel prog and user prog. */ #define MYPROTO NETLINK_USERSOCK /* Multicast group, consistent in both kernel prog and user prog. */ #define MYGRP 31 static struct sock *nl_sk = NULL; static void send_to_user(void) { struct sk_buff *skb; struct nlmsghdr *nlh; char *msg = "Hello from kernel"; int msg_size = strlen(msg) + 1; int res; pr_info("Creating skb.\n"); skb = nlmsg_new(NLMSG_ALIGN(msg_size + 1), GFP_KERNEL); if (!skb) { pr_err("Allocation failure.\n"); return; } nlh = nlmsg_put(skb, 0, 1, NLMSG_DONE, msg_size + 1, 0); strcpy(nlmsg_data(nlh), msg); pr_info("Sending skb.\n"); res = nlmsg_multicast(nl_sk, skb, 0, MYGRP, GFP_KERNEL); if (res < 0) pr_info("nlmsg_multicast() error: %d\n", res); else pr_info("Success.\n"); } static int __init hello_init(void) { pr_info("Inserting hello module.\n"); nl_sk = netlink_kernel_create(&init_net, MYPROTO, NULL); if (!nl_sk) { pr_err("Error creating socket.\n"); return -10; } send_to_user(); netlink_kernel_release(nl_sk); return 0; } static void __exit hello_exit(void) { pr_info("Exiting hello module.\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); 

Однако компиляция работает нормально, но когда я вставляю модуль, он возвращает:

 nlmsg_multicast() error: -3 

Я даже не знаю, где я могу найти коды ошибок, чтобы узнать, что -3 означает в этом контексте (я искал здесь , но не смог найти ничего полезного в отношении кода ошибки).

Чтобы быть уверенным, я отправляю код userland (Python) также:

EDITED из-за комментария: (но все еще не работает)

 #!/usr/bin/env python import socket import os import time sock = socket.socket(socket.AF_NETLINK, socket.SOCK_DGRAM, socket.NETLINK_USERSOCK) # 270 is SOL_NETLINK and 1 is NETLINK_ADD_MEMBERSHIP sock.setsockopt(270, 1, 31) while 1: try: print sock.recvfrom(1024) except socket.error, e: print 'Exception' 

  • Предотвратить загрузку файла ftplib?
  • Эффективный продукт 1D массива и трехмерного массива по одному измерению - NumPy
  • TFIDF для большого набора данных
  • Как сбросить db в Django? Я получаю команду 'reset' not found error
  • Как переопределить delete () на модели и работать с соответствующими удалениями
  • Почему PEP-8 указывает максимальную длину строки в 79 символов?
  • из основного 4D изображения tif хранения как hdf5 python
  • Уценка Python добавляет класс в таблицу
  • One Solution collect form web for “Многоадресная связь Python Netlink в ядрах выше 4”

    Вы забыли связать сокет. 🙂

    Я не очень свободно говорю с Python, поэтому используйте это только как отправную точку (между socket и setsockopt ):

     sock.bind((0, 0)) 

    Это печатает мне кучу мусора, среди которых я вижу

     Hello from kernel 

    Кстати: Когда nlmsg_multicast() выбрасывает ESRCH , это обычно (или, может быть, всегда), потому что не было клиентов, слушающих.

    Сначала откройте клиент, затем попробуйте отправить сообщение из ядра.

    В противном случае вы всегда можете игнорировать этот код ошибки, который имеет смысл для вашего прецедента.

    Python - лучший язык программирования в мире.