Provided by: manpages-fr_3.32d0.2p4-1_all bug

NOM

       netlink - Communication entre noyau et utilisateur (AF_NETLINK)

SYNOPSIS

       #include <asm/types.h>
       #include <sys/socket.h>
       #include <linux/netlink.h>

       netlink_socket = socket(AF_NETLINK, type_socket, netlink_family);

DESCRIPTION

       Netlink  sert  a transferer des informations entre les modules du noyau
       et les processus de l'espace utilisateur. Il consiste en une  interface
       basee sur les sockets standards pour les processus utilisateur et d'une
       API interne pour les  modules  du  noyau.  Cette  interface  n'est  pas
       documentee  dans  cette  page  de manuel. Il existe aussi une interface
       obsolete  via  un  peripherique  caractere   netlink,   reservee   pour
       compatibilite et non documentee ici.

       Netlink  est  un service oriente datagramme. Les deux types SOCK_RAW et
       SOCK_DGRAM sont des valeurs possibles pour type_socket ; toutefois,  le
       protocole netlink ne distingue pas les sockets raw et datagrammes.

       netlink_family selectionne le module du noyau ou le groupe netlink avec
       qui communiquer. Les familles netlink actuellement affectees sont :

       NETLINK_ROUTE
              Recoit les modifications de routage et  de  lien  et  peut  etre
              utilise pour mettre a jour les tables de routage (IPv4 et IPv6),
              les adresses IP, les parametres de lien, les  configurations  de
              voisins,  les politiques d'ordonnancement, les classes de trafic
              et les classificateurs de paquets (consultez rtnetlink(7)).

       NETLINK_W1
              Messages du sous-systeme 1 fil (1-wire).

       NETLINK_USERSOCK
              Reserve pour les futurs protocoles dans l'espace utilisateur.

       NETLINK_FIREWALL
              Transporte les paquets IPv4 de netfilter a l'espace utilisateur.
              Utilise par le module noyau ip_queue.

       NETLINK_INET_DIAG
              Surveillance de sockets INET.

       NETLINK_NFLOG
              Messages ULOG de netfilter/iptables.

       NETLINK_XFRM
              IPsec.

       NETLINK_SELINUX
              Notifications d'evenements SELinux.

       NETLINK_ISCSI
              Open-iSCSI.

       NETLINK_AUDIT
              Audit.

       NETLINK_FIB_LOOKUP
              Acces a la recherche FIB depuis l'espace utilisateur.

       NETLINK_CONNECTOR
              << Connector >>   du   noyau.  Pour  plus  d'informations,  voir
              Documentation/connector/* dans les sources du noyau.

       NETLINK_NETFILTER
              Sous-systeme netfilter.

       NETLINK_IP6_FW
              Transporte les paquets IPv6 de netfilter a l'espace utilisateur.
              Utilise par le module noyau ip6_queue.

       NETLINK_DNRTMSG
              Messages de routage DECnet.

       NETLINK_KOBJECT_UEVENT
              Messages du noyau a l'espace utilisateur.

       NETLINK_GENERIC
              Famille  netlink  generique  pour  une utilisation simplifiee de
              netlink.

       Les messages  netlink  consistent  en  un  flux  d'octets  avec  un  ou
       plusieurs  en-tetes nlmsghdr et les contenus associes. Le flux d'octets
       ne  doit  etre  accede  qu'a  travers  les  macros  standards  NLMSG_*.
       Consultez netlink(3) pour plus d'informations..

       Pour  les  messages  multiparties,  (plusieurs  en-tetes  nlmsghdr avec
       contenus associes dans un meme flux d'octets), tous  les  en-tetes  ont
       l'attribut  NLM_F_MULTI  actif,  sauf  le dernier en-tete qui a le type
       NLMSG_DONE.

       Le contenu suit chaque nlmsghdr.

           struct nlmsghdr {
               __u32 nlmsg_len;    /* Longueur y compris en-tete. */
               __u16 nlmsg_type;   /* Type de contenu du message. */
               __u16 nlmsg_flags;  /* Attributs supplementaires. */
               __u32 nlmsg_seq;    /* Numero de sequence. */
               __u32 nlmsg_pid;    /* PID du processus emetteur. */
           };

       nlmsg_type peut etre l'un des types standards de  message :  NLMSG_NOOP
       message  a  ignorer,  NLMSG_ERROR  message  indiquant  une  erreur, son
       contenu est une  structure  nlmsgerr,  NLMSG_DONE  message  final  d'un
       ensemble multiparties.

           struct nlmsgerr {
               int error;            /* errno negatif ou 0 pour acquit */
               struct nlmsghdr msg;  /* en-tete du message causant l'erreur */
           };

       Une famille netlink contient des types supplementaires de message, voir
       la  page  de  manuel  appropriee,   par   exemple   rtnetlink(7)   pour
       NETLINK_ROUTE.

       Attribut standards dans nlmsg_flags
       -----------------------------------

       NLM_F_REQUEST   Doit etre positionne pour toutes les requetes.
       NLM_F_MULTI     Le  message  contient  plusieurs  parties,  et
                       termine par NLMSG_DONE.
       NLM_F_ACK       Envoyer un acquittement de reussite.
       NLM_F_ECHO      Renvoyer cette requete.

       Attributs supplementaires pour requetes GET
       -------------------------------------------

       NLM_F_ROOT     Renvoyer toute la table plutot qu'une seule entree.
       NLM_F_MATCH    Renvoyer  toutes  les  entrees   correspondant   au
                      critere  passe  dans  le  contenu  du message.  Pas
                      encore implemente.
       NLM_F_ATOMIC   Renvoyer une image instantanee de la table.
       NLM_F_DUMP     Macro equivalente a (NLM_F_ROOT|NLM_F_MATCH).

       Notez que NLM_F_ATOMIC necessite la capacite CAP_NET_ADMIN  ou  un  UID
       effectif nul.

       Attributs supplementaires pour requetes NEW
       -------------------------------------------

       NLM_F_REPLACE   Ecraser l'objet existant.
       NLM_F_EXCL      Ne pas remplacer l'objet s'il existe deja.
       NLM_F_CREATE    Creer un objet s'il n'existe pas.
       NLM_F_APPEND    Ajouter a la fin de la liste d'objets.

       nlmsg_seq   et  nlmsg_pid  sont  utilises  pour  suivre  les  messages.
       nlmsg_pid montre l'origine du message. Remarquez qu'il  n'y  a  pas  de
       relation  d'equivalence  entre  nlmsg_pid  et le PID du processus si le
       message  vient  d'une  socket  netlink.  Consultez  la  section  FORMAT
       D'ADRESSE pour plus d'informations.

       nlmsg_seq et nlmsg_pid sont opaques pour netlink.

       Netlink  n'est  pas  un  protocole  fiable.  Il  fait de son mieux pour
       conduire les messages a destination, mais peut abandonner des  messages
       s'il  n'a  pas  assez  de  memoire ou si une erreur se produit. Pour un
       transfert fiable, l'emetteur peut demander un acquittement du recepteur
       en  activant  l'attribut  NLM_F_ACK.  Un  acquittement  est  un  paquet
       NLMSG_ERROR avec le champ erreur a zero. L'application doit envoyer des
       acquittements pour les messages elle-meme. Le noyau essaye d'envoyer un
       message NLMSG_ERROR pour chaque paquet echoue. Le processus utilisateur
       devrait suivre aussi cette convention.

       Cependant,  garantir  des  transmissions  fiables  entre  le  noyau  et
       l'espace utilisateur est impossible. Le noyau ne peut  pas  envoyer  de
       message  netlink  si le tampon de la socket est plein : le message sera
       abandonne et le noyau et le processus utilisateur n'auront pas la  meme
       information  sur  l'etat  du  noyau.  C'est a l'application de detecter
       cette condition (via l'erreur ENOBUFS renvoyee par  recvmsg(2))  et  de
       resynchroniser.

   Formats d'adresse
       La  structure  sockaddr_nl  decrit  un  client  netlink  dans  l'espace
       utilisateur ou dans le noyau. Une sockaddr_nl peut  etre  soit  unicast
       (un  seul  destinataire)  soit  envoyee a des groupes multicast netlink
       (nl_groups different de 0).

           struct sockaddr_nl {
               sa_family_t     nl_family;  /* AF_NETLINK */
               unsigned short  nl_pad;     /* Zero. */
               pid_t           nl_pid;     /* PID. */
               __u32           nl_groups;  /* Masque groupes multicast. */
           };

       nl_pid est l'adresse unicast de la socket netlink. Elle vaut toujours 0
       si  la  destination  est  dans le noyau. Pour un processus utilisateur,
       nl_pid est generalement le PID du processus auquel appartient la socket
       de  destination. Cependant, nl_pid identifie une socket netlink, pas un
       processus. Si un processus a plusieurs sockets netlink, nl_pid ne  peut
       etre  egal  au  PID de ce processus que pour une socket au plus. Il y a
       deux facons d'assigner nl_pid a une socket  netlink.  Si  l'application
       fixe nl_pid avant d'appeler bind(2), c'est a l'application de s'assurer
       que nl_pid est unique. Si l'application le fixe a 0, le noyau se charge
       de  lui  donner  une valeur. Le noyau donne le PID a la premiere socket
       netlink ouverte par le processus, et donne une valeur de nl_pid  unique
       a chaque socket netlink creee par la suite.

       nl_groups  est  un  masque  de bits representant un ensemble de groupes
       netlink. Chaque famille netlink a un ensemble de 32 groupes  multicast.
       Quand  on  appelle  bind(2)  sur  la  socket,  le champ nl_groups de la
       structure sockaddr_nl doit contenir un masque de bits des  groupes  que
       l'on  desire  ecouter.  La valeur par defaut pour ce champ est zero, ce
       qui signifie qu'aucun groupe multicast ne sera recu.  Une  socket  peut
       envoyer  un  message sur n'importe quel groupe multicast en remplissant
       le champ nl_groups avec un masque de bit des  groupes  vises,  lors  de
       l'appel  sendmsg(2)  ou lors du connect(2). Seuls les processus avec un
       UID effectif nul ou ayant la capacite CAP_NET_ADMIN peuvent envoyer  ou
       recevoir sur un groupe multicast netlink. Toute reponse pour un message
       recu sur un groupe multicast doit etre renvoyee au PID emetteur  et  au
       groupe multicast.

VERSIONS

       L'interface par socket de netlink est une nouveaute dans Linux 2.2.

       Linux 2.0  avait  une  interface  netlink  plus primitive, basee sur un
       peripherique caractere (toujours  valable  pour  compatibilite).  Cette
       interface obsolete n'est pas decrite ici.

       NETLINK_SELINUX est apparu dans Linux 2.6.4.

       NETLINK_AUDIT est apparu dans Linux 2.6.6.

       NETLINK_KOBJECT_UEVENT est apparu dans Linux 2.6.10.

       NETLINK_W1 et NETLINK_FIB_LOOKUP sont apparus dans Linux 2.6.13.

       NETLINK_INET_DIAG,  NETLINK_CONNECTOR et NETLINK_NETFILTER sont apparus
       dans Linux 2.6.14.

       NETLINK_GENERIC et NETLINK_ISCSI sont apparus dans Linux 2.6.15.

NOTES

       Il est souvent plus facile d'utiliser netlink a travers la bibliotheque
       libnetlink ou libnl que via l'interface bas-niveau du noyau.

BOGUES

       Cette page de manuel n'est pas complete.

EXEMPLE

       L'exemple  suivant cree une socket netlink NETLINK_ROUTE qui ecoute les
       groupes       multicast        RTMGRP_LINK        (evenements        de
       creation/suppression/configuration/deconfiguration  d'interface reseau)
       et RTMGRP_IPV4_IFADDR (evenements d'ajout/suppression d'adresses IPv4).

           struct sockaddr_nl sa;

           memset(&sa, 0, sizeof(sa));
           sa.nl_family = AF_NETLINK;
           sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;

           fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
           bind(fd, (struct sockaddr *) &sa, sizeof(sa));

       L'exemple suivant montre comment envoyer un message  netlink  au  noyau
       (PID 0). Notez que l'application doit gerer les numeros de sequence des
       messages pour prendre en compte correctement les acquits.

           struct nlmsghdr *nh;    /* L'en-tete nlmsghdr avec contenu a envoyer. */
           struct sockaddr_nl sa;
           struct iovec iov = { (void *) nh, nh->nlmsg_len };
           struct msghdr msg;

           msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
           memset(&sa, 0, sizeof(sa));
           sa.nl_family = AF_NETLINK;
           nh->nlmsg_pid = 0;
           nh->nlmsg_seq = ++sequence_number;
           /* Demander un acquit au noyau en fixant NLM_F_ACK. */
           nh->nlmsg_flags |= NLM_F_ACK;

           sendmsg(fd, &msg, 0);

       Le dernier exemple montre comment lire un message netlink.

           int len;
           char buf[4096];
           struct iovec iov = { buf, sizeof(buf) };
           struct sockaddr_nl sa;
           struct msghdr msg;
           struct nlmsghdr *nh;

           msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
           len = recvmsg(fd, &msg, 0);

           for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len);
                nh = NLMSG_NEXT (nh, len)) {
               /* Fin d'un message multiparties. */
               if (nh->nlmsg_type == NLMSG_DONE)
                   return;

               if (nh->nlmsg_type == NLMSG_ERROR)
                   /* Gestion d'erreurs. */
               ...

               /* Analyser le contenu. */
               ...
           }

VOIR AUSSI

       cmsg(3), netlink(3), capabilities(7), rtnetlink(7)

       ftp://ftp.inr.ac.ru/ip-routing/iproute2*  pour  des  informations   sur
       libnetlink.

       http://people.suug.ch/~tgr/libnl/ pour des informations sur libnl.

       RFC 3549 << Linux Netlink as an IP Services Protocol >>

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.32 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       etre       trouvees      a      l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis 2010, cette traduction est maintenue a l'aide  de  l'outil  po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'equipe   de   traduction
       francophone       au       sein        du        projet        perkamon
       <URL:http://perkamon.alioth.debian.org/>.

       Christophe  Blaess  <URL:http://www.blaess.fr/christophe/> (1996-2003),
       Alain  Portal  <URL:http://manpagesfr.free.fr/>  (2003-2006).    Julien
       Cristau et l'equipe francophone de traduction de Debian (2006-2009).

       Veuillez   signaler   toute   erreur   de   traduction  en  ecrivant  a
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir acces a la version anglaise de ce document
       en utilisant la commande << man -L C <section> <page_de_man> >>.