FreeBSD 代码库采用了 Netlink 通信协议(RFC 3549)的实现,该协议用于 Linux 用于组织内核和用户空间进程之间的交互。该项目仅限于支持 NETLINK_ROUTE 操作系列,以管理内核网络子系统的状态。
目前,Netlink 的支持程度允许其在 FreeBSD 中使用。 LinuxNetlink 是 iproute2 软件包中的 ip 工具,用于管理网络接口、设置 IP 地址、配置路由以及操作下一跳对象(nexthop objects)。下一跳对象存储状态数据,用于将数据包转发到目标地址。只需对头文件进行少量修改,Netlink 即可在 Bird 路由软件包中使用。
FreeBSD 的 Netlink 实现被打包为一个可加载的内核模块,如果可能的话,不会影响其他内核子系统,并创建单独的任务队列(tasqueue)来通过协议处理传入的消息并以异步模式执行操作。 移植 Netlink 的原因是缺乏与内核子系统交互的标准机制,这导致不同的子系统和驱动程序发明了自己的协议。
Netlink 提供了统一的通信层和可扩展的消息格式,可以充当中介,自动将来自不同来源的不同数据组合成单个请求。 例如,FreeBSD 子系统(如 devd、jail 和 pfilctl)可以迁移到 Netlink,现在使用它们自己的 ioctl 调用,这将大大简化使用这些子系统的应用程序的创建。 此外,使用 Netlink 修改路由堆栈中的下一跳对象和组将允许与用户空间路由进程进行更有效的交互。
目前实现的功能:
- 获取有关路由、下一跳对象和组、网络接口、地址和相邻主机 (arp/ndp) 的信息。
- 形成有关网络接口的出现和断开、设置和删除地址、添加和删除路由的通知。
- 添加和删除路由、下一跳对象和组、网关、网络接口。
- 与 Rtsock 接口集成来管理路由表。
来源: opennet.ru
