Loading

NOM

       packet, AF_PACKET - Interface par paquet au niveau périphérique.

SYNOPSIS

       #include <sys/socket.h>
       #include <netpacket/packet.h>
       #include <net/ethernet.h> /* protocoles L2 */

       packet_socket = socket(AF_PACKET, int socket_type, int protocol);

       Les sockets packets sont utilisées pour envoyer ou recevoir des paquets
       de données bruts au  pilote  de  périphérique  (Niveau  OSI  2).  Elles
       permettent   d’implémenter   des   modules   protocoles  dans  l’espace
       utilisateur au dessus du niveau physique.

       L’argument socket_type est soit  SOCK_RAW  pour  les  paquets  incluant
       l’en-tête  du niveau liaison, soit SOCK_DGRAM pour les paquets préparés
       sans l’en-tête de la couche liaison. Les informations de  l’en-tête  du
       niveau   liaison   sont   disponibles   dans   un  format  commun,  par
       l’intermédiaire d’un sockaddr_ll. protocol est un numéro  de  protocole
       IEEE 802.3 dans l’ordre des octets du réseau. Voir le fichier d’en-tête
       <linux/if_ether.h> pour  avoir  une  liste  des  protocoles  autorisés.
       Lorsque   le   numéro  demandé  est  htons(ETH_P_ALL)  alors  tous  les
       protocoles sont reçus. Tous les paquets entrants du  protocole  indiqué
       seront  passés  à la socket packet avant d’être transmis aux protocoles
       implémentés dans le noyau.

       Seuls les processus avec un UID effectif nul ou la capacité CAP_NET_RAW
       peuvent ouvrir des sockets packet.

       Les paquets des sockets SOCK_RAW sont transmis depuis et vers le pilote
       de périphérique sans aucune modification des données des paquets.  Lors
       de  la  réception,  l’adresse est toujours examinée et fournie dans une
       structure standard sockaddr_ll. Lors  de  l’émission  d’un  paquet,  le
       tampon  fourni  par  l’utilisateur  doit  contenir  l’en-tête du niveau
       physique.  Le  paquet  est  alors  mis  en  file  sans  modification  à
       l’attention  du  pilote  de  périphérique  correspondant  à l’interface
       définie par l’adresse de destination. Certains pilotes de  périphérique
       ajoutent  toujours  d’autres  en-têtes. SOCK_RAW est similaire mais non
       compatible avec l’ancien AF_INET/SOCK_PACKET de Linux 2.0.

       SOCK_DGRAM opère à un niveau légèrement plus élevé. L’en-tête du niveau
       physique   est  supprimé  avant  que  le  paquet  ne  soit  transmis  à
       l’utilisateur. Les paquets envoyés par  une  socket  packet  SOCK_DGRAM
       reçoivent  un  en-tête  de  niveau  physique  correct,  en fonction des
       informations dans l’adresse destination sockaddr_ll avant d’être mis en
       file.

       Par défaut, tous les paquets du type de protocole indiqué sont passés à
       la socket packet. Pour ne recevoir  que  les  paquets  d’une  interface
       donnée,  utilisez  bind(2)  en  indiquant  une  adresse dans une struct
       sockaddr_ll pour attacher la socket à une interface. Seuls  les  champs
       d’adresse sll_protocol et sll_ifindex sont utilisés pour l’attachement.

       L’opération connect(2) n’est pas  prise  en  charge  avec  les  sockets
       packet.

       Lorsque  l’attribut  MSG_TRUNC  est  transmis  à  recvmsg(2),  recv(2),
       recvfrom(2) la véritable longueur du paquet sur le réseau est  toujours
       renvoyée, même si elle est plus grande que le tampon.

   Types dadresses
       La  structure  sockaddr_ll est une adresse du niveau physique dépendant
       du périphérique.

           struct sockaddr_ll {
               unsigned short sll_family;   /* Toujours AF_PACKET */
               unsigned short sll_protocol; /* Protocole niveau physique */
               int            sll_ifindex;  /* Numéro d’interface */
               unsigned short sll_hatype;   /* Type d’en-tête */
               unsigned char  sll_pkttype;  /* Type de paquet */
               unsigned char  sll_halen;    /* Longueur de l’adresse */
               unsigned char  sll_addr[8];  /* Adresse niveau physique */
           };

       sll_protocol est le type de protocole standard ethernet,  dans  l’ordre
       des   octets   du  réseau,  comme  défini  dans  le  fichier  d’en-tête
       <linux/if_ether.h>. Par défaut il s’agit du  protocole  de  la  socket.
       sll_ifindex  est  le  numéro  de  l’interface  (voir  netdevice(7));  0
       correspond à  n’importe  quelle  interface  (autorisé  uniquement  pour
       l’attachement).  sll_hatype  est  un  type  ARP,  comme  défini dans le
       fichier d’en-tête <linux/if_arp.h>. Le champ  sll_pkttype  contient  le
       type  de  paquet.  Les  types  valides  sont PACKET_HOST pour un paquet
       destiné à l’hôte local, PACKET_BROADCAST pour un  paquet  broadcast  du
       niveau  physique,  PACKET_MULTICAST pour un paquet envoyé à une adresse
       multicast du niveau physique, PACKET_OTHERHOST pour un paquet destiné à
       un   autre   hôte  capturé  par  un  pilote  de  périphérique  en  mode
       promiscuous, et PACKET_OUTGOING pour  un  paquet  provenant  de  l’hôte
       local  rebouclé  sur une socket packet. Ceci n’a de signification qu’en
       réception.  sll_addr  et  sll_halen  contiennent  l’adresse  de  niveau
       physique  (par  exemple  IEEE  802.3)  et sa longueur. L’interprétation
       exacte dépend du périphérique.

       Lorsqu’on  envoie  des  paquets,  il  suffit   d’indiquer   sll_family,
       sll_addr,  sll_halen,  sll_ifindex.  Les autres champs devraient être à
       zéro.  sll_hatype  et  sll_pkttype  sont  remplis  en  réception   pour
       information. Pour l’attachement, seuls sll_protocol et sll_ifindex sont
       utilisés.

   Options de sockets
       Les  options  des  sockets  packets   permettent   de   configurer   le
       multicasting du niveau physique et le mode promiscuous. Cela fonctionne
       en appelant setsockopt(2) sur une  socket  packet  avec  SOL_PACKET  et
       l’option   PACKET_ADD_MEMBERSHIP   pour   ajouter   un  attachement  ou
       PACKET_DROP_MEMBERSHIP pour en supprimer un. Toutes les deux  attendent
       une structure packet_mreq en argument :

           struct packet_mreq {
               int            mr_ifindex;    /* Numéro d’interface */
               unsigned short mr_type;       /* Action */
               unsigned short mr_alen;       /* Longueur d’adresse */
               unsigned char  mr_address[8]; /* Adresse niveau physique */
           };

       mr_ifindex  contient  le numéro de l’interface dont le statut doit être
       modifié.  Le  paramètre   mr_type   indique   l’action   à   effectuer.
       PACKET_MR_PROMISC valide la réception de tous les paquets circulant sur
       le segment de réseau  commun  (souvent  appelé  « mode  promiscuous »),
       PACKET_MR_MULTICAST  attache  la  socket  au groupe multicast de niveau
       physique indiqué dans  mr_address  et  mr_alen,  et  PACKET_MR_ALLMULTI
       demande à la socket de recevoir tous les paquets multicast arrivant sur
       l’interface.

       De  plus,  les  ioctls   classiques   SIOCSIFFLAGS,   SIOCADDMULTI   et
       SIOCDELMULTI peuvent donner les mêmes résultats.

   Ioctls
       SIOCGSTAMP  peut  servir à obtenir l’horodatage du dernier paquet reçu.
       L’argument est une structure struct timeval.

       De plus, les ioctls standards définis dans  netdevice(7)  et  socket(7)
       sont valides sur les sockets packets.

   Traitement des erreurs
       Les  sockets  packets  ne  gèrent  pas  d’autres  erreurs que celles se
       produisant  durant  la  transmission   des   paquets   au   pilote   de
       périphérique. Elles ne traitent pas le concept de file d’erreurs.

