Provided by: manpages-fr_3.32d0.2p4-1_all bug

NOM

       packet, AF_PACKET - Interface par paquet au niveau peripherique

SYNOPSIS

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

       packet_socket = socket(AF_PACKET, int type_socket, int protocole);

DESCRIPTION

       Les sockets packets sont utilisees pour envoyer ou recevoir des paquets
       de donnees bruts au  pilote  de  peripherique  (Niveau  OSI  2).  Elles
       permettent   d'implementer   des   modules   protocoles  dans  l'espace
       utilisateur au dessus du niveau physique.

       L'argument type_socket est soit  SOCK_RAW  pour  les  paquets  incluant
       l'en-tete  du niveau liaison, soit SOCK_DGRAM pour les paquets prepares
       sans l'en-tete de la couche liaison. Les informations de  l'en-tete  du
       niveau   liaison   sont   disponibles   dans   un  format  commun,  par
       l'intermediaire d'un sockaddr_ll. protocole est un numero de  protocole
       IEEE 802.3  dans  l'ordre  des  octets  du reseau. Consultez le fichier
       d'en-tete  <linux/if_ether.h>  pour  avoir  une  liste  des  protocoles
       autorises.  Lorsque  le  numero demande est htons(ETH_P_ALL) alors tous
       les protocoles sont recus.  Tous  les  paquets  entrants  du  protocole
       indique  seront  passes  a  la  socket packet avant d'etre transmis aux
       protocoles implementes dans le noyau.

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

       Les paquets des sockets SOCK_RAW sont transmis depuis et vers le pilote
       de peripherique sans aucune modification des donnees des paquets.  Lors
       de  la  reception,  l'adresse est toujours examinee et fournie dans une
       structure standard sockaddr_ll. Lors  de  l'emission  d'un  paquet,  le
       tampon  fourni  par  l'utilisateur  doit  contenir  l'en-tete du niveau
       physique.  Le  paquet  est  alors  mis  en  file  sans  modification  a
       l'attention  du  pilote  de  peripherique  correspondant  a l'interface
       definie par l'adresse de destination. Certains pilotes de  peripherique
       ajoutent  toujours  d'autres  en-tetes. SOCK_RAW est similaire mais non
       compatible avec l'ancien AF_INET/SOCK_PACKET de Linux 2.0.

       SOCK_DGRAM opere a un niveau legerement plus eleve. L'en-tete du niveau
       physique   est  supprime  avant  que  le  paquet  ne  soit  transmis  a
       l'utilisateur. Les paquets envoyes par  une  socket  packet  SOCK_DGRAM
       recoivent  un  en-tete  de  niveau  physique  correct,  en fonction des
       informations dans l'adresse destination sockaddr_ll avant d'etre mis en
       file.

       Par defaut, tous les paquets du type de protocole indique sont passes a
       la socket packet. Pour ne recevoir  que  les  paquets  d'une  interface
       donnee,  utilisez  bind(2)  en  indiquant  une  adresse dans une struct
       sockaddr_ll pour attacher la socket a une interface. Seuls  les  champs
       d'adresse sll_protocol et sll_ifindex sont utilises pour l'attachement.

       L'operation  connect(2)  n'est  pas  prise  en  charge avec les sockets
       packet.

       Lorsque  l'attribut  MSG_TRUNC  est  transmis  a  recvmsg(2),  recv(2),
       recvfrom(2)  la veritable longueur du paquet sur le reseau est toujours
       renvoyee, meme si elle est plus grande que le tampon.

   Types d'adresses
       La structure sockaddr_ll est une adresse du niveau  physique  dependant
       du peripherique.

           struct sockaddr_ll {
               unsigned short sll_family;   /* Toujours AF_PACKET */
               unsigned short sll_protocol; /* Protocole niveau physique */
               int            sll_ifindex;  /* Numero d'interface */
               unsigned short sll_hatype;   /* Type d'en-tete */
               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  reseau,  comme  defini  dans  le   fichier   d'en-tete
       <linux/if_ether.h>.  Par  defaut  il  s'agit du protocole de la socket.
       sll_ifindex est le numero de l'interface  (consultez  netdevice(7));  0
       correspond  a  n'importe  quelle  interface  (autorise  uniquement pour
       l'attachement). sll_hatype est  un  type  ARP,  comme  defini  dans  le
       fichier  d'en-tete  <linux/if_arp.h>.  Le champ sll_pkttype contient le
       type de paquet. Les types  valides  sont  PACKET_HOST  pour  un  paquet
       destine  a  l'hote  local, PACKET_BROADCAST pour un paquet broadcast du
       niveau physique, PACKET_MULTICAST pour un paquet envoye a  une  adresse
       multicast du niveau physique, PACKET_OTHERHOST pour un paquet destine a
       un  autre  hote  capture  par  un  pilote  de  peripherique   en   mode
       promiscuous,  et  PACKET_OUTGOING  pour  un  paquet provenant de l'hote
       local reboucle sur une socket packet. Ceci n'a de  signification  qu'en
       reception.  sll_addr  et  sll_halen  contiennent  l'adresse  de  niveau
       physique (par exemple  IEEE 802.3)  et  sa  longueur.  L'interpretation
       exacte depend du peripherique.

       Lorsqu'on   envoie   des  paquets,  il  suffit  d'indiquer  sll_family,
       sll_addr, sll_halen, sll_ifindex. Les autres champs  devraient  etre  a
       zero.   sll_hatype  et  sll_pkttype  sont  remplis  en  reception  pour
       information. Pour l'attachement, seuls sll_protocol et sll_ifindex sont
       utilises.

   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;    /* Numero 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 numero de l'interface dont le statut  doit  etre
       modifie.   Le   parametre   mr_type   indique   l'action  a  effectuer.
       PACKET_MR_PROMISC valide la reception de tous les paquets circulant sur
       le  segment  de  reseau commun (souvent appele << mode promiscuous >>),
       PACKET_MR_MULTICAST attache la socket au  groupe  multicast  de  niveau
       physique  indique  dans  mr_address  et  mr_alen, et PACKET_MR_ALLMULTI
       demande a la socket de recevoir tous les paquets multicast arrivant sur
       l'interface.

       De   plus,   les   ioctls   classiques  SIOCSIFFLAGS,  SIOCADDMULTI  et
       SIOCDELMULTI peuvent donner les memes resultats.

   Ioctls
       SIOCGSTAMP peut servir a obtenir l'horodatage du dernier  paquet  recu.
       L'argument est une structure struct timeval.

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

   Traitement des erreurs
       Les sockets packets ne  gerent  pas  d'autres  erreurs  que  celles  se
       produisant   durant   la   transmission   des   paquets  au  pilote  de
       peripherique. Elles ne traitent pas le concept de file d'erreurs.

ERREURS

       EADDRNOTAVAIL
              Adresse de groupe multicast inconnue.

       EFAULT Adresse memoire 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 memoire pour le paquet.

       ENODEV Le nom du  preripherique  ou  l'index  interface  specifie  dans
              l'adresse de l'interface est inconnu.

       ENOENT Pas de paquet recu.

       ENOTCONN
              Aucune adresse d'interface n'a ete passee.

       ENXIO  Numero d'interface non valable.

       EPERM  L'utilisateur   n'a   pas   les   privileges   necessaires  pour
              l'operation.

              De plus, d'autres erreurs peuvent etre engendrees par le  pilote
              bas-niveau.

VERSIONS

       AF_PACKET   est   une   nouveaute  de  Linux 2.2.  Les  versions  Linux
       precedentes ne prenaient en charge que SOCK_PACKET.

       Le fichier d'inclusion <netpacket/packet.h>  existe  depuis  glibc 2.1.
       Les systemes 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  portabilite,  il est conseille d'utiliser les fonctionnalites
       AF_PACKET par l'intermediaire de l'interface pcap(3); bien que cela  ne
       couvre qu'un sous-ensembles des possibilites de AF_PACKET.

       Les sockets packet SOCK_DGRAM n'essayent pas de creer ou de traiter les
       en-tetes IEEE 802.2 LLC pour une trame IEEE 802.3. Lorsque le protocole
       ETH_P_802_3  est  indique  en emission, le noyau cree la trame 802.3 et
       remplit le champ de longueur. L'utilisateur doit fournir l'en-tete  LLC
       pour obtenir un paquet entierement conforme. Les paquets 802.3 entrants
       ne sont pas multiplexes sur les champs du  protocole  DSAP/SSAP.  A  la
       place,  ils  sont fournis a l'utilisateur sous le protocole ETH_P_802_2
       avec un en-tete LLC  ajoute.  Il  n'est  donc  pas  possible  de  faire
       d'attachement ETH_P_802_3 ; l'attachement ETH_P_802_2 doit etre realise
       a  la  place,  et  le  multiplexage  de  protocole  doit  etre  realise
       manuellement.    Le   comportement   par   defaut   en   emission   est
       l'encapsulation Ethernet DIX standard, avec le protocole renseigne.

       Les sockets packets ne sont pas soumises aux  chaines  de  firewall  en
       entree ou sortie.

   Compatibilit'e
       Sous  Linux 2.0,  la  seule  maniere  d'obtenir une socket packet etait
       l'appel socket(AF_INET, SOCK_PACKET, protocole). Ceci est  encore  pris
       en  charge  mais  fortement deconseille. La principale difference entre
       les  deux  methodes  est  que  SOCK_PACKET  utilise  l'ancienne  struct
       sockaddr_pkt  pour  indiquer  l'interface,  ce  qui  ne  fournit aucune
       independance vis-a-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 peripherique, spkt_protocol est le type
       de   protocole   IEEE 802.3   comme  defini  dans  <sys/if_ether.h>  et
       spkt_device est le nom du peripherique sous forme  de  chaine  terminee
       par un caractere nul, par exemple eth0.

       Cette  structure  est  obsolete  et  ne doit pas etre employee dans des
       nouveaux programmes.

BOGUES

       La glibc 2.1 ne definit pas la constante  symbolique  SOL_PACKET.  Pour
       contourner ce probleme, il est conseille d'ecrire :

           #ifndef SOL_PACKET
           #define SOL_PACKET 263
           #endif

       Ceci  est  corrige  dans  les  dernieres  versions de la glibc et ne se
       produit pas sur les LibC5.

       La gestion des en-tetes LLC IEEE 802.2/802.3  devrait  etre  consideree
       comme un bogue.

       Les filtres des sockets ne sont pas documentes.

       L'extension  MSG_TRUNC  de  recvmsg(2)  est  une  bidouille horrible et
       devrait  etre  remplacee  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-tete <linux/if_ether.h> pour les protocoles  du  niveau
       physique.

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.32 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       etre       trouvees      a      l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

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

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

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

       Vous  pouvez  toujours avoir acces a la version anglaise de ce document
       en utilisant la commande << man -L C <section> <page_de_man> >>.

Linux                             8 aout 2008                        PACKET(7)