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

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.

FORMATOS DE LAS DIRECCIONES

       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

Página man de Linux                               27 abril 1999                                       NETLINK(7)