Home

rtnetlink(7) - fr

rtnetlink(7)Miscellaneous Information Manualrtnetlink(7)

rtnetlink – Socket de routage de Linux

#include <asm/types.h>#include <linux/if_link.h>#include <linux/netlink.h>#include <linux/rtnetlink.h>#include <sys/socket.h>
rtnetlink_socket = socket(AF_NETLINK, int type_socket, NETLINK_ROUTE);

rtnetlink permet de lire et modifier les tables de routage du noyau. Cela permet à divers sous-systèmes du noyau de communiquer entre eux, bien que cette utilisation ne soit pas documentée ici, et de communiquer avec les programmes de l'espace utilisateur. Les routes réseau, les adresses IP, les paramètres de liaison, la configuration du voisinage, la discipline de file d’attente, les classes de trafic et les classes de paquet peuvent être configurés par le biais des sockets NETLINK_ROUTE. Cela est basé sur des messages netlink ; consultez netlink(7) pour plus d'informations.

Certains messages rtnetlink ont des attributs facultatifs après l'en-tête initial :


struct rtattr {
unsigned short rta_len; /* Longueur d’option */
unsigned short rta_type; /* Type d'option */
/* Les données suivent... */};

Ces attributs ne doivent être manipulés qu'en utilisant les macros RTA_* ou libnetlink. Consultez rtnetlink(3).

rtnetlink est constitué de trois types de messages (en plus des messages netlink standard) :

Créer, supprimer ou obtenir des informations à propos d'une interface réseau spécifique. Ces messages contiennent une structure ifinfomsg suivie d'une série de structures rtattr.
struct ifinfomsg {
unsigned char ifi_family; /* AF_UNSPEC */
unsigned short ifi_type; /* Type périphérique */
int ifi_index; /* Indice interface */
unsigned int ifi_flags; /* Attributs périphérique */
unsigned int ifi_change; /* Masque modificateur */};
ifi_flags contient les attributs du périphérique ; consultez netdevice(7). ifi_index est l'indice unique de l'interface (depuis Linux 3.7, il est possible de fournir une valeur non nulle avec le message RTM_NEWLINK, créant un lien avec l’ifindex) donné. ifi_change est réservé pour un usage ultérieur et doit toujours valoir 0xFFFFFFFF.
Attributs de routage
rta_typeType de valeurDescription
IFLA_UNSPEC-non précisé
IFLA_ADDRESSadresse matérielleadresse L2 d’interface
IFLA_BROADCASTadresse matérielleadresse L2 de diffusion
IFLA_IFNAMEchaîne ASCIIZnom de périphérique
IFLA_MTUentier non signéMTU du périphérique
IFLA_LINKinttype de lien
IFLA_QDISCchaîne ASCIIZmécanismes de file d'attente
IFLA_STATSvoir ci‐dessousstatistiques d’interface
Le type de données pour IFLA_STATS est struct rtnl_link_stats (struct net_device_stats dans les noyaux Linux 2.4 et antérieurs).
Add, remove, or receive information about an IP address associated with an interface. In Linux 2.2, an interface can carry multiple IP addresses, this replaces the alias device concept in Linux 2.0. In Linux 2.2, these messages support IPv4 and IPv6 addresses. They contain an ifaddrmsg structure, optionally followed by rtattr routing attributes.
struct ifaddrmsg {
unsigned char ifa_family; /* Type adresse */
unsigned char ifa_prefixlen; /* Longueur préfixe adresse */
unsigned char ifa_flags; /* Attributs adresse */
unsigned char ifa_scope; /* Portée adresse */
unsigned int ifa_index; /* Indice interface */};
ifa_family est le type de famille d'adresses (actuellement AF_INET ou AF_INET6), ifa_prefixlen est la longueur du masque d'adresse s'il est défini pour la famille (comme avec IPv4), ifa_scope est la portée de l'adresse, ifa_index est l'indice de l'interface associée à l'adresse. ifa_flags est un attribut composé de IFA_F_SECONDARY pour une adresse secondaire (les anciens alias d'interface), IFA_F_PERMANENT pour une adresse permanente configurée par l'utilisateur et d'autres indicateurs non documentés.
Attributs
rta_typeType de valeurDescription
IFA_UNSPEC-non précisé
IFA_ADDRESSadresse brute de protocoleadresse d’interface
IFA_LOCALadresse brute de protocoleadresse locale
IFA_LABELchaîne ASCIIZnom de l'interface
IFA_BROADCASTadresse brute de protocoleadresse de diffusion
IFA_ANYCASTadresse brute de protocoleadresse anycast
IFA_CACHEINFOstruct ifa_cacheinfoinformations d’adresse
Créer, supprimer ou obtenir des informations à propos d'une route réseau. Ces messages contiennent une structure rtmsg suivie d'une séquence éventuelle de structures rtattr. Pour RTM_GETROUTE, mettre rtm_dst_len et rtm_src_len à 0 signifie obtenir toutes les entrées pour la table de routage indiquée. Pour les autres champs, sauf rtm_table et rtm_protocol, 0 est le symbole générique signifiant « toutes valeurs ».
struct rtmsg {
unsigned char rtm_family; /* Famille d'adresses de la route */
unsigned char rtm_dst_len; /* Longueur destination */
unsigned char rtm_src_len; /* Longueur source */
unsigned char rtm_tos; /* Filtre TOS */
unsigned char rtm_table; /* ID table de routage ;
voir RTA_TABLE ci-dessous */
unsigned char rtm_protocol; /* Protocole de routage ;
voir ci-dessous */
unsigned char rtm_scope; /* Voir ci-dessous */
unsigned char rtm_type; /* Voir ci-dessous */
unsigned int rtm_flags;};
rtm_typeType de route
RTN_UNSPECroute inconnue
RTN_UNICASTpasserelle ou route directe
RTN_LOCALroute d’interface locale
RTN_BROADCASTroute de diffusion locale (envoi en broadcast)
RTN_ANYCASTroute de diffusion locale (envoi en unicast)
RTN_MULTICASTroute multicast
RTN_BLACKHOLEroute d'abandon de paquets
RTN_UNREACHABLEdestination inaccessible
RTN_PROHIBITroute de rejet de paquets
RTN_THROWcontinuer la recherche de routage dans une autre table
RTN_NATrègle de traduction d'adresse réseau
RTN_XRESOLVEréférence à une résolution externe (non implémentée)
rtm_protocolOrigine de la route
RTPROT_UNSPECinconnue
RTPROT_REDIRECTdéfinie par une redirection ICMP (inutilisée actuellement)
RTPROT_KERNELdéfinie par le noyau
RTPROT_BOOTobtenue pendant le démarrage
RTPROT_STATICdéfinie par l'administrateur

