NOMBRE¶
netlink, PF_NETLINK - Comunicación entre el núcleo y el usuario.
SINOPSIS¶
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
netlink_socket = socket(PF_NETLINK, socket_type, netlink_family);
DESCRIPCIÓN¶
Netlink se utiliza para transferir información entre los módulos del
núcleo y los procesos del espacio de usuario. Consiste en una interfaz
basada en conectores estándares para los procesos de usuario y una API
del núcleo interna para los módulos del núcleo. La interfaz del
núcleo interna no se documenta en esta página de manual.
También existe una interfaz netlink obsoleta mediante dispositivos de
caracteres netlink. Esta interfaz no se documenta aquí y sólo se
proporciona por compatibilidad hacia atrás.
Netlink es un servicio orientado a datagramas. Tanto
SOCK_RAW como
SOCK_DGRAM son valores válidos para
socket_type. Sin
embargo, el protocolo netlink no distingue entre conectores de datagrama y
conectores directos (raw).
netlink_family selecciona el módulo del núcleo o el grupo
netlink con el que comunicarse. Las familias netlink asignadas actualmente
son:
- NETLINK_ROUTE
- Recibe actualizaciones de enrutamiento y puede usarse para
modificar la tabla de enrutamiento de IPv4 (vea rtnetlink(7)).
- NETLINK_FIREWALL
- Recibe paquetes enviados por el código del cortafuegos
de IPv4.
- NETLINK_ARPD
- Para gestionar la tabla ARP en el espacio de usuario.
- NETLINK_ROUTE6
- Recibe y envía actualizaciones a la tabla de
enrutamiento de IPv6.
- NETLINK_IP6_FW
- Para recibir los paquetes que no pasarón las
comprobaciones del cortafuegos de IPv6 (actualmente no implementado).
- NETLINK_TAPBASE...NETLINK_TAPBASE+15
- Son las instancias del dispositivo ethertap. El
dispositivo ethertap es un pseudodispositivo de tunel de red que permite
simular un manejador ethernet desde el espacio de usuario.
- NETLINK_SKIP
- Reservado para ENskip.
- NETLINK_USERSOCK
- Reservado para futuros protocolos en el espacio de
usuario.
Los mensajes netlink consisten en un flujo de bytes con una o más cabeceras
nlmsghdr y sus cargas útiles asociadas. Para los mensajes
multiparte, la primera cabecera y las siguientes tienen activa la opción
NLM_F_MULTI, excepto la última cabecera, que tiene el tipo
NLMSG_DONE. El flujo de bytes sólo debería ser accedido con
las macros estándares
NLMSG_*. Vea
netlink(3).
Netlink no es un protocolo fiable. Intenta hacerlo lo mejor que puede para
entregar un mensaje en su destino (o destinos), pero puede perder mensajes
cuando no hay suficiente memoria o se produce cualquier otro error. Para una
transferencia fiable, el emisor puede solicitar un reconocimiento del receptor
activando la opción
NLM_F_ACK. Un reconocimiento es un paquete
NLMSG_ERROR cuyo campo de error vale 0. La propia aplicación debe
generar reconocimientos para los mensajes recibidos. El núcleo intenta
enviar un mensaje
NLMSG_ERROR para cualquier paquete que falle. Un
proceso de usuario también debería seguir estas convenciones.
Cada familia netlink tiene un conjunto de 32 grupos multidestino (mutlicast).
Cuando se llama a
bind(2) sobre el conector, se debe configurar el
campo
nl_groups de
sockaddr_nl como una máscara de bits de
los grupos que se desea escuchar. El valor por omisión para este campo es
cero, lo que significa que no se recibirán multidestinos.
Un conector puede enviar un mensajes con varios destinos a cualquiera de los
grupos multidestino, asignando a
nl_groups una máscara de bits de
los grupos a los que desea enviar cuando llama a
sendmsg(2) o hace un
connect(2). Sólo los usuarios con un identificador de usuario
efectivo 0 o la capacidad
CAP_NET_ADMIN pueden enviar a o escuchar de
un grupo netlink multidestino. Cualquier respuesta a un mensaje recibido por
un grupo multidestino se debe enviar de regreso al pid emisor y al grupo
multidestino.
struct nlmsghdr
{
__u32 nlmsg_len; /* Longitud del mensaje incluyendo
la cabecera */
__u16 nlmsg_type; /* Contenido del mensaje */
__u16 nlmsg_flags; /* Opciones adicionales */
__u32 nlmsg_seq; /* Número de secuencia */
__u32 nlmsg_pid; /* PID del proceso que abrió el conector */
};
struct nlmsgerr
{
int error; /* número de error negativo o 0
para reconocimientos */
struct nlmsghdr msg; /* cabecera del mensaje que
provocó el error */
};
Después de cada
nlmsghdr viene la carga útil.
nlmsg_type
puede ser uno de los tipos de mensajes estándares:
- NLMSG_NOOP
- Se va a ignorar el mensaje.
- NLMSG_ERROR
- El mensaje indica un error y la carga útil contiene
una estructura nlmsgerr.
- NLMSG_DONE
- El mensaje termina un mensaje multiparte.
Una familia netlink normalmente especifica más tipos de mensajes. Vea las
páginas de manual adecuadas para ello. Por ejemplo,
rtnetlink(7)
para
NETLINK_ROUTE.
Bits de opciones estándares en nlmsg_flags |
|
NLM_F_REQUEST |
Poner en todos los mensajes de solicitud |
NLM_F_MULTI |
El mensaje es parte de un mensaje multiparte terminado mediante
NLMSG_DONE . |
NLM_F_ACK |
Responder con un reconocimiento en caso de éxito |
NLM_F_ECHO |
Hacer eco de esta solicitud |
Bits de opciones adicionales para peticiones GET |
|
NLM_F_ROOT |
Devolver la tabla completa en lugar de una única entrada. |
NLM_F_MATCH |
Todavía no implementado. |
NLM_F_ATOMIC |
Devolver una copia instantánea atómica de la tabla. |
NLM_F_DUMP |
Todavía no documentado. |
Bits de opciones adicionales para peticiones NEW |
|
NLM_F_REPLACE |
Reemplazar un objeto existente. |
NLM_F_EXCL |
No reemplazar si el objeto ya existe. |
NLM_F_CREATE |
Crear un objeto sin no existe ya. |
NLM_F_APPEND |
Añadir al final de la lista de objetos. |
Dese cuenta que NLM_F_ATOMIC requiere CAP_NET_ADMIN o derechos de superusuario.
La estructura
sockaddr_nl describe un cliente netlink en el espacio de
usuario o en el núcleo. Una sockaddr_nl puede ser o bien unidestino
(envío a un único igual) o bien un envío a grupos netlink
(nl_groups distinto de 0).
struct sockaddr_nl
{
sa_family_t nl_family; /* AF_NETLINK */
unsigned short nl_pad; /* cero */
pid_t nl_pid; /* PID del proceso */
__u32 nl_groups; /* Máscara de grupos
mutlidirección */
};
nl_pid es el PID del proceso propietario del conector destinatario o 0 si
el destino está en el núcleo.
nl_groups es una máscara
de bits con cada bit representando a un número de grupo netlink.
FALLOS¶
Esta página de manual no está completa.
OBSERVACIONES¶
Normalmente es mejor usar netlink mediante
libnetlink que mediante la
interfaz de bajo nivel del núcleo.
VERSIONES¶
La interfaz de conectores netlink es una nueva característica de la
versión 2.2 de Linux.
La versión 2.0 de Linux soportaba una interfaz netlink más primitiva
basada en dispositivos (que todavía está disponible por
compatibilidad). Esta interfaz obsoleta no se describe aquí.
VÉASE TAMBIÉN¶
cmsg(3),
rtnetlink(7),
netlink(3)
ftp://ftp.inr.ac.ru/ip-routing/iproute2* para libnetlink