Netlink在SONiC中的应用
Netlink在SONiC中的应用
Netlink介绍
Netlink 是 Linux 内核态程序与用户空间程序之间进行通信的机制之一,原本是用于传递网络协议栈中的各种控制消息。它采用和套接字(socket)编程接口相同的形式,常用于配置内核网络子系统,如网络接口、路由、流表、策略路由等。由于Socket编程接口的普遍应用以及Socket编程接口比传统的 ioctl 更灵活、更高效,因此Netlink也被大量应用于与网络应用无关的其它场合。如NETLINK_GENERIC,NETLINK_KOBJECT_UEVENT类型的Socket等等。
Netlink 消息格式包括struct nlmsghdr Netlink 消息头(长度、类型、标志等);struct XXX 协议数据(如 ifinfomsg, rtmsg 等); 属性(TLV格式)可选字段,类型-长度-值格式。
Netlink在SONiC中的应用
SONiC的各类名字以syncd结尾的服务大量使用Netlink来监控系统中网络设备的变化,将最新状态同步到Redis,并通知其他服务进行相应的更新。*syncd服务把硬件状态同步到数据库,内核态的程序监控端口状态,发送Netlink Event给用户态portsyncd,portsyncd监听Netlink事件,将交换机中所有端口状态同步到STATE_DB; natsyncd监听Netlink事件,将交换机中所有NAT状态同步到APPL_DB.
Netlink在SONiC中的实现
sonic-swss-common中用NetLink类封装了netlink套接字API交互的接口用于通过NetLink套接字与Linux内核通信。代码包含在netlink.cpp中,采用Select框架用于事件驱动编程。
NetLink类的套接字管理:这个类管理到Linux内核的netlink套接字连接。netlink.cpp: 16 - 22
NetLink类采用非阻塞操作:将套接字设置为非阻塞模式,允许异步操作。netlink.cpp: 37
NetLink类大缓冲区大小:套接字缓冲区设置为16MB以处理大量数据。netlink.cpp: 38-39
组注册:允许订阅特定的netlink组播组。netlink.cpp: 51 - 61
转储(DUMP)请求:支持请求内核信息的转储。netlink.cpp: 63 - 73
NetLink类实现了Selectable接口,它为事件驱动编程提供了下列方法:
getFd():返回netlink套接字的文件描述符。netlink.cpp: 75 - 78
readData():当netlink套接字可用时从套接字读取数据。netlink.cpp: 80 - 99
消息处理
当接收到netlink消息时,它由onNetlinkMsg回调函数处理,该函数将消息转发给NetDispatcher:netlink.cpp:102-106
NetLink类通常用于:
创建到内核的netlink套接字连接
注册特定的netlink组以接收通知
从内核请求信息转储
通过NetDispatcher处理传入的netlink消息
这允许应用程序直接从Linux内核接收有关网络相关事件的通知(如接口更改、路由更新等)。
NetLink类是SONiC -swss-common库的一部分,通过netlink套接字接口在用户空间应用程序和Linux内核之间进行通信,这样的设计使得SONiC SWSS的框架结构成为一种基于事件驱动编程的异步网络监视结构类型。