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