ERREURS

       EADDRNOTAVAIL
              Adresse de groupe multicast inconnue.

       EFAULT Adresse mémoire invalide.

       EINVAL Argument invalide.

       EMSGSIZE
              Le paquet est plus grand que le MTU de l’interface.

       ENETDOWN
              L’interface n’est pas en marche.

       ENOBUFS
              Pas assez de mémoire pour le paquet.

       ENODEV Le  nom  du  prériphérique  ou  l’index  interface spécifié dans
              l’adresse de l’interface est inconnu.

       ENOENT Pas de paquet reçu.

       ENOTCONN
              Aucune adresse d’interface n’a été passée.

       ENXIO  Numéro d’interface non valable.

       EPERM  L’utilisateur  n’a   pas   les   privilèges   nécessaires   pour
              l’opération.

              De  plus, d’autres erreurs peuvent être engendrées par le pilote
              bas-niveau.

VERSIONS

       AF_PACKET  est  une  nouveauté  de  Linux  2.2.  Les   versions   Linux
       précédentes ne prenaient en charge que SOCK_PACKET.

       Le  fichier  d’inclusion  <netpacket/packet.h> existe depuis glibc 2.1.
       Les systèmes plus anciens ont besoin de :

           #include <asm/types.h>
           #include <linux/if_packet.h>
           #include <linux/if_ether.h>  /* Les protocoles L2 */

