URL: https://linuxfr.org/forums/programmation-c--2/posts/generic-netlink Title: Generic Netlink Authors: Doude Date: 2007年11月13日T15:42:43+01:00 Tags: Score: 0 Salut, J'essaye de me servir des fonctionnalités de la Generic Netlink pour dialoguer entre mon module noyau et des processus utilisateurs. Je me suis inspirer de la doc [http://www.linux-foundation.org/en/Net:Generic_Netlink_HOWTO](http://www.linux-foundation.org/en/Net:Generic_Netlink_HOWTO) et de code du noyau (taskstats.c, acpi.c) pour reproduire un exemple de base avant de l'incorporer dans mon module. Mais je n'arrive pas à faire fonctionner cet exemple de base : #include <linux/kernel.h> #include <linux/module.h> #include <net/sock.h> #include <linux/netlink.h> #include <linux/version.h> #include <linux/rtnetlink.h> #include <net/genetlink.h> enum { £spaces£ £/spaces£DOC_EXMPL_C_UNSPEC = 0, £spaces£ £/spaces£DOC_EXMPL_C_ECHO, £spaces£ £/spaces£__DOC_EXMPL_C_MAX, }; #define DOC_EXMPL_C_MAX (__DOC_EXMPL_C_MAX - 1) enum { £spaces£ £/spaces£DOC_EXMPL_A_UNSPEC = 0, £spaces£ £/spaces£DOC_EXMPL_A_MSG, £spaces£ £/spaces£__DOC_EXMPL_A_MAX, }; #define DOC_EXMPL_A_MAX (__DOC_EXMPL_A_MAX - 1) static struct genl_family doc_exmpl_gnl_family = { £spaces£ £/spaces£.id = GENL_ID_GENERATE, £spaces£ £/spaces£.name = "DOC_EXMPL", £spaces£ £/spaces£.version = 1, £spaces£ £/spaces£.maxattr = DOC_EXMPL_A_MAX, }; static struct genl_multicast_group event_mcgrp_echo = { £spaces£ £/spaces£.name = "mc_group_echo", }; struct test { £spaces£ £/spaces£char name[15]; £spaces£ £/spaces£u32 num; }; int send(void) { £spaces£ £/spaces£struct sk_buff *skb; £spaces£ £/spaces£int rc = 0, size; £spaces£ £/spaces£void *msg_head; £spaces£ £/spaces£size = nla_total_size(0); £spaces£ £/spaces£printk("size = %i\n", size); £spaces£ £/spaces£skb = genlmsg_new(size, GFP_KERNEL); £spaces£ £/spaces£if (skb == NULL) { £spaces£ £/spaces£printk("error on genlmsg_new\n"); £spaces£ £/spaces£return -ENOMEM; £spaces£ £/spaces£} £spaces£ £/spaces£/* create the message headers */ £spaces£ £/spaces£msg_head = genlmsg_put(skb, 0, 0, &doc_exmpl_gnl_family, 0, DOC_EXMPL_C_ECHO); £spaces£ £/spaces£if (msg_head == NULL) { £spaces£ £/spaces£printk("error on genlmsg_put\n"); £spaces£ £/spaces£rc = -ENOMEM; £spaces£ £/spaces£goto failure; £spaces£ £/spaces£} £spaces£ £/spaces£/* finalize the message */ £spaces£ £/spaces£rc = genlmsg_end(skb, msg_head); £spaces£ £/spaces£if (rc < 0) { £spaces£ £/spaces£printk("error on genlmsg_end\n"); £spaces£ £/spaces£goto failure; £spaces£ £/spaces£} £spaces£ £/spaces£ £spaces£ £/spaces£rc = genlmsg_multicast(skb, 0, event_mcgrp_echo.id, GFP_KERNEL); £spaces£ £/spaces£if (rc != 0) { £spaces£ £/spaces£printk("error on genlmsg_multicast %i\n", rc); £spaces£ £/spaces£goto failure; £spaces£ £/spaces£} £spaces£ £/spaces£return rc; failure: £spaces£ £/spaces£printk("Failure\n"); £spaces£ £/spaces£nlmsg_free(skb); £spaces£ £/spaces£genl_unregister_family(&doc_exmpl_gnl_family); £spaces£ £/spaces£return rc; } int init_mod(void) { £spaces£ £/spaces£int err = 0; £spaces£ £/spaces£err = genl_register_family(&doc_exmpl_gnl_family); £spaces£ £/spaces£if (err < 0) { £spaces£ £/spaces£printk("Error register family\n"); £spaces£ £/spaces£return err; £spaces£ £/spaces£} £spaces£ £/spaces£printk("Family id : %i\n", doc_exmpl_gnl_family.id); £spaces£ £/spaces£ £spaces£ £/spaces£err = genl_register_mc_group(&doc_exmpl_gnl_family, &event_mcgrp_echo); £spaces£ £/spaces£if (err) { £spaces£ £/spaces£genl_unregister_family(&doc_exmpl_gnl_family); £spaces£ £/spaces£printk("error register multicast group \n"); £spaces£ £/spaces£return err; £spaces£ £/spaces£} £spaces£ £/spaces£err = send(); £spaces£ £/spaces£return err; } static void __exit exit_mod(void) { £spaces£ £/spaces£genl_unregister_family(&doc_exmpl_gnl_family); £spaces£ £/spaces£printk(KERN_INFO "Goodbye\n"); } module_init(init_mod); module_exit(exit_mod); MODULE_LICENSE("GPL"); Je travail avec un noyau 2.6.23 et sur deux architecture différentes (x86, armv5b) Sur le x86, la fonction "genlmsg_multicast" me retourne l'erreur ESRCH Sur la carte arm, la fonction "genlmsg_put" retourne une pointeur NULL. Une idée du problème, un oublis ... ?

AltStyle によって変換されたページ (->オリジナル) /