Les valeurs plus grandes que RTPROT_STATIC ne sont pas interprétées par le noyau et servent d'information utilisateur. Elles permettent de marquer la source de l’information de routage ou de faire une distinction entre plusieurs démons de routage. Consultez <linux/rtnetlink.h> pour les identificateurs des démons de routage déjà affectés.

rtm_scope est la distance à la destination :
RT_SCOPE_UNIVERSEroute globale
RT_SCOPE_SITEroute interne dans le système autonome local
RT_SCOPE_LINKroute sur ce lien
RT_SCOPE_HOSTroute sur l'hôte local
RT_SCOPE_NOWHEREdestination inexistante

Les valeurs entre RT_SCOPE_UNIVERSE et RT_SCOPE_SITE sont disponibles pour l'utilisateur.

Le champ rtm_flags prend les significations suivantes :
RTM_F_NOTIFYsi la route change, notifier l'utilisateur à l’aide de rtnetlink
RTM_F_CLONEDla route est clonée depuis une autre route
RTM_F_EQUALIZErépartiteur multichemin (pas encore implémenté)

rtm_table indique la table de routage

RT_TABLE_UNSPECtable de routage non spécifiée
RT_TABLE_DEFAULTtable par défaut
RT_TABLE_MAINtable principale
RT_TABLE_LOCALtable locale

L'utilisateur peut affecter à son gré les valeurs entre RT_TABLE_UNSPEC et RT_TABLE_DEFAULT.

Attributs
rta_typeType de valeurDescription
RTA_UNSPEC-ignoré
RTA_DSTadresse de protocoleadresse de destination de la route
RTA_SRCadresse de protocoleadresse de source de la route
RTA_IIFintindice de l’interface d'entrée
RTA_OIFintindice de l’interface de sortie
RTA_GATEWAYadresse de protocolepasserelle de la route
RTA_PRIORITYintpriorité de la route
RTA_PREFSRCadresse de protocoleadresse de la route préférée
RTA_METRICSintmétrique de la route
RTA_MULTIPATHdonnées multichemin nexthop (voir ci-dessous)
RTA_PROTOINFOabandonné
RTA_FLOWintdomaine de route
RTA_CACHEINFOstruct rta_cacheinfo(voir linux/rtnetlink.h)
RTA_SESSIONabandonné
RTA_MP_ALGOabandonné
RTA_TABLEintID de table de routage ; si défini rtm_table est ignoré
RTA_MARKint
RTA_MFC_STATSstruct rta_mfc_stats(voir linux/rtnetlink.h)
RTA_VIAstruct rtviapasserelle dans un AF différent (voir ci-dessous)
RTA_NEWDSTadresse de protocolemodification adresse de destination de paquet
RTA_PREFcharpréférence de routeur IPv6 RFC4191 (voir ci-dessous)
RTA_ENCAP_TYPEshorttype d’encapsulation pour lwtunnels (voir ci-dessous)
RTA_ENCAPdéfini par RTA_ENCAP_TYPE
RTA_EXPIRESintdélai d’expiration de routes IPv6 (en seconde)
RTA_MULTIPATH contient plusieurs instances groupées de struct rtnexthop avec des RTA imbriqués (RTA_GATEWAY) :