NOTES

       Pour la portabilité, il est conseillé  d’utiliser  les  fonctionnalités
       AF_PACKET  par l’intermédiaire de l’interface pcap(3); bien que cela ne
       couvre qu’un sous-ensembles des possibilités de AF_PACKET.

       Les sockets packet SOCK_DGRAM n’essayent pas de créer ou de traiter les
       en-têtes IEEE 802.2 LLC pour une trame IEEE 802.3. Lorsque le protocole
       ETH_P_802_3 est indiqué en émission, le noyau crée la  trame  802.3  et
       remplit  le champ de longueur. L’utilisateur doit fournir l’en-tête LLC
       pour obtenir un paquet entièrement conforme. Les paquets 802.3 entrants
       ne  sont  pas  multiplexés  sur les champs du protocole DSAP/SSAP. À la
       place, ils sont fournis à l’utilisateur sous le  protocole  ETH_P_802_2
       avec  un  en-tête  LLC  ajouté.  Il  n’est  donc  pas possible de faire
       d’attachement ETH_P_802_3 ; l’attachement ETH_P_802_2 doit être réalisé
       à  la  place,  et  le  multiplexage  de  protocole  doit  être  réalisé
       manuellement.   Le   comportement   par   défaut   en   émission    est
       l’encapsulation Ethernet DIX standard, avec le protocole renseigné.

       Les  sockets  packets  ne  sont pas soumises aux chaînes de firewall en
       entrée ou sortie.

   Compatibilité
       Sous Linux 2.0, la seule manière  d’obtenir  une  socket  packet  était
       l’appel socket(AF_INET, SOCK_PACKET, protocol). Ceci est encore pris en
       charge mais fortement déconseillé. La principale différence  entre  les
       deux   méthodes   est   que   SOCK_PACKET   utilise  l’ancienne  struct
       sockaddr_pkt pour  indiquer  l’interface,  ce  qui  ne  fournit  aucune
       indépendance vis-à-vis du niveau physique.

           struct sockaddr_pkt {
               unsigned short spkt_family;
               unsigned char  spkt_device[14];
               unsigned short spkt_protocol;
           };

       spkt_family contient le type de périphérique, spkt_protocol est le type
       de  protocole  IEEE  802.3  comme  défini  dans   <sys/if_ether.h>   et
       spkt_device  est  le  nom du périphérique sous forme de chaîne terminée
       par un caractère nul, par exemple eth0.

       Cette structure est obsolète et ne doit  pas  être  employée  dans  des
       nouveaux programmes.

BOGUES

       La  GlibC  2.1  ne définit pas la constante symbolique SOL_PACKET. Pour
       contourner ce problème, il est conseillé d’écrire :

           #ifndef SOL_PACKET
           #define SOL_PACKET 263
           #endif

       Ceci est corrigé dans les dernières versions  de  la  GlibC  et  ne  se
       produit pas sur les LibC5.

       La  gestion  des  en-têtes LLC IEEE 802.2/802.3 devrait être considérée
       comme un bogue.

       Les filtres des sockets ne sont pas documentés.

       L’extension MSG_TRUNC de  recvmsg(2)  est  une  bidouille  horrible  et
       devrait   être   remplacée  par  un  message  de  commande.  Il  n’y  a
       actuellement aucun moyen d’obtenir l’adresse de  destination  originale
       des paquets via SOCK_DGRAM.

VOIR AUSSI

       socket(2), pcap(3), capabilities(7), ip(7), raw(7), socket(7).

       RFC 894 pour l’encapsulation IP standard Ethernet.

       RFC 1700 pour l’encapsulation IP IEEE 802.3.

       Le  fichier  d’en-tête <linux/if_ether.h> pour les protocoles du niveau
       physique.

COLOPHON

       Cette page fait partie de  la  publication  3.23  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

       Cette  page  de  manuel  a  été  traduite et mise à jour par Christophe
       Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis  par
       Alain  Portal  <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
       disposition sur http://manpagesfr.free.fr/.

       Les mises à jour et corrections de la version présente dans Debian sont
       directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
       francophone de traduction de Debian.

       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> ».