Provided by: manpages-fr_3.57d1p1-1_all bug

NOM

       netlink - Communication entre noyau et espace 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  à  transférer  des  informations  entre  les modules du noyau et les processus de l'espace
       utilisateur. Il consiste en une interface basée sur les sockets standards pour les processus  utilisateur
       et  d'une  API interne pour les modules du noyau. Cette interface n'est pas documentée dans cette page de
       manuel. Il existe aussi une interface obsolète via  un  périphérique  caractère  netlink,  réservée  pour
       compatibilité et non documentée ici.

       Netlink  est  un  service  orienté  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  sélectionne  le  module  du noyau ou le groupe netlink avec qui communiquer. Les familles
       netlink actuellement affectées sont :

       NETLINK_ROUTE
              Reçoit les modifications de routage et de lien et peut être utilisé pour mettre à jour les  tables
              de routage (IPv4 et IPv6), les adresses IP, les paramètres 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-système 1 fil (1‐wire).

       NETLINK_USERSOCK
              Réservé pour les futurs protocoles dans l'espace utilisateur.

       NETLINK_FIREWALL
              Transporte les paquets IPv4 de netfilter à l'espace  utilisateur.  Utilisé  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'événements SELinux.

       NETLINK_ISCSI
              Open-iSCSI.

       NETLINK_AUDIT
              Audit.

       NETLINK_FIB_LOOKUP
              Accès à la recherche FIB depuis l'espace utilisateur.

       NETLINK_CONNECTOR
              « Connector »  du noyau. Pour plus d'informations, voir Documentation/connector/* dans les sources
              du noyau Linux.

       NETLINK_NETFILTER
              Sous-système netfilter.

       NETLINK_IP6_FW
              Transporte les paquets IPv6 de netfilter à l'espace  utilisateur.  Utilisé  par  le  module  noyau
              ip6_queue.

       NETLINK_DNRTMSG
              Messages de routage DECnet.

       NETLINK_KOBJECT_UEVENT
              Messages du noyau à l'espace utilisateur.

       NETLINK_GENERIC
              Famille netlink générique pour une utilisation simplifiée de netlink.

       Les  messages  netlink  consistent  en  un  flux  d'octets  avec un ou plusieurs en-têtes nlmsghdr et les
       contenus associés. Le flux d'octets ne doit être  accédé  qu'à  travers  les  macros  standards  NLMSG_*.
       Consultez netlink(3) pour plus d'informations..

       Pour  les  messages  multiparties,  (plusieurs en‐têtes nlmsghdr avec contenus associés dans un même flux
       d'octets), tous les en-têtes ont l'attribut NLM_F_MULTI actif, sauf le dernier  en-tête  qui  a  le  type
       NLMSG_DONE.

       Le contenu suit chaque nlmsghdr.

           struct nlmsghdr {
               __u32 nlmsg_len;    /* Longueur y compris en-tête. */
               __u16 nlmsg_type;   /* Type de contenu du message. */
               __u16 nlmsg_flags;  /* Attributs supplémentaires. */
               __u32 nlmsg_seq;    /* Numéro de séquence. */
               __u32 nlmsg_pid;    /* Identifiant du port émetteur. */
           };

       nlmsg_type  peut  être  l'un  des  types standards de message : NLMSG_NOOP message à 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 négatif ou 0 pour acquit */
               struct nlmsghdr msg;  /* en‐tête du message causant l'erreur */
           };

       Une famille netlink contient des types supplémentaires de message, voir la page de manuel appropriée, par
       exemple rtnetlink(7) pour NETLINK_ROUTE.
       Attributs standards dans nlmsg_flags
       ───────────────────────────────────────────────────────────────
       NLM_F_REQUEST   Doit être positionné pour toutes les requêtes.
       NLM_F_MULTI     Le  message  contient  plusieurs  parties,  et
                       terminé par NLMSG_DONE.
       NLM_F_ACK       Envoyer un acquittement de réussite.
       NLM_F_ECHO      Renvoyer cette requête.

       Attributs supplémentaires pour requêtes GET
       ───────────────────────────────────────────────────────────────────
       NLM_F_ROOT     Renvoyer toute la table plutôt qu'une seule entrée.
       NLM_F_MATCH    Renvoyer toutes les entrées correspondant au
                      critère passé dans le contenu du message. Pas
                      encore implémenté.
       NLM_F_ATOMIC   Renvoyer une image instantanée de la table.
       NLM_F_DUMP     Macro équivalente à (NLM_F_ROOT|NLM_F_MATCH).

       Notez que NLM_F_ATOMIC nécessite la capacité CAP_NET_ADMIN ou un UID effectif nul.
       Attributs supplémentaires pour requêtes NEW
       ───────────────────────────────────────────────────────────
       NLM_F_REPLACE   Écraser l'objet existant.
       NLM_F_EXCL      Ne pas remplacer l'objet s'il existe déjà.
       NLM_F_CREATE    Créer un objet s'il n'existe pas.
       NLM_F_APPEND    Ajouter à la fin de la liste d'objets.

       nlmsg_seq et nlmsg_pid sont utilisés pour suivre les messages. nlmsg_pid  montre  l'origine  du  message.
       Remarquez  qu'il n'y a pas de relation d'équivalence 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  à  destination,
       mais  peut  abandonner  des  messages  s'il n'a pas assez de mémoire ou si une erreur se produit. Pour un
       transfert fiable, l'émetteur peut demander un acquittement du récepteur en activant l'attribut NLM_F_ACK.
       Un acquittement est un paquet NLMSG_ERROR avec le champ erreur à zéro.  L'application  doit  envoyer  des
       acquittements  pour  les messages elle-même. Le noyau essaye d'envoyer un message NLMSG_ERROR pour chaque
       paquet échoué. 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
       abandonné et le noyau et le processus utilisateur n'auront pas la même information sur l'état  du  noyau.
       C'est  à  l'application  de détecter cette condition (via l'erreur ENOBUFS renvoyée par recvmsg(2)) et de
       resynchroniser.

   Formats d'adresse
       La structure sockaddr_nl décrit un client netlink  dans  l'espace  utilisateur  ou  dans  le  noyau.  Une
       sockaddr_nl  peut  être  soit unicast (un seul destinataire) soit envoyée à des groupes multicast netlink
       (nl_groups différent de 0).

           struct sockaddr_nl {
               sa_family_t     nl_family;  /* AF_NETLINK */
               unsigned short  nl_pad;     /* Zéro. */
               pid_t           nl_pid;     /* Identifiant de port. */
               __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 généralement 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 être égal au PID de ce processus que pour une socket au plus.
       Il  y  a  deux  façons  d'assigner  nl_pid  à  une  socket netlink. Si l'application définit nl_pid avant
       d'appeler bind(2), c'est à l'application de s'assurer que nl_pid est unique. Si l'application le  définit
       à  0,  le  noyau  se  charge de lui donner une valeur. Le noyau donne le PID à la première socket netlink
       ouverte par le processus, et donne une valeur de nl_pid unique à  chaque  socket  netlink  créée  par  la
       suite.

       nl_groups  est un masque de bits représentant 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 désire écouter. La valeur par
       défaut pour ce champ est zéro, ce qui signifie qu'aucun groupe multicast ne sera reçu.  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 visés, lors de l'appel sendmsg(2) ou lors du connect(2). Seuls les processus  avec  un
       UID  effectif  nul ou ayant la capacité CAP_NET_ADMIN peuvent envoyer ou recevoir sur un groupe multicast
       netlink. Depuis Linux 2.6.13, les messages ne peuvent être envoyés en broadcast vers  plusieurs  groupes.
       Toute  réponse  pour  un  message  reçu  sur un groupe multicast doit être renvoyée au PID émetteur et au
       groupe multicast. Certains sous-systèmes du noyau Linux peuvent en plus autoriser d'autres utilisateurs à
       envoyer des messages. Dans Linux 3.0, les groupes NETLINK_KOBJECT_UEVENT, NETLINK_GENERIC,  NETLINK_ROUTE
       et  NETLINK_SELINUX  autorisent  d'autres  utilisateurs à recevoir des messages. Aucun groupe ne permet à
       d'autres utilisateurs d'envoyer des messages.

VERSIONS

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

       Linux 2.0 avait une interface netlink plus primitive,  basée  sur  un  périphérique  caractère  (toujours
       valable pour compatibilité). Cette interface obsolète n'est pas décrite 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 à travers la bibliothèque libnetlink ou libnl que via
       l'interface bas-niveau du noyau.

BOGUES

       Cette page de manuel n'est pas complète.

EXEMPLE

       L'exemple suivant crée une socket netlink NETLINK_ROUTE qui  écoute  les  groupes  multicast  RTMGRP_LINK
       (événements     de     création/suppression/configuration/déconfiguration    d'interface    réseau)    et
       RTMGRP_IPV4_IFADDR (événements 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 gérer les numéros de séquence des messages pour prendre en compte correctement les acquits.

           struct nlmsghdr *nh;    /* L'en‐tête nlmsghdr avec contenu à envoyer. */
           struct sockaddr_nl sa;
           struct iovec iov = { nh, nh->nlmsg_len };
           struct msghdr msg;

           msg = { &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 une confirmation du noyau en définissant 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 = { &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)

       pour des informations sur libnetlink

       pour des informations sur libnl

       RFC 3549 « Linux Netlink as an IP Services Protocol »

COLOPHON

       Cette page fait partie de la publication 3.57 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

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

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

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

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».

Linux                                             15 mars 2013                                        NETLINK(7)