NOMBRE¶
ip - Implementación Linux del protocolo IPv4
SINOPSIS¶
#include <sys/socket.h>
#include <netinet/in.h>
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
raw_socket = socket(PF_INET, SOCK_RAW, protocol);
udp_socket = socket(PF_INET, SOCK_DGRAM, protocol);
DESCRIPCIÓN¶
Linux implementa el Protocolo de Internet (Internet Protocol, IP), version 4,
descrito en RFC791 y RFC1122.
ip contiene una implementación de
multidestino del Nivel 2 según el RFC1112. También contiene un
enrutador IP incluyendo un filtro de paquetes.
La interfaz del programador es compatible con la de los conectores BSD. Para
más información sobre conectores, vea
socket(7).
Un conector IP se crea llamando a la función
socket(2) de la forma
socket(PF_INET, socket_type, protocol). Los tipos de conectores
válidos son
SOCK_STREAM para abrir un conector
tcp(7),
SOCK_DGRAM para abrir un conector
udp(7) o
SOCK_RAW para
abrir un conector directo (
raw(7)) para acceder al protocolo IP
directamente.
protocol es el protocolo IP en la cabecera IP a enviar o
recibir. Los únicos valores válidos para
protocol son
0 y
IPPROTO_TCP para conectores TCP, y
0 y
IPPROTO_UDP para conectores UDP. Para
SOCK_RAW debe especificar
un protocolo IP válido del IANA definido por uno de los números
asignados en el RFC1700.
Cuando un proceso quiere recibir nuevos paquetes de entrada o conexiones, debe
enlazar un conector a una dirección de la interfaz local usando
bind(2). Sólo se puede ligar un conector IP a un par
(dirección, puerto) dado. Cuando en la llamada a
bind se
especifica
INADDR_ANY, el conector será ligado a
todas
las interfaces locales. Cuando se llama a
listen(2) o
connect(2)
con un conector no enlazado, el conector será automáticamente
ligado a un puerto aleatorio libre cuya dirección local sea
INADDR_ANY. Una dirección local de conector TCP que haya sido
enlazada, no estará disponible durante un cierto tiempo después
de que se cierre, a menos que se haya activado la opción
SO_REUSEADDR. Se debe tener cuidado al usar esta opción ya que
hace que TCP sea menos fiable.
Una dirección de conector IP se define como una combinación de una
dirección de interfaz IP y un número de puerto. El protocolo IP
básico no proporciona números de puerto. Estos son implementados
por protocolos de un nivel más alto como
udp(7) y
tcp(7).
En los conectores directos, a
sin_port se le asigna el protocolo IP.
struct sockaddr_in {
sa_family_t sin_family; /* familia de direcciones:
AF_INET */
u_int16_t sin_port; /* puerto con los bytes en el
orden de red */
struct in_addr sin_addr; /* dirección de Internet */
};
/* Dirección de Internet. */
struct in_addr {
u_int32_t s_addr; /* dirección con los bytes en
el orden de red */
};
A
sin_family siempre se le asigna el valor
AF_INET. Este valor es
necesario. En Linux 2.2, la mayoría de las funciones de red devuelven
EINVAL cuando se ha omitido este valor.
sin_port contiene el
puerto con los bytes en orden de red. Los números de puerto por debajo
de 1024 se llaman
puertos reservados. Sólo los procesos con
identificador de usuario efectivo 0 o la capacidad
CAP_NET_BIND_SERVICE
pueden realizar enlaces mediante
bind(2) a estos conectores. Dese
cuenta que el protocolo IPv4 puro no posee como tal el concepto de puerto.
Estos son implementados por protocolos superiores como
tcp(7) y
udp(7).
sin_addr es la dirección IP del anfitrión (host). El
miembro
s_addr de
struct in_addr contiene la dirección de
la interfaz del anfitrión con los bytes en orden de red. Sólo se
debería acceder a
in_addr usando las funciones de biblioteca
inet_aton(3),
inet_addr(3) y
inet_makeaddr(3), o
directamente mediante el mecanismo de resolución de nombres (vea
gethostbyname(3)). Las direcciones IPv4 se dividen en direcciones
unidestino, de difusión y multidestino. Las direcciones unidestino
especifican una única interfaz de un anfitrión, las direcciones
de difusión especifican todos los anfitriones de una red y las
direcciones multidestino identifican a todos los anfitriones de un grupo
multidestino. Sólo se pueden enviar datagramas a o recibir datagramas
de direcciones de difusión cuando está activa la opción
de conector
SO_BROADCAST. En la implementación actual, los
conectores orientados a conexión sólo pueden usar direcciones
unidestino.
Dese cuenta que la dirección y el puerto se almacenan siempre en orden de
red. En particular, esto significa que necesita llamar a
htons(3) con
el número que se ha asignado al puerto. Todas las funciones de
manipulación de dirección/puerto en la biblioteca
estándar trabajan en orden de red.
Existen varias direcciones especiales:
INADDR_LOOPBACK (127.0.0.1)
siempre se refiere al ordenador local a través del dispositvo
`loopback'.
INADDR_ANY (0.0.0.0) significa cualquier dirección
para enlazar.
INADDR_BROADCAST (255.255.255.255) significa cualquier
ordenador y, por razones históricas, tiene el mismo efecto en el enlace
que
INADDR_ANY.
OPCIONES DE LOS CONECTORES¶
IP soporta algunas opciones de conector específicas del protocolo que se
pueden configurar con
setsockopt(2) y leer con
getsockopt(2). El
nivel de opciones de conector para IP es
SOL_IP. Una opción
entera booleana es cero cuando es falsa y cualquier otra cosa cuando es
cierta.
- IP_OPTIONS
- Establece u obtiene las opciones IP a enviar con cada paquete desde este
conector. Los argumentos son punteros a un buffer de memoria que contiene
las opciones y la longitud de las opciones. La llamada
setsockopt(2) establece las opciones IP asociadas a un conector. El
tamaño máximo de opción para IPv4 es de 40 bytes. Vea
RFC791 para las opciones permitidas. Cuando el paquete inicial de
petición de conexión para un conector SOCK_STREAM
contiene opciones IP, las opciones IP se configurarán
automáticamente al valor de las opciónes del paquete inicial
con las cabeceras de enrutamiento invertidas. No se permite que los
paquetes de entrada cambien las opciones después de que la
conexión se haya establecido. El procesamiento de todas las
opciones de enrutamiento de la fuente de entrada está desactivado
por defecto y se puede activar usando la sysctl
accept_source_route. Otras opciones, como las marcas de tiempo,
todavía se siguen manejando. Para los conectores de datagramas, las
opciones IP sólo pueden ser configuradas por el usuario local.
Llamar a getsockopt(2) con IP_OPTIONS coloca en el buffer
proporcionado las opciones IP actuales usadas para enviar.
- IP_PKTINFO
- Pasa un mensaje auxiliar IP_PKTINFO que contiene una estructura
pktinfo que proporciona alguna información sobre los
paquetes de entrada. Esto sólo funciona para conectores orientados
a datagramas. El argumento es un indicador que le dice al conector si
debería pasar el mensaje IP_PKTINFO. El mensaje en sí mismo
sólo puede ser enviado/obtenido como un mensaje de control con un
paquete usando recvmsg(2) o sendmsg(2).
struct in_pktinfo {
unsigned int ipi_ifindex; /* Índice de la interfaz */
struct in_addr ipi_spec_dst; /* Dirección local */
struct in_addr ipi_addr; /* Dirección de destino en la
cabecera */
};
- ipi_ifindex es el índice de la interfaz en la que se
recibió el paquete. ipi_spec_dst es la dirección
local del paquete y ipi_addr es la dirección de destino en
la cabecera del paquete. Si se pasa IP_PKTINFO a sendmsg(2),
el paquete de salida se enviará a través de la interfaz
especificada en ipi_ifindex con la dirección de destino
indicada en ipi_spec_dst.
- IP_RECVTOS
- Cuando está activa, se pasa el mensaje auxiliar IP_TOS con
los paquetes de entrada. Contiene un byte que especifica el campo Tipo de
Servicio/Precedencia de la cabecera del paquete. Espera una opción
entera booleana.
- IP_RECVTTL
- Cuando esta opción está activa, pasa un mensaje de control
IP_RECVTTL con el campo "tiempo de vida" (time to live)
del paquete recibido dado por un byte. No soportada por conectores
SOCK_STREAM.
- IP_RECVOPTS
- Pasa todas las opciones IP de entrada al usuario en un mensaje de control
IP_OPTIONS. La cabecera de enrutamiento y otras opciones ya las
completa el anfitrión local. No soportada para conectores
SOCK_STREAM.
- IP_RETOPTS
- Identica a IP_RECVOPTS pero devuelve opciones directas sin procesar
cuyas marcas de tiempo y opciones del registro de ruta no son completadas
por este anfitrión.
- IP_TOS
- Establece o devuelve el campo Tipo de Servicio (Type-Of-Service, TOS) a
enviar con cada paquete IP creado desde este conector. Se usa para
priorizar los paquetes en la red. TOS es un byte. Existen algunas opciones
TOS estándares definidas: IPTOS_LOWDELAY para minizar los
retrasos en el caso de tráfico interactivo, IPTOS_THROUGHPUT
para optimizar el rendimiento, IPTOS_RELIABILITY para optimizar la
fiabilidad e IPTOS_MINCOST, que se debería usar para
"datos de relleno" donde no tenga sentido una transmisión
lenta. Como mucho, se puede especificar uno de estos valores TOS. Los
otros bits son inválidos y se limpiarán. Por defecto, Linux
envía primero datagramas IPTOS_LOWDELAY pero el
comportamiento exacto depende de la disciplina de encolamiento
configurada. Algunos niveles de prioridad alta pueden necesitar un
identificador de usuario efectivo 0 o la capacidad CAP_NET_ADMIN.
La prioridad también se puede configurar de una manera
independiente del protocolo mediante la opción de conector (
SOL_SOCKET, SO_PRIORITY) (vea socket(7)).
- IP_TTL
- Establece u obtiene el campo "tiempo de vida" actual que se
envía en cada paquete enviado desde este conector.
- IP_HDRINCL
- Cuando está activa, el usuario proporciona una cabecera IP delante
de los datos de usuario. Sólo válida para conectores
SOCK_RAW. Vea raw(7) para más información.
Cuando esta opción está activa los valores configurados
mediante IP_OPTIONS, IP_TTL y IP_TOS se ignoran.
- IP_RECVERR (definido en <linux/errqueue.h>)
- Habilita el paso adicional fiable de mensajes de error. Cuando se activa
en un conector de datagramas todos los errores generados se
encolarán en una cola de errores por conector. Cuando el usuario
recibe un errore procedente de una operación con un conector, se
pueden recibir el errore llamando a recvmsg(2) con la opción
MSG_ERRQUEUE activa. La estructura sock_extended_err que
describe el error se pasará en un mensaje auxiliar con el tipo
IP_RECVERR y el nivel SOL_IP. Esto es útil para el
manejo fiable de errores en conectores no conectados. La parte de datos
recibida de la cola de errores contiene el paquete de error.
- El mensaje de control IP_RECVERR contiene una estructura
sock_extended_err:
#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
struct sock_extended_err {
u_int32_t ee_errno; /* número de error */
u_int8_t ee_origin; /* dónde se originó el error */
u_int8_t ee_type; /* tipo */
u_int8_t ee_code; /* código */
u_int8_t ee_pad;
u_int32_t ee_info; /* información adicional */
u_int32_t ee_data; /* otros datos */
/* More data may follow */
};
struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
- ee_errno contiene el número de error del error puesto en
cola. ee_origin es el código de origen que identifica al
origen del error. Los otros campos son específicos del protocolo.
La macro SO_EE_OFFENDER devuelve un puntero a la dirección
del objeto de red dónde se originó el error dado un puntero
al mensaje auxiliar. Si la dirección no es conocida, el miembro
sa_family de sockaddr valdrá AF_UNSPEC y los
otros campos de sockaddr serán indefinidos.
- IP usa la estructura sock_extended_err como sigue: a
ee_origin se le asigna el valor SO_EE_ORIGIN_ICMP para
errores recibidos en un paquete ICMP o SO_EE_ORIGIN_LOCAL para
errores generados localmente. Los valores desconocidos deben ser
ignorados. A ee_type y ee_code se les asignan los campos
tipo y código de la cabecera ICMP. ee_info contiene la MTU
descubierta para errores EMSGSIZE. El mensaje contiene
también la estructura sockaddr_in del nodo que
provocó el error, a la cual se puede acceder con la macro
SO_EE_OFFENDER. El campo sin_family de la dirección
devuelta por SO_EE_OFFENDER valdrá AF_UNSPEC cuando la
fuente sea desconocida. Cuando el error se originó en la red, todas
las opciones IP (IP_OPTIONS, IP_TTL, etc.) activas en el
conector y contenidas en el paquete de error, se pasan como mensajes de
control. El contenido útil del paquete que ha provocado el error se
devuelve como datos normales.
- Dese cuenta que TCP no posee una cola de errores. MSG_ERRQUEUE es
ilegal en conectores SOCK_STREAM. Por tanto, todos los errores son
devueltos sólo por funciones de conector o mediante
SO_ERROR.
- Para conectores directos (raw), IP_RECVERR activa el paso de todos
los errores ICMP recibidos a la aplicación. En otro caso,
sólo se informa de los errores que se producen en conectores
conectados.
- Esta opción establece u obtiene un valor booleano entero. Por
defecto, IP_RECVERR está desactivada.
- IP_PMTU_DISCOVER
- Establece o recibe la configuración del "descubrimiento de la
MTU de la ruta" para el conector. Cuando se activa, Linux
realizará el descubrimiento de la MTU de la ruta en este conector
tal y como se define en RFC1191. La opción de "no
fragmentar" se activa en todos los datagramas de salida. El valor
global por defecto del sistema se controla mediante la sysctl
ip_no_pmtu_disc para los conectores SOCK_STREAM y para todos
los demás está desactivado. Para conectores que no son
SOCK_STREAM es responsabilidad del usuario enpaquetar los datos en
trozos de tamaño MTU y realizar la retransmisión si es
necesario. El núcleo rechazará aquellos paquetes que sean
más grandes que la MTU de ruta conocida si esta opción
está activa (con EMSGSIZE ).
| Opciones del descubrimiento de la MTU de la ruta |
Significado |
| IP_PMTUDISC_WANT |
Usar configuraciones por ruta. |
| IP_PMTUDISC_DONT |
Nunca realizar el descubrimiento de la MTU de la ruta. |
| IP_PMTUDISC_DO |
Realizar siempre el descubrimiento de la MTU de la ruta. |
Cuando se activa el descubrimiento de la MTU de la ruta, el núcleo
automáticamente memoriza la MTU de la ruta por anfitrión de
destino. Cuando se está conectado a un extremo específico
mediante connect(2), se puede obtener convenientemente la MTU de la
ruta conocida actualmente usando la opción de conector
IP_MTU (por ejemplo, después de que haya ocurrido un error
EMSGSIZE). La MTU puede cambiar con el tiempo. Para conectores no
orientados a conexión con muchos destinos, también se puede
acceder a la nueva MTU usando la cola de errores (vea IP_RECVERR).
Se encolará un nuevo error para cada actualización que
llegue de la MTU.
Mientras se está realizando el descubrimiento de la MTU, se pueden
perder paquetes iniciales de los conectores de datagramas. Las
aplicaciones que usan UDP deben se conscientes de esto y no tenerlo en
cuenta para sus estrategias de retransmisión de paquetes.
Para iniciar el proceso de descubrimiento de la MTU de la ruta en conectores
no orientados a conexión, es posible comenzar con un tamaño
grande de datagramas (con logitudes de bytes de hasta 64KB en las
cabeceras) y dejar que se reduzca mediante actualizaciones de la MTU de la
ruta.
Para obtener una estimación inicial de la MTU de la ruta, conecte un
conector de datagramas a una dirección de destino usando
connect(2) y obtenga la MTU llamando a getsockopt(2) con la
opción IP_MTU.
- IP_MTU
- Obtiene la MTU de la ruta conocida actualmente para el conector actual.
Sólo válida cuando el conector ha sido conectado. Devuelve
un entero. Sólo válida para getsockopt(2).
- IP_ROUTER_ALERT
- Pasar a este conector todos los paquetes "a reenviar" que tengan
activa la opción "alarma del enrutador IP" (IP Router
Alert). Sólo válida para conectores directos. Esto es
útil, por ejemplo, para demonios RSVP en el espacio de usuario. Los
paquetes interceptados no son reenviados por el núcleo, es
responsabilidad de los usuarios envilarlos de nuevo. Se ignora el enlace
del conector, tales paquetes sólo son filtrados por el protocolo.
Espera una opción entera.
- IP_MULTICAST_TTL
- Establece o lee el valor "tiempo de vida" (time-to-live, TTL) de
los paquetes multidestino de salida para este conector. Es muy importante
para los paquetes multidestino utilizar el TTL más pequeño
posible. El valor por defecto es 1 lo que significa que los paquetes
multidestino no abandonarán la red local a menos que el programa de
usuario lo solicite explícitamente. El argumento es un entero.
- IP_MULTICAST_LOOP
- Establece o lee un argumento entero booleano que indica si los paquetes
multidestino enviados deben o no ser devueltos a los conectores
locales.
- IP_ADD_MEMBERSHIP
- Unirse a un grupo multidestino. El argumento es una estructura struct
ip_mreqn.
struct ip_mreqn {
struct in_addr imr_multiaddr; /* Dirección IP del grupo
multidestino */
struct in_addr imr_address; /* Dirección IP de la
interfaz local */
int imr_ifindex; /* Índice de la interfaz */
};
- imr_multiaddr contiene la dirección del grupo multidestino
al que la aplicación se quiere unir o quiere dejar. Debe ser una
dirección multidestino válida. imr_address es la
dirección de la interfaz local con la que el sistema debe unirse al
grupo multidestino. Si es igual a INADDR_ANY el sistema elige una
interfaz adecuada. imr_ifindex es el índice de la interfaz
que debe unirse a o dejar el grupo imr_multiaddr, o 0 para indicar
cualquier interfaz.
- Por compatibilidad, todavía se soporta la antigua estructura
ip_mreq. Difiere de ip_mreqn sólo en que no incluye
el campo imr_ifindex. Ésta opción sólo es
válida para setsockopt(2).
- IP_DROP_MEMBERSHIP
- Dejar un grupo multidestino. El argumento es una estructura
ip_mreqn o ip_mreq similar a la de
IP_ADD_MEMBERSHIP.
- IP_MULTICAST_IF
- Establece el dispositivo local para un conector multidestino. El argumento
es una estructura ip_mreqn o ip_mreq similar a la de
IP_ADD_MEMBERSHIP.
- Cuando se pasa una opción de conector inválida, se devuelve
el error ENOPROTOOPT.
SYSCTLS¶
El protocolo IP soporta la interfaz sysctl para configurar algunas opciones
globales. Se puede acceder a las sysctls leyendo o escribiendo los ficheros
/proc/sys/net/ipv4/* o usando la interfaz
sysctl(2).
- ip_default_ttl
- Establece el valor "tiempo de vida" (TTL) por defecto de los
paquetes de salida. Éste se puede cambiar para cada conector con la
opción IP_TTL.
- ip_forward
- Activa el reenvío IP con una opción booleana. También
se puede configurar el reenvío IP interfaz a interfaz.
- ip_dynaddr
- Activa la reescritura dinámica de la dirección del conector
y de las entradas de enmascaramiento (masquerading) para cuando cambie la
dirección de la interfaz. Esto es útil para interfaces
dialup (como las telefónicas) con direcciones IP cambiantes. 0
significa no reescritura, 1 la activa y 2 activa el modo verboso.
- ip_autoconfig
- No documentado.
- ip_local_port_range
- Contiene dos enteros que definen el intervalo de puertos locales por
defecto reservados para los conectores. La reserva comienza con el primer
número y termina con el segundo. Dése cuenta que estos no
deben entrar en conflicto con los puertos usados por el enmascaramiento
(aunque se trate el caso). También, las elecciones arbitrarias
pueden producir problemas con algunos filtros de paquetes del cortafuegos
que realizan suposiciones sobre los puertos locales en uso. El primer
número debe ser al menos >1024, mejor >4096 para evitar
conflictos con puertos bien conocidos y para minimizar los problemas con
el cortafuegos.
- ip_no_pmtu_disc
- Si está activa, por defecto no realiza el descubrimiento de la MTU
de la ruta para los conectores TCP. El descubrimiento de la MTU de la ruta
puede fallar si se encuentran en la ruta cortafuegos mal configurados
(como los que pierden todos los paquetes ICMP) o interfaces mal
configuradas (por ejemplo, un enlace punto a punto en donde ambos extremos
no se ponen de acuerdo en la MTU). Es mejor arreglar los enrutadores
defectuosos de la ruta que desactivar globalmente el descubrimiento de la
MTU de la ruta ya que el no realizarlo incurre en un alto coste para la
red.
- ipfrag_high_thresh, ipfrag_low_thresh
- Si el número de fragmentos IP encolados alcanza el valor
ipfrag_high_thresh, la cola se recorta al valor
ipfrag_low_thresh. Contiene un entero con el número de
bytes.
- ip_always_defrag
- [Nueva con la versión 2.2.13 del núcleo. En anteriores
versiones del núcleo la característica era controlada en
tiempo de compilación por la opción
CONFIG_IP_ALWAYS_DEFRAG]
Cuanda esta opción booleana se habilita (es distinta de 0) los
fragmentos de entrada (partes de paquetes IP que aparecen cuando
algún anfitrión entre el origen y el destino decidió
que los paquetes eran demasiado grandes y los dividió en pedazos)
se reensamblarán (desfragmentarán) antes de ser procesados,
incluso aunque vayan a ser reenviados.
Sólo habilítelo cuando tenga en funcionamiento un cortafuegos
que sea el único enlace de su red o un proxy transparente. Nunca lo
active para un enrutador u ordenador normal. En otro caso, se puede
perturbar la comunicación fragmentada cuando los fragmentos viajen
a través de diferentes enlaces. La desfragmentación
también tiene un alto coste de tiempo de CPU y de memoria.
Esto se activa automágicamente cuando se configura un enmascaramiento
o un proxy transparente.
- neigh/*
- Vea arp(7).
IOCTLS¶
Todas las ioctls descritas en
socket(7) se aplican a IP.
Las ioctls para configurar el cortafuegos se documentan en la página
ipfw(7) del paquete
ipchains.
Las ioctls para configurar los parámetros de los dispositivos
genéricos se describen en
netdevice(7).
OBSERVACIONES¶
Tenga mucho cuidado con la opción
SO_BROADCAST (no es privilegiada
en Linux). Es fácil sobrecargar la red realizando difusiones sin tomar
precauciones. Para los nuevos protocolos de aplicación es mejor usar un
grupo multidestino que usar la difusión. La difusión no
está recomendada.
Otras implementaciones de conectores BSD proporcionan las opciones de conector
IP_RCVDSTADDR y
IP_RECVIF para obtener la dirección de
destino y la interfaz de los datagramas recibidos. Linux posee la
opción más general
IP_PKTINFO para la misma tarea.
ERRORES¶
- ENOTCONN
- La operación sólo está definida en conectores
conectados, pero el conector no lo está.
- EINVAL
- Se ha pasado un argumento inválido. Para las operaciones de
envío, éste se puede producir al enviar a una ruta
blackhole.
- EMSGSIZE
- El datagrama es mayor que una MTU de la ruta y no puede ser
fragmentado.
- EACCES
- El usuario ha intentado ejecutar una operación sin los permisos
necesarios. Estos incluyen: enviar un paquete a una dirección de
difusión sin haber activado la opción SO_BROADCAST,
enviar un paquete a través de una ruta prohibida, modificar
la configuración del cortafuegos sin tener la capacidad
CAP_NET_ADMIN ni un identificador de usuario efectivo 0, y realizar
un enlace a un puerto reservado sin la capacidad
CAP_NET_BIND_SERVICE ni un identificador de usuario efectivo 0.
- EADDRINUSE
- Se ha intentado el enlace a una dirección ya en uso.
- ENOPROTOOPT y EOPNOTSUPP
- Se han pasado una opción de conector inválida.
- EPERM
- El usuario no tiene permiso para establecer una prioridad alta, cambiar la
configuración o enviar señales al proceso o grupo
solicitado.
- EADDRNOTAVAIL
- Se ha solicitado una interfaz inexistente o la dirección fuente
solicitada no es local.
- EAGAIN
- La operación se bloquearía en un conector bloqueante.
- ESOCKTNOSUPPORT
- El conector no está configurado o se ha solicitado un tipo de
conector desconocido.
- EISCONN
- Se ha llamado a connect(2) con un conector ya conectado.
- EALREADY
- Ya se está realizando una operación de conexión sobre
un conector no bloqueante.
- ECONNABORTED
- Se ha cerrado la conexión durante un accept(2).
- EPIPE
- La conexión se ha cerrado inesperadamente o el otro extremo la ha
cancelado.
- ENOENT
- Se ha llamado a SIOCGSTAMP con un conector en donde no ha llegado
ningún paquete.
- EHOSTUNREACH
- Ninguna entrada válida de la tabla de enrutamiento coincide con la
dirección de destino. Este error puede ser provocado por un mensaje
ICMP procedente de un enrutador remoto o por la tabla local de
enrutamiento.
- ENODEV
- Dispositivo de red no disponible o incapaz de enviar paquetes IP.
- ENOPKG
- No se ha configurado un subsistema del núcleo.
- ENOBUFS, ENOMEM
- No hay suficiente memoria libre. Esto a menudo significa que la reserva de
memoria está limitada por los límites del búfer de
conectores, no por la memoria del sistema, aunque esto no es coherente al
100%.
Los protocolos superpuestos pueden generar otros errores. Vea
tcp(7),
raw(7),
udp(7) y
socket(7).
VERSIONES¶
IP_PKTINFO,
IP_MTU,
IP_PMTU_DISCOVER,
IP_PKTINFO,
IP_RECVERR y
IP_ROUTER_ALERT son opciones nuevas del
núcleo 2.2 de Linux. También son todas específicas de
Linux y no deberían usarse en programas que pretendan ser portables.
struct ip_mreqn es nueva en Linux 2.2. Linux 2.0 sólo soportaba
ip_mreq.
Las sysctls se introdujeron en la versión 2.2 de Linux.
COMPATIBILIDAD¶
Por compatibilidad con Linux 2.0, todavía se soporta la sintáxis
obsoleta
socket(PF_INET, SOCK_RAW, protocol) para abrir
un conector de paquetes (
packet(7)). Se recomienda no usar esta
sintaxis y debería reemplazarse por
socket(PF_PACKET, SOCK_RAW,
protocol). La principal diferencia es la nueva estructura de
direcciones
sockaddr_ll para la información genérica de
la capa de enlace en lugar de la antigua
sockaddr_pkt.
FALLOS¶
Existen demasiados valores de error inconsistentes.
No se han descrito las ioctls para configurar las opciones de interfaz
específicas de IP y las tablas ARP.
Algunas versiones de glibc olvidan declarar
in_pktinfo. Actualmente
ésto se soluciona copiándolo en su programa desde esta
página de manual.
Recibir la dirección de destino original con
MSG_ERRQUEUE en
msg_name a través de
recvmsg(2) no funciona bien en
algunos núcleos de la serie 2.2.
AUTORES¶
Esta página de manual fue escrita por Andi Kleen.
VÉASE TAMBIÉN¶
sendmsg(2),
recvmsg(2),
socket(7),
netlink(7),
tcp(7),
udp(7),
raw(7),
ipfw(7)
RFC791 para la especificación IP original.
RFC1122 para los requerimientos IPv4 para lo anfitriones.
RFC1812 para los requeremientos IPv4 para los enrutadores.