Provided by: manpages-es_1.55-10_all bug

NOMBRE

       raw, SOCK_RAW - Conectores directos (raw) IPv4 de Linux

SINOPSIS

       #include <sys/socket.h>
       #include <netinet/in.h>
       raw_socket = socket(PF_INET, SOCK_RAW, int protocol);

DESCRIPCI'ON

       Los  conectores directos permiten implementar nuevos protocolos IPv4 en
       el espacio de usuario. Un conector directo recibe o envia el  datagrama
       crudo sin incluir cabeceras del nivel de enlace.

       La capa IPv4 genera una cabecera IP cuando se envia un paquete, a menos
       que se active la opcion IP_HDRINCL en el conector.  Cuando  se  activa,
       el  paquete debe contener una cabecera IP. En la recepcion, la cabecera
       IP siempre esta incluida en el paquete.

       Solo los procesos con un identificador de usuario efectivo de  0  o  la
       capacidad CAP_NET_RAW pueden abrir conectores directos.

       Todos  los  paquetes  o  errores cuyo protocolo coinciden con el numero
       protocol  especificado  por  el  conector  directo,  se  pasan  a  este
       conector.  Para  una lista de los protocolos permitidos vea los numeros
       asignados en RFC1700 y getprotobyname(3).

       Un protocolo IPPROTO_RAW implica que IP_HDRINCL esta activa y preparada
       para  enviar cualquier protocolo IP especificado en la cabecera pasada.
       Recibir todos los protocolos IP  via  IPPROTO_RAW  no  es  posible  con
       conectores directos.

       +-------------------------------------------------------------+
       |Campos de cabecera IP modificados en el envio por IP_HDRINCL |
       +-----------------------------+-------------------------------+
       |Suma de comprobacion IP      | Siempre se rellena.           |
       +-----------------------------+-------------------------------+
       |Direccion fuente             | Se rellena cuando es cero.    |
       +-----------------------------+-------------------------------+
       |Identificador del paquete    | Se rellena cuando es cero.    |
       +-----------------------------+-------------------------------+
       |Longitud total               | Siempre se rellena.           |
       +-----------------------------+-------------------------------+
       Si  se  especifica  IP_HDRINCL  y la cabecera IP tiene una direccion de
       destino distinta de cero, la  direccion  de  destino  del  conector  se
       utiliza  para  enrutar el paquete.  Cuando se especifica MSG_DONTROUTE,
       la direccion de destino debe referirse a  una  interfaz  local,  de  lo
       contrario,  se realiza una busqueda en la tabla de enrutamiento, aunque
       se ignoran las rutas que se dirigen a enrutadores.

       Si no se activa IP_HDRINCL, se pueden configurar  las  opciones  de  la
       cabecera  IP  de  los conectores directos con setsockopt(2).  Vea ip(7)
       para mas informacion.

       En Linux 2.2 todas las opciones y campos de las cabeceras IP se  pueden
       configurar usando las opciones de los conectores IP. Esto significa que
       los conectores directos son usualmente necesarios solo para  protocolos
       nuevos o protocolos que no tienen una interfaz de usuario (como ICMP).

       Cuando  se  recibe un paquete, se pasa a cualquier conector directo que
       haya sido asociado a su protocolo antes de que sea pasado al  manejador
       de  cualquier otro protocolo (por ejemplo, los modulos de protocolo del
       nucleo).

FORMATO DE LAS DIRECCIONES

       Los conectores directos usan  la  estructura  de  direcciones  estandar
       sockaddr_in  definida  en ip(7).  El campo sin_port se podria usar para
       especificar el numero de protocolo IP, pero en Linux 2.2 se  ignora  al
       enviar  y  siempre  deberia valer 0 (vea FALLOS).  Para los paquetes de
       entrada, a sin_port se le asigna el  protocolo  del  paquete.   Vea  el
       fichero cabecera <netinet/in.h> para protocolos IP validos.

OPCIONES DE LOS CONECTORES

       Las  opciones  de  los  conectores  directos  se  pueden configurar con
       setsockopt(2) y leer con getsockopt(2), pasando la  opcion  de  familia
       SOL_RAW.

       ICMP_FILTER
              Activa un filtro especial para los conectores directos asociados
              al protocolo IPPROTO_ICMP.  El valor tiene un  bit  activo  para
              cada tipo de mensaje ICMP que debe filtrarse. Por defecto, no se
              filtra ningun mensaje ICMP.

       Ademas, se soportan todas las opciones SOL_IP de ip(7) validas.

