En la base de código de FreeBSD se ha aceptado la implementación del protocolo de comunicación Netlink (RFC 3549), utilizado en Linux para organizar la interacción entre el núcleo y los procesos en el espacio de usuario. El proyecto se limita al soporte de la familia de operaciones NETLINK_ROUTE para gestionar el estado de la subsistema de red en el núcleo.
En su forma actual, el nivel de soporte de Netlink permite utilizar la utilidad ip de Linux del paquete iproute2 en FreeBSD para gestionar interfaces de red, asignar direcciones IP, configurar el enrutamiento y manipular objetos nexthop, que almacenan datos sobre el estado utilizado para enviar paquetes al destino deseado. Con modificaciones menores en los archivos de cabecera, es posible utilizar Netlink en el paquete de enrutamiento Bird.
La implementación de Netlink para FreeBSD se presenta como un módulo de núcleo cargable, que evita, en la medida de lo posible, interferir con otros subsistemas del núcleo y crea colas de tareas separadas (tasqueue) para procesar los mensajes que llegan a través del protocolo y realizar operaciones de manera asíncrona. La razón para portar Netlink es la falta de un mecanismo estándar para interactuar con los subsistemas del núcleo, 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 mensajes extensible que puede actuar como un intermediario, recopilando automáticamente datos diversos de diferentes fuentes en una sola solicitud. Por ejemplo, subsistemas de FreeBSD como devd, jail y pfilctl, que actualmente utilizan sus propias llamadas ioctl, pueden ser trasladados a Netlink, lo que simplificará significativamente la creación de aplicaciones que trabajen con estos subsistemas. Además, el uso de Netlink para modificar objetos y grupos nexthop en la pila de enrutamiento permitirá interactuar de manera más eficiente con los procesos de enrutamiento en el espacio de usuario.
Las capacidades implementadas en la actualidad son:
- Obtención de información sobre rutas, objetos y grupos nexthop, interfaces de red, direcciones y hosts adyacentes (arp/ndp).
- Generación de notificaciones sobre la aparición y desconexión de interfaces de red, la asignación y eliminación de direcciones, y la adición y eliminación de rutas.
- Adición y eliminación de rutas, objetos y grupos nexthop, gateways, interfaces de red.
- Integración con la interfaz Rtsock para la gestión de la tabla de enrutamiento.
Fuente: opennet.ru