struct rtnexthop {
unsigned short rtnh_len; /* Long. de struct. + long.
de RTA */
unsigned char rtnh_flags; /* Indicateurs (voir
linux/rtnetlink.h) */
unsigned char rtnh_hops; /* Priorité nexthop */
int rtnh_ifindex; /* Indice interface pour
ce nexthop */}

Il existe un tas de macros RTNH_* similaires aux macros RTA_* et NLHDR_* utiles pour gérer ces structures.

struct rtvia {
unsigned short rtvia_family;
unsigned char rtvia_addr[0];};

rtvia_addr est l’adresse, rtvia_family est son type de famille.
RTA_PREF peut contenir les valeurs ICMPV6_ROUTER_PREF_LOW, ICMPV6_ROUTER_PREF_MEDIUM et ICMPV6_ROUTER_PREF_HIGH définies dans <linux/icmpv6.h>.
RTA_ENCAP_TYPE peut contenir les valeurs LWTUNNEL_ENCAP_MPLS, LWTUNNEL_ENCAP_IP, LWTUNNEL_ENCAP_ILA ou LWTUNNEL_ENCAP_IP6 définies dans <linux/lwtunnel.h>.
Fournissez ces valeurs !
Ajouter, supprimer ou obtenir des informations sur le voisinage d'un élément de table (p.ex. : une entrée ARP). Le message contient une structure ndmsg.
struct ndmsg {
unsigned char ndm_family;
int ndm_ifindex; /* Indice d’interface */
__u16 ndm_state; /* État */
__u8 ndm_flags; /* Indicateurs */
__u8 ndm_type;};struct nda_cacheinfo {
__u32 ndm_confirmed;
__u32 ndm_used;
__u32 ndm_updated;
__u32 ndm_refcnt;};
ndm_state est un masque de bits des états suivants :
NUD_INCOMPLETEune entrée de cache en cours de résolution
NUD_REACHABLEune entrée de cache en vigueur confirmée
NUD_STALEune entrée de cache expirée
NUD_DELAYune entrée de cache en attente de temporisateur
NUD_PROBEune entrée de cache en cours d’examen
NUD_FAILEDune entrée de cache non valable
NUD_NOARPun périphérique sans cache de destination
NUD_PERMANENTune entrée statique

Les valeurs autorisées pour ndm_flags sont :

NTF_PROXYune entrée ARP de mandataire
NTF_ROUTERun routeur IPv6

La structure rtattr prend les significations suivantes pour le champ rta_type :

NDA_UNSPECtype inconnu
NDA_DSTune adr. de dest. de la couche de réseau du cache de voisinage
NDA_LLADDRune adresse de couche de liaison du cache de voisinage
NDA_CACHEINFOstatistiques sur le cache

Si le champ rta_type vaut NDA_CACHEINFO, alors un en-tête struct nda_cacheinfo suit.

Ajouter, supprimer ou rechercher une règle de routage. Utilise une struct rtmsg.
Ajouter, supprimer ou rechercher une discipline de file d'attente. Le message contient une structure struct tcmsg qui peut être suivie par une série d'attributs.
struct tcmsg {
unsigned char tcm_family;
int tcm_ifindex; /* Indice d’interface */
__u32 tcm_handle; /* Gestion qdisc */
__u32 tcm_parent; /* Qdisc parent */
__u32 tcm_info;};
Attributs
rta_typeType de valeurDescription
TCA_UNSPEC-non précisé
TCA_KINDchaîne ASCIIZnom de la discipline de file d'attente
TCA_OPTIONSséquence d’octetsoptions spécifiques qdisc suivent
TCA_STATSstruct tc_statsstatistiques qdisc
TCA_XSTATSspécifique qdiscstatistiques spécifiques au module
TCA_RATEstruct tc_estimatorlimite de taux

De plus, d'autres attributs spécifiques au module Qdisc sont possibles. Pour plus d'informations, voir les fichiers d'en-tête appropriés.

Ajouter, supprimer ou rechercher une classe de trafic. Ces messages contiennent une struct tcmsg décrite plus haut.
Ajouter, supprimer ou obtenir des informations sur un filtre de trafic. Ces messages contiennent une struct tcmsg décrite plus haut.

rtnetlink est une nouveauté de Linux 2.2.

Cette page de manuel est incomplète.

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

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <[email protected]>, Thierry Vignaud <[email protected]>, François Micaux, Alain Portal <[email protected]>, Jean-Philippe Guérard <[email protected]>, Jean-Luc Coulon (f5ibh) <[email protected]>, Julien Cristau <[email protected]>, Thomas Huriaux <[email protected]>, Nicolas François <[email protected]>, Florentin Duneau <[email protected]>, Simon Paillard <[email protected]>, Denis Barbier <[email protected]>, David Prévot <[email protected]> et Jean-Paul Guillonneau <[email protected]>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à [email protected].

15 décembre 2022Pages du manuel de Linux 6.03