focal (7) netlink.7.gz

Provided by: manpages-fr_3.65d1p1-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 ⟨ftp://ftp.inr.ac.ru/ip-routing/iproute2*⟩

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

       RFC 3549 « Linux Netlink as an IP Services Protocol »

COLOPHON

       Cette page fait partie de la publication 3.65 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> ».