OBSERVACIONES

       Los conectores directos fragmentan un paquete cuando su longitud  total
       excede la MTU de la interfaz (no obstante, vea FALLOS). Una alternativa
       mas rapida y favorable para la red es implementar el descubrimiento del
       MTU  de  la  ruta  como  se  describe en la seccion IP_PMTU_DISCOVER de
       ip(7).

       Se puede asociar un conector directo a una direccion  local  especifica
       usando  la  llamada bind(2).  Si no esta asociado, se reciben todos los
       paquetes con el protocolo IP especificado. Ademas, se puede asociar  un
       conector   directo   a   un   dispositivo   de  red  especifico  usando
       SO_BINDTODEVICE.  Vea socket(7).

       Un conector IPPROTO_RAW es solo  de  envio.  Si  verdaderamente  quiere
       recibir  todos  los  paquetes  IP,  use  un  conector  packet(7) con el
       protocolo ETH_P_IP.  Dese cuenta que, a diferencia  de  los  conectores
       directos, los conectores de paquete no reensamblan fragmentos IP.

       Si  quiere  recibir  todos  los  paquetes  ICMP  para  un  conector  de
       datagramas, normalmente  es  mejor  usar  IP_RECVERR  en  ese  conector
       particular. Vea ip(7).

       Los  conectores  directos pueden interceptar todos los protocolos IP de
       Linux, incluso protocolos como ICMP o  TCP  que  poseen  un  modulo  de
       protocolo  dentro del nucleo. En este caso, los paquetes se pasan tanto
       al modulo del nucleo como al conector (o  conectores)  directo.  No  se
       deberia confiar en esto en programas transportables ya que muchas otras
       implementaciones de conectores BSD tienen limitaciones aqui.

       Linux nunca cambia las cabeceras pasadas por  el  usuario  (salvo  para
       rellenar  algunos campos de valor 0 como se ha descrito en IP_HDRINCL).
       Esto es  diferente  de  muchas  otras  implementaciones  de  conectores
       directos.

       Generalmente,   los  conectores  directos  son  poco  transportables  y
       deberian evitarse en programas destinados a ser transportables.

       En el envio a  traves  de  conectores  directos  se  deberia  tomar  el
       protocolo  IP  de  sin_port.  Esta capacidad se perdio en Linux 2.2. La
       forma de solucionar esto es usar IP_HDRINCL.

MANEJO DE ERRORES

       Solo se pasan al usuario los errores generados por  la  red  cuando  el
       conector  esta  conectado  o  esta  activa  la opcion IP_RECVERR.  Para
       conectores  conectados,  solo  se   pasan   EMSGSIZE   y   EPROTO   por
       compatibilidad.  Con  IP_RECVERR todos los errores de red se guardan en
       la cola de errores.

ERRORES

       EMSGSIZE
              Paquete demasiado grande. O bien el descubrimiento del MTU de la
              ruta  esta activo (la opcion IP_PMTU_DISCOVER de los conectores)
              o bien el tamano del paquete excede el  maximo  tamano  de  64KB
              permitido por IPv4.

       EACCES El  usuario  ha intentado enviar a una direccion de difusion sin
              tener activa la opcion de difusion en el conector.

       EPROTO Ha  llegado  un  error  ICMP  informando  de  un   problema   de
              parametros.

       EFAULT Se ha pasado una direccion de memoria invalida.

       EOPNOTSUPP
              Se  ha  pasado  a  la  llamada  socket una opcion invalida (como
              MSG_OOB).

       EINVAL Argumento invalido.

       EPERM  El usuario no tiene permiso para abrir conectores directos. Solo
              los  procesos con un identificador de usuario efectivo de 0 o el
              atributo CAP_NET_RAW pueden hacerlo.

VERSIONES

       IP_RECVERR y ICMP_FILTER son nuevos en la version 2.2 de  Linux.  Ambos
       son   extensiones   de   Linux   y  no  deberian  usarse  en  programas
       transportables.

       La version 2.0 de Linux activaba cierta compatibilidad  fallo  a  fallo
       con  BSD  en el codigo de los conectores directos cuando se activaba la
       opcion SO_BSDCOMPAT. Esto se ha eliminado en la version 2.2.

FALLOS

       No se han descrito las extensiones de proxy transparente.

       Cuando se activa la opcion IP_HDRINCL, los datagramas no se  fragmentan
       y estan limitados por la MTU de la interfaz.  Esta es una limitacion de
       la version 2.2 de Linux.

       La posibilidad de especificar el protocolo IP en  sin_port  durante  el
       envio  desaparecio  en Linux 2.2. Siempre se usa el protocolo al que se
       enlazo el conector o el que se  especifico  en  la  llamada  inicial  a
       socket(2).

AUTOR

       Esta pagina de manual fue escrita por Andi Kleen.

V'EASE TAMBI'EN

       ip(7), socket(7), recvmsg(2), sendmsg(2)

       RFC1191 para el descubrimiento del MTU de la ruta.

       RFC791 y el fichero cabecera <linux/ip.h> para el protocolo IP.

Pagina man de Linux             2 octubre 1998                          RAW(7)