ipv6(7) Miscellaneous Information Manual ipv6(7) NOM ipv6 - Implementation Linux du protocole IPv6 SYNOPSIS #include #include tcp6_socket = socket(AF_INET6, SOCK_STREAM, 0); raw6_socket = socket(AF_INET6, SOCK_RAW, protocole); udp6_socket = socket(AF_INET6, SOCK_DGRAM, protocole); DESCRIPTION Linux 2.2 implemente en option le protocole internet version 6 (IPv6). Cette page de manuel contient la description de l'API IPv6 de base, telle qu'implementee dans le noyau Linux et la glibc 2.1 L'interface est basee sur l'interface des sockets BSD. Consultez socket(7). L'API IPv6 est concue pour etre essentiellement compatible avec l'API IPv4 (consultez ip(7)). Seules les differences sont decrites dans cette page de manuel. Pour attacher un socket AF_INET6, l'adresse locale doit etre copiee dans une variable in6addr_any qui a le type in6_addr. Dans les initialisations statiques, IN6ADDR_ANY_INIT peut servir aussi et se developpe en une expression constante. Toutes les valeurs sont dans l'ordre des octets du reseau. L'adresse de boucle IPv6 (::1) est disponible dans la variable globale in6addr_loopback. Pour les initialisations, on doit utiliser IN6ADDR_LOOPBACK_INIT. Les connexions IPv4 peuvent etre traitees avec l'API v6 en utilisant le type d'adresse v4-projete-dans-v6. Ainsi un programme n'a qu'un seul type d'API a utiliser pour prendre en charge les deux protocoles. C'est gere de maniere transparente par les fonctions d'adressage de la bibliotheque C. IPv4 et IPv6 partagent l'espace des ports locaux. Lorsqu'une connexion ou un paquet IPv4 est obtenu sur un socket IPv6, son adresse source sera projetee en v6. Formats d'adresse struct sockaddr_in6 { sa_family_t sin6_family; /* AF_INET6 */ in_port_t sin6_port; /* numero de port */ uint32_t sin6_flowinfo; /* information de flux IPv6 */ struct in6_addr sin6_addr; /* adresse IPv6 */ uint32_t sin6_scope_id; /* Scope ID (nouveau dans Linux 2.4) */ }; struct in6_addr { unsigned char s6_addr[16]; /* adresse IPv6 */ }; sin6_family est toujours rempli avec AF_INET6 ; sin6_port est le port du protocole (consultez sin_port dans ip(7)) ; sin6_flowinfo est l'identificateur de flux IPv6, sin6_addr est l'adresse IPv6 sur 128 bits. sin6_scope_id est un identificateur qui depend de la portee de l'adresse. C'est une nouveaute Linux 2.4. Linux ne le prend en charge que pour les adresses locales lien, dans ce cas sin6_scope_id contient le numero d'interface (consultez netdevice(7)). IPv6 prend en charge plusieurs types d'adresses : unicast pour representer un hote unique, multicast pour un groupe d'hotes, anycast pour indiquer le membre le plus proche d'un groupe d'hotes (non implemente sous Linux), IPv4-on-IPv6 pour un hote IPv4 et d'autres types d'adresse reserves. La notation d'adresse pour l'IPv6 est un groupe de 8 nombres hexadecimaux sur 4 chiffres, separes par un deux-points << : >>. Un << :: >> represente une chaine de bits 0. Les adresses speciales sont ::1 pour le bouclage loopback et ::FFFF: pour les projections d'adresses IPv4 sur l'IPv6. L'espace des ports de l'IPv6 est partage avec l'IPv4. Options de socket IPv6 accepte quelques options des sockets specifiques du protocole, qui peuvent etre definies avec setsockopt(2) et consultees avec getsockopt(2). Le niveau d'option de socket pour l'IPv6 est IPPROTO_IPV6. Un entier booleen est faux quand il est nul et vrai sinon. IPV6_ADDRFORM Transformer un socket AF_INET6 en un socket d'une famille d'adresse differente. Seul AF_INET est actuellement pris en charge pour cela. Cela n'est autorise que pour les sockets IPv6 connectes et attaches a une adresse v4-sur-v6. L'argument est un pointeur sur un entier contenant AF_INET. Cela est utile pour passer des sockets projetes en v4 comme descripteurs a des programmes ne sachant pas manipuler l'API IPv6. IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP Determiner l'appartenance aux groupes multicast. L'argument est un pointeur sur une structure struct ipv6_mreq. IPV6_MTU getsockopt() : recuperer la MTU du chemin actuellement determinee pour le socket. Valable seulement quand le socket a ete connecte. Renvoie un entier. setsockopt() : definir le MTU a utiliser pour le socket. Le MTU est limite par celui du peripherique ou celui du chemin lorsque la recherche du MTU par chemin est activee. L'argument est un pointeur sur un entier. IPV6_MTU_DISCOVER Commander la recherche du MTU du chemin sur le socket. Consultez l'option IP_MTU_DISCOVER dans ip(7) pour plus de precisions. IPV6_MULTICAST_HOPS Definir la limite du nombre de sauts (hops) multicast du socket. L'argument est un pointeur sur un entier. La valeur -1 correspond a la valeur par defaut de routage, sinon il doit s'agir d'un entier entre 0 et 255. IPV6_MULTICAST_IF Definir le peripherique pour les paquets multicast sortants du socket. Ce n'est permis que pour les sockets SOCK_DGRAM et SOCK_RAW. L'argument est un pointeur sur un numero d'interface (consultez netdevice(7)) dans un entier. IPV6_MULTICAST_LOOP Determiner si le socket voit les paquets multicast qu'il a lui-meme emis. L'argument est un pointeur sur une valeur booleenne. IPV6_RECVPKTINFO (depuis Linux 2.6.14) Definir la distribution des messages de controle IPV6_PKTINFO des datagrammes entrants. Ce type de messages de controle contient une struct in6_pktinfo, conformement a la RFC 3542. Uniquement autorise pour les sockets SOCK_DGRAM ou SOCK_RAW. L'argument est un pointeur sur une valeur booleenne dans un entier. IPV6_RTHDR, IPV6_AUTHHDR, IPV6_DSTOPTS, IPV6_HOPOPTS, IPV6_FLOWINFO, IPV6_HOPLIMIT Definir la distribution des messages de controle des datagrammes entrants contenant les en-tetes d'extensions du paquet recu. IPV6_RTHDR delivre l'en-tete de routage, IPV6_AUTHHDR delivre l'en-tete d'authentification, IPV6_DSTOPTS delivre les options de destination, IPV6_HOPOPTS delivre les options de saut, IPV6_FLOWINFO delivre un entier contenant l'identificateur de flux, IPV6_HOPLIMIT delivre un entier contenant le nombre de sauts du paquet. Les messages de controle ont le meme type que l'option de socket. Toutes ces options d'en-tete peuvent aussi etre definies pour les paquets sortants en mettant le message de controle approprie dans le tampon de controle de sendmsg(2). Uniquement autorise pour les sockets SOCK_DGRAM ou SOCK_RAW. L'argument est un pointeur sur une valeur booleenne. IPV6_RECVERR Commander la reception des erreurs asynchrones. Consultez IP_RECVERR dans ip(7) pour plus de precisions. L'argument est un pointeur sur un booleen. IPV6_ROUTER_ALERT Passer sur ce socket tous les paquets rediriges (forwarded) contenant une option << hop-by-hop >> d'alerte du routeur. Uniquement autorise pour les sockets SOCK_RAW. Les paquets exploites ne sont pas rediriges par le noyau, il est de la responsabilite de l'utilisateur de les renvoyer. L'argument est un pointeur vers un entier. Un entier positif indique une valeur option d'alerte du routeur a intercepter. Les paquets portant une option d'alerte du routeur avec un champ de valeur contenant cet entier sera delivre au socket. Un entier negatif desactive la delivrance de packets avec des options d'alerte du routeur a ce socket. IPV6_UNICAST_HOPS Definir la limite du nombre de sauts (hops) unicast pour le socket. L'argument est un pointeur sur un entier. La valeur -1 correspond a la valeur par defaut de routage, sinon il doit s'agir d'un entier entre 0 et 255. IPV6_V6ONLY (depuis Linux 2.4.21 et 2.6) Quand cet attribut est positionne (different de zero), alors le socket est limite a l'emission et la reception de paquets IPv6. Dans ce cas, une application IPv4 et IPv6 peuvent s'associer a un meme port en meme temps. Si cet attribut n'est pas positionne (zero), alors le socket peut etre utilise pour emettre ou recevoir des paquets depuis et vers une adresse IPv6 ou une projections d'adresse IPv4 sur IPv6. Le parametre est un pointeur vers un booleen dans un entier. La valeur par defaut de cet attribut est defini par le contenu du fichier /proc/sys/net/ipv6/bindv6only. La valeur par defaut de ce fichier est 0 (desactive). ERREURS ENODEV L'utilisateur a essaye de lier avec bind(2) sur une adresse locale lien IPv6, mais le sin6_scope_id de la structure sockaddr_in6 fournie n'est pas un numero d'interface valable. VERSIONS Linux 2.4 rompt la compatibilite binaire pour la structure sockaddr_in6 des hotes sur 64 bits, en modifiant l'alignement de in6_addr et en ajoutant un champ sin6_scope_id supplementaire. Les interfaces du noyau restent compatible, mais un programme contenant des sockaddr_in6 ou des in6_addr dans d'autres structures ne l'est peut etre pas. Ce n'est pas un probleme pour les hotes sur 32 bits comme les i386. Le champ sin6_flowinfo est une nouveaute Linux 2.4. Il est ecrit/lu de maniere transparente par le noyau quand la longueur de l'adresse passee le contient. Certains programmes qui passent un tampon d'adresse plus long et verifient ensuite la longueur de l'adresse renvoyee peuvent echouer. NOTES La structure sockaddr_in6 est plus grande que la structure sockaddr generique. Les programmes qui supposent que tous les types d'adresses peuvent etre stockes dans une struct sockaddr doivent etre modifies pour utiliser struct sockaddr_storage a la place. SOL_IP, SOL_IPV6, SOL_ICMPV6 et d'autres options de socket SOL_* sont des variantes non portables de IPPROTO_*. Voir aussi ip(7). BOGUES L'API IPv6 etendue, telle que dans la RFC 2292, n'est encore que partiellement implementee. Bien que les noyaux 2.2 ont une prise en charge pratiquement complete des options de reception, les macros declarant les options IPv6 manquent dans la glibc 2.1. La prise en charge IPSec pour les en-tetes EH et AH manque. La gestion des etiquettes de flux n'est pas complete, ni documentee ici. Cette page de manuel n'est pas complete. VOIR AUSSI cmsg(3), ip(7) RFC 2553 : API IPv6 de base, avec laquelle Linux essaye d'etre compatible. RFC 2460 : specifications d'IPv6. TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 ipv6(7)