UA编程API是FAST平台支持软硬协同分组处理的基础。基本编程API为UA提供了与硬件流水线交互的基本手段。扩展API是面向FAST流水线中特定硬件模块而设计的API,主要通过对基本API再次封装实现。扩展API的使用可以大大简化UA编程的复杂性。本文以SDN交换规则管理为例,详细介绍扩展API的优点,实现方法和工作流程。
一、扩展API简介
FAST基本API为FAST流水线中硬件模块设计者提供了与软件通信的接口。模块设计者还应根据模块提供的功能,基于基本API为用户提供扩展的API,以简化UA编程的复杂性。
(1)扩展API的优点
扩展API可以简化用户UA编程的复杂性。例如,FAST的SDN交换流水线包含了GPP,GKE,GME,GAC和GOE等功能模块。UA需要配置GME(通用匹配引擎)模块的规则表和GAC(通用动作执行)模块中的动作表以实现对特定报文的match-action操作。UA直接使用fast_ua_hw_rd()和fast_ua_hw_wr()函数对GME和GAC模块中的表进行配置存在两个不便。
一是每次操作必须提供操作地址等底层信息,而这一信息与硬件模块实现相关。UA使用这些地址对低层配置与SDN交换机需要对转发层进行抽象的原则相违背;二是由于fast_ua_hw_rd()和fast_ua_hw_wr()函数每次只能访问32位数据,对一条SDN规则的FlowMod配置需要拆分成访问不同模块的多次操作,增加了编程的复杂性。
为简化SDN规则管理,可在FAST编程库中可定义一些专用的数据结构。例如描述SDN网络中流的flow结构,对应FlowMod消息的fast_rule结构等。基于这些结构,可扩展UA编程API,为UA编程提供更高层次的抽象,简化编程的复杂性。
(2)扩展API实现方法
扩展API的实现主要分为两个步骤。一是为UA编程定义数据结构,屏蔽底层实现细节;二是根据UA编程需求,设计相应的API函数。以下仍以SDN交换为例说明。
由于SDN转发面的管理主要是对规则进行增加,删除等操作,因此FAST定义了Fast_rule数据结构,如下所示。因此UA在编程实现SDN的规则管理时,只需要实现对上述规则的操作即可,而不需要考虑规则的具体存储地址。我们会在基于FAST的SDN交换实现相关文档中详细介绍Fast_rule数据结构。
基于Fast_rule数据结构,可以为SDN规则管理定义如下5个扩展的API。分别实现规则表的初始化、规则添加、规则删除和规则打印等功能,如下表所示。
显然,基于上述扩展API,可以方便的实现对SDN转发规则的管理,简化了UA设计的复杂度。
二、扩展API的实现
下图以Fast_add_rule()为例,介绍了扩展API的实现流程。其中UA程序实现了交换机上的openflow通道功能,需要根据SDN控制器发来的Flowmod指令对FAST硬件流水线中的规则进行管理。
以增加规则为例,UA首先按照FlowMod消息中包含的规则和动作信息,构造fast_rule结构体,然后调用FAST编程库中所提供的fast_rule_add()将fast_rule结构体携带的流表配置信息经FAST内核和FAST驱动,写入硬件GME模块和硬件GAC模块所关联的lookup表中。

图1 扩展API的执行过程
每个FlowMod消息涉及到对FAST硬件流水线中GME和GAC两个模块对应的规则表和action表进行管理,而fast_rule_add()函数向用户屏蔽了这一硬件实现细节。