En FreeBSD añadieron el soporte para el protocolo Netlink utilizado en Linux
Hace ya varios días se dio a conocer la noticia de que el código base de FreeBSD ha adoptado una nueva implementación del protocolo de comunicación Netlink (RFC 3549) el cual es utilizado en Linux para comunicarse entre el kernel y los procesos en el espacio del usuario.
La familia de sockets Netlink es una interfaz del kernel de Linux que se utiliza para la comunicación entre procesos (IPC) entre los procesos del kernel y del espacio de usuario y entre diferentes procesos del espacio de usuario, de manera similar a los sockets de dominio de Unix.
De manera similar a los sockets de dominio de Unix y a diferencia de los sockets de INET la comunicación de Netlink no puede atravesar los límites del host. Sin embargo, mientras que los sockets de dominio de Unix usan el espacio de nombres del sistema de archivos, los procesos de Netlink generalmente se abordan mediante identificadores de proceso (PID).
Netlink está diseñado y se utiliza para transferir información de red miscelánea entre el espacio del núcleo y los procesos del espacio de usuario. Las utilidades de red, como la familia iproute2 y las utilidades utilizadas para configurar controladores inalámbricos basados en mac80211, usan Netlink para comunicarse con el kernel de Linux desde el espacio del usuario. Netlink proporciona una interfaz basada en socket estándar para procesos de espacio de usuario y una API del lado del kernel para uso interno de los módulos del kernel. Originalmente, Netlink usaba la familia de sockets AF_NETLINK.
Hasta el momento en su forma actual, la capa de soporte de Netlink permite que FreeBSD use la utilidad ip de Linux del paquete iproute2 para administrar interfaces de red, establecer direcciones IP, configurar enrutamiento y manipular objetos nexthop que almacenan el estado utilizado para reenviar un paquete al destino deseado. Después de cambiar ligeramente los archivos de encabezado, es posible usar Netlink en el paquete de enrutamiento de Bird.
La implementación de Netlink para FreeBSD está empaquetada como un módulo de kernel cargable que, si es posible, no afecta a otros subsistemas del kernel y crea colas de tareas separadas (tasqueue) para procesar los mensajes entrantes a través del protocolo y realizar operaciones en modo asíncrono. La razón para portar Netlink es la falta de un mecanismo estándar para interactuar con los subsistemas del kernel, lo que lleva a que diferentes subsistemas y controladores inventen sus propios protocolos.
Netlink ofrece una capa de comunicación unificada y un formato de mensaje extensible que puede actuar como un intermediario que combina automáticamente datos dispares de diferentes fuentes en una sola solicitud. Por ejemplo, los subsistemas de FreeBSD como devd, jail y pfilctl se pueden migrar a Netlink, ahora usando sus propias llamadas ioctl, lo que simplificará enormemente la creación de aplicaciones para trabajar con estos subsistemas. Además, el uso de Netlink para modificar los objetos y grupos nexthop en la pila de enrutamiento permitirá una interacción más eficiente con los procesos de enrutamiento del espacio del usuario.
Las interfaces, direcciones, rutas, firewall, fibs, vnets, etc. se controlan a través de netlink. Es un protocolo asincrónico basado en TLV que proporciona comunicaciones 1-1 y 1-muchos. La implementación actual admite el subconjunto de la familia NETLINK_ROUTE. La implementación también es compatible con el marco de la familia NETLINK_GENERIC.
Funciones actualmente implementadas:
- Obtener información sobre rutas, objetos y grupos nexthops, interfaces de red, direcciones y hosts vecinos (arp/ndp).
- Formación de notificaciones sobre la aparición y desconexión de interfaces de red, configuración y eliminación de direcciones, adición y eliminación de rutas.
- Agregar y eliminar rutas, objetos y grupos de próximos saltos, puertas de enlace, interfaces de red.
- Integración con la interfaz Rtsock para gestionar la tabla de enrutamiento.
Cabe mencionar que hasta el momento el proyecto se limita a admitir la familia de operaciones NETLINK_ROUTE para administrar el estado del subsistema de red en el núcleo.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.