Python Netlink Multicast Kommunikation in Kerneln über 4

Ich habe versucht, das Beispiel aus einem früheren SO Post auf einem Kernel über 4 (4.1) zu reproduzieren:

#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"); 

Allerdings funktioniert die Kompilierung gut, aber wenn ich das Modul einfügte, kehrt es zurück:

 nlmsg_multicast() error: -3 

Ich weiß nicht einmal, wo ich die Fehlercodes nachholen kann, was -3 bedeutet in diesem Zusammenhang (ich suchte hier , konnte aber nichts nützliches finden, was den Fehlercode angeht).

Nur um sicher zu sein, posten ich den Userland Code (Python) auch:

BEARBEITET wegen eines Kommentars: (aber immer noch nicht funktioniert)

 #!/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' 

  • Kannst du dieses Debugging-Makro von C ++ zu Python übersetzen?
  • JAXB-Äquivalent zur Erzeugung von c ++ - Klassen von xsd?
  • Holen Sie sich den Wert eines Cython Zeigers
  • Vollständige Datums- und Zeitbibliothek
  • Qt Designer generiert C ++ - Code
  • Wie kann man überprüfen, ob eine Windows-Version echt ist oder nicht?
  • One Solution collect form web for “Python Netlink Multicast Kommunikation in Kerneln über 4”

    Du hast vergessen, die Steckdose zu binden. 🙂

    Ich bin nicht sehr fließend mit Python, also benutze das nur als Ausgangspunkt (zwischen socket und setsockopt ):

     sock.bind((0, 0)) 

    Das druckt mir einen Haufen Müll, unter dem ich sehen kann

     Hello from kernel 

    Übrigens: Wenn nlmsg_multicast() ESRCH wirft, ist es meist (oder vielleicht immer), weil es keine Clients hörte.

    Öffnen Sie zuerst den Client und versuchen Sie dann, die Nachricht aus dem Kernel zu senden.

    Andernfalls kannst du diesen Fehlercode immer ignorieren, der für deinen Anwendungsfall sinnvoll ist.

    Python ist die beste Programmiersprache der Welt.