Provided by:
manpages-es_1.55-10_all 
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)