软硬件协同的分组处理是FAST区别其他数据平面开源项目的最重要的特点。模块(Module)是FAST平台中交换功能定义、资源分配以及代码重用的基本单元,特定分组处理功能到软硬件模块的映射也是FAST软硬件协同分组处理的关键。
一、FAST模块简介
FAST中的模块是能够实现特定网络处理功能的,具有唯一标识的,相对独立的一个软件程序(UA)或FAST流水线中的硬件逻辑块。FAST模块能够按需连接,组成上下游关系,实现分组处理的流水线。FAST模块具有一些共有的属性:
(1)用户可见
模块的用户可见是在交换功能设计时,模块实现的功能是用户可以感知到并且关注的功能。如FPGA实现的分组协议解析逻辑块、输出调度逻辑块、IEEE 1588端节点的时钟同步功能块以及操作系统内核中的TCP/IP协议栈等。这些功能都与用户实现的分组交换目标密切关联。FPGA OS和操作系统内核中用户不可见且不关心的功能实现不能称为模块,例如FPGA中的DMA引擎、DDR接口控制器以及操作系统中的FAST驱动程序等。
(2)独立可重用
模块间是相互独立的,在功能实现上没有明确的功能依赖或调用关系。模块之间只存在上下游关系,不存在父模块和子模块关系。不同的模块可能来自不同的开发人员,这些模块在不同的设计中可以重用,用户通过不同模块的组合实现不同的分组交换功能。因此硬件模块的设计必须遵循FAST流水线规范中对模块接口信号语法语义的要求,FAST软件UA模块设计必须基于FAST API,不能对其上游或下游模块的实现方法提出任何假设。
(3)唯一标识
FAST平台中每个模块都用被称为MID的8比特ID唯一标识,因此平台中最多支持256个模块。FAST规定0-127为FAST流水线中硬件模块的MID标识,128-255为FAST软件模块的标识。硬件模块在实例化时通过外部连线获取MID,软件UA在初始化注册时获取自己的MID。在软硬件协同分组处理中,对分组目的模块号(DMID)的设置是实现分组处理路经控制的重要手段。
FAST开源项目为用户提供了经过测试可直接使用的通用软硬件模块。其中FAST流水线中的通用硬件模块包括:
通用分组解析模块(GPP),实现以太网、ARP、IPv4、IPv6、ICMP/ICMPv6,TCP和UDP等协议的解析功能;
通用关键字提取模块(GKE),实现IPv4/IPv6分组的多元组(五元组+输入端口号等)信息的提取和查表关键字的生成;
通用查表模块(GME),实现TCAM查表功能,将GKE提取的五元组信息映射为14位的FlowID。
通用动作模块(GAC),根据FlowID查找动作表,获取分组的目的输出接口或UA的MID(如果需要将分组定向到软件处理)。
通用输出引擎(GOE),实现基于令牌桶的输出分组Meter,丢弃分组计数等功能;
通用的软件模块包括:
OpenFlow通道UA(OXFP),在FAST硬件流水线与源端SDN控制器之间建立OpenFlow 1.3协议通道的连接,实现packet-in/packet-out分组交换以及FlowMOD等消息的解析执行操作。
不同用户根据自身需求,已开发的FAST流水线模块还包括IEEE 1588 PTP协议解析模块、DDOS前端检测模块、TCP代理模块、Lisp协议封装/解封装模块、假冒源IPv6地址检测模块、测量分组定时发送模块及传输协议跳变模块等。实现的软件UA包括IPv6路经MTU发现模块、DDOS检测控制模块、状态防火墙模块及LISP映射管理代理模块等。
上述用户自定义模块与FAST提供的基本软硬件模块组合,即可在标准OpenFlow交换基础上,扩充更多的用户定制功能,实现有状态的数据平面处理。
二、模块的组织与交换功能实现
不失一般性,FAST平台中包含n个硬件模块和m个软件模块(n>0,m>0)。n个硬件模块组成硬件流水线,到达分组依次由硬件流水线的第1级(模块X1),第2级(模块X2)…第n级(模块Xn)进行处理。m个软件模块(UA)连接到FAST内核上,通过FAST API与其他软件模块和FAST硬件流水线进行分组交换。
FAST模块间交换的信息包括分组信息(P)以及保留中间处理结果的元数据(MD)。元数据中包含了处理分组的目的模块MID(DMID)、上一个处理该分组的源模块MID(SMID)、以及分组接收端口号、接收时间戳等信息。FPGA OS需要为网络端口输入的分组初始化其MD字段,例如填写接收端口号,标记接收时间戳等。
分组在FAST平台中处理的路经控制主要由MD中的DMID和SMID字段控制。例如FAST内核基于MD中的DMID和SMID实现分组在不同软件UA与硬件流水线之间的交换。而SMID在路经选择中使用主要是为了灵活的实现分组处理流程的编排。
基于上图所示的模块组织方法,FAST平台可将已有开源模块连接起来实现通用分组交换功能。例如,当FAST流水线由GPP、GKE、GME、GAC和GOE五个模块依次连接组成,软件加载OpenFlow通道UA(OXFP)时,平台即可支持基本的OpenFlow1.3功能。
用户可以通过在已有的模块处理架构中插入新的模块实现功能扩展。例如当需要在特定接口上(例如连接外部网络的端口0上)实现针对TCP的状态防火墙(SFW)功能时,一种方法是软件扩展,在linux用户空间编写SFW功能的UA,通过配置GME的规则,将0号口进出的TCP分组定向到SFW UA进行处理,这种方法实现快速,不需要改动现有的硬件;另一种方法是硬件扩展,直接在FAST流水线中插入SFW硬件模块,这种方法处理性能高,适合熟悉硬件设计的研究人员。
如何基于DMID和SMID实现分组处理路经控制,如何选取合适的功能扩展方式以及功能扩展的实现细节将在后续文章中逐步介绍。