软硬件协同是FAST平台分组处理的特色。FAST平台软件主要实现FAST硬件流水线与FAST用户应用(UA)间数据通路和控制通路的信息交互,为UA编程提供函数库,是支撑UA运行的基础。FAST平台软件主要由Linux内核中的FAST驱动和FAST内核以及用户空间的FAST编程库组成。
一、FAST UA的通信模式
FAST UA运行时与FPGA以及网络接口有多种通信需求,包括FAST分组收发、对FPGA的配置管理以及与远端主机进行标准的Socket通信等。
(1)FAST分组收发
UA从FAST流水线接收FAST分组以及向FAST流水线发出自己产生或者转发的FAST分组。当UA实现middlebox处理功能时,如防火墙功能,使用FAST分组收发的方式与底层FPGA进行通信。这些分组遵循元数据加以太网帧的FAST分组格式定义。FAST分组格式定义将在FAST编程 API介绍时给出。
(2)对FPGA的配置管理
UA对FPGA的配置管理包括对FAST流水线的配置管理以及对FPGA OS的配置管理。典型的对FAST流水线配置管理操作包括配置GAC模块中的Action表,读取GOE模块中的计数器等;典型的对FPGA OS的配置管理包括读取端口接收发送计数器,配置FPGA OS提供的匹配协处理器得流表项等。
(3)与远程设备的Socket通信
FAST UA还可使用标准Socket()机制通过内核协议栈与远程的网络设备进行通信。根据目的IP地址,内核协议栈确定该通信是通过挂接到CPU上标准以太网接口进行,还是通过挂接到FPGA上的网络接口进行。如果是前者,协议栈将会以sk_buff的格式与标准以太网驱动交换收发的分组;如果是后者,协议栈将会把分组送FAST内核,由FAST内核将分组封装成FAST格式,通过FAST驱动向FPGA中的流水线发出。
需要注意的是,FAST UA可能同时使用多种通信模式。例如OpenFlow通道代理(OXFP)UA既要通过Socket机制与远端的SDN控制器通信,实现packet-in/packet-out/flowmod等OpenFlow消息的交互,又要与FAST流水线进行FAST分组的交互。由于上述通过Linux内核的通信都是阻塞式的,因此需要为不同的通信创建不同的线程。
二、FAST平台软件的实现
FAST平台软件实现示意如下图所示,其中包含FAST驱动、FAST内核、FAST编程库以及两个UA、UAx和UAy。FAST内核维护的Netlink端口映射表NPMT(Netlink Port Mapping Table)是FAST平台软件中的核心数据结构,主要存放UA的MID与NetLink端口号之间的映射关系。
FAST平台软件实现时在用户空间并不存在一个集中的UA管理程序。每个UA在启动时都独立地通过FAST库函数向FAST内核注册,获取MID以及与NetLink端口号的映射关系。NPMT中也保存了各种用于管理维护的各种计数器信息,例如某个UA接收和发送分组的个数等。
FAST编程库为UA设计提供FAST分组收发的API函数,这些函数通过Netlink机制与Linux内核中的FAST内核通信。Netlink是一种基于Socket缓存队列的,内核与用户态应用之间传递的消息的异步通信机制。FAST编程库会在UA实现时编译到UA地址空间中,为防止不同UA访问FAST内核中共享数据结构存在竞争,FAST编程库在设计时考虑了对NetLink映射表等共享资源访问的互斥机制。
FAST内核维护NPMT数据结构。每个UA启动时,会通过FAST编程库提供的初始化函数向FAST内核注册,由用户显式地为UA分配一个唯一的MID编号。FAST内核对分组处理的操作如下表所示。
因此FAST内核根据FAST分组的DMID实现了FAST流水线,多个FAST UA以及协议栈之间的分组交换。从协议栈角度看,FAST内核是一个特殊的网络接口,在内核中的地位与标准的网络接口驱动基本一致。由于协议栈发出的分组无分组的输出接口信息,该分组进入FAST流水线后需要通过正常的转发获取输出接口的信息。
FAST驱动负责控制与FPGA的DMA通信,FAST驱动与硬件平台密切相关,针对不同实现平台,DMA可以是轮询方式,也可以是中断方式。不同平台中硬件DMA寄存器的地址也有所差异,因此FAST驱动移植是FAST平台软件移植的关键。由于FAST UA编程基于FAST编程API和Linux标准系统调用,因此不同的硬件平台对UA编程是完全透明的。