FAST编程库Libua.a和linreg.a為(wèi)Fast软件编程提供标准编程API。Fast编程API主要分(fēn)為(wèi)三类。一是用(yòng)户UA编程API,用(yòng)户可(kě)在UA进程中直接调用(yòng)这些API函数实现与FAST平台的通信,包含UA管理(lǐ)、分(fēn)组收发和FAST流水線(xiàn)管理(lǐ)三类;二是Fast平台管理(lǐ)API,实现对Fast硬件平台中FPGA OS的管理(lǐ);三是扩展API,即面向FAST流水線(xiàn)中特定硬件模块特定功能(néng)而设计的API。
一、UA编程API
UA编程使用(yòng)的基本API如下表所示。如果用(yòng)户没有(yǒu)向硬件流水線(xiàn)中添加自定义的模块,那么用(yòng)户UA只使用(yòng)以下6个函数就可(kě)以实现与Fast平台的交互。如果用(yòng)户向Fast流水線(xiàn)中添加了定制的模块,则需要根据所添加硬件模块的功能(néng)对编程API进行扩充。
為(wèi)了简化UA对硬件流水線(xiàn)模块的管理(lǐ),Fast编程API提供了读写硬件模块的函数。在Fast编程库函数实现时,上述读写函数均被转换成控制类的Fast分(fēn)组发往硬件流水線(xiàn),并通过流水線(xiàn)的Cin/Cout控制环操作实现对分(fēn)组的读写。
上表中的6个API函数的原型和参数说明如下。
(1)int fast_ua_init(int mid, fast_ua_recv_callbackcallback);
输入参数mid為(wèi)用(yòng)户為(wèi)UA设置的模块号,该模块号是FAST平台对软硬件模块的唯一标识。根据FAST规范,软件UA的mid范围是128-255,由于128默认為(wèi)内核协议栈,因此用(yòng)户UA的mid范围可(kě)设置為(wèi)129-255。用(yòng)户需保证mid参数不与系统中其他(tā)UA的参数冲突,如果发生冲突,函数返回值為(wèi)1,表明注册失败。输入参数callback為(wèi)Fast平台在接收到发往用(yòng)户UA的分(fēn)组时的回调函数,用(yòng)户需要在程序中对callback函数进行定义。如果UA注册成功,函数返回值為(wèi)0,否则返回非0值。
(2)void fast_ua_destroy(void);
用(yòng)户UA在退出时需执行的操作,主要是通知FAST平台释放向UA分(fēn)配的mid编号。
(3)int fast_ua_send(struct fast_packet *pkt,int pkt_len);
用(yòng)户UA调用(yòng)该函数向Fast平台发送分(fēn)组。其中pkt是指向fast_packet数据结构的指针。该数据结构包含了指向分(fēn)组缓冲區(qū)的指针以及分(fēn)组的目的mid等参数。执行成功返回报文(wén)長(cháng)度,执行失败返回-1。用(yòng)户在调用(yòng)该函数时,需要注意以下两点。一是如果UA想直接将分(fēn)组从Fast平台的网络接口发出,需要将dmid设置為(wèi)5,即将目的模块设置為(wèi)Fast硬件流水線(xiàn)中的通用(yòng)输出模块(GOE),同时设置Outport和Outtype字段,指明输出的类型(单播/组播/广播)以及输出端口号或组播ID;二是如果UA想将分(fēn)组发送给其他(tā)的UA,则需要将dmid设置為(wèi)UA的mid编号。一个用(yòng)户UA如何获取其他(tā)UA的mid不是Fast规范考虑的问题。
(4)void fast_ua_recv();
UA启动接收FAST报文(wén)。每当Fast内核接收到目的mid為(wèi)用(yòng)户UAmid的分(fēn)组后,会通过Netlink机制将分(fēn)组拷贝到用(yòng)户空间,并调用(yòng)UA初始化时设置好的callback回调函数对报文(wén)进行处理(lǐ)。
(5)u32 fast_ua_hw_rd(u8 dmid, u32addr, u32 mask);
其中dmid為(wèi)读操作的硬件流水線(xiàn)模块号,addr為(wèi)模块内部的读地址偏移量。mask為(wèi)读数据的掩码,目前未使用(yòng),用(yòng)户应将mask设置為(wèi)0。
(6)void fast_ua_hw_wr(u8dmid,u32 addr,u32 value,u32 mask);
其中dmid為(wèi)写操作的硬件流水線(xiàn)模块号,addr為(wèi)模块内部的写地址偏移量,value為(wèi)写数据的值。mask為(wèi)写数据的掩码,目前未使用(yòng),用(yòng)户需设置為(wèi)0。
三、扩展API
根据Fast流水線(xiàn)的规范,用(yòng)户可(kě)以根据分(fēn)组处理(lǐ)的需求对Fast硬件流水線(xiàn)中的模块进行扩展和定制。因此对于不同硬件流水線(xiàn)模块也会产生不同的扩展API。
典型的例子是基于Fast的SDN交换实现中,硬件流水線(xiàn)包含了GPP,GKE,GME,GAC和GOE5个功能(néng)模块。用(yòng)户UA可(kě)能(néng)需要对这些功能(néng)模块进行管理(lǐ)。例如配置GME模块的规则表和GAC模块中的动作表等。虽然规则表和动作表在模块中具有(yǒu)固定的偏移地址,UA可(kě)使用(yòng)fast_ua_hw_rd()和fast_ua_hw_wr()函数对其管理(lǐ),但这样十分(fēn)复杂。為(wèi)此,可(kě)基于基础的fast_ua_hw_rd()和fast_ua_hw_wr()函数,再封装成fast_rule_add()和fast_rule_del()等扩展的API,简化用(yòng)户UA编程的复杂性。
关于Fast通用(yòng)模块的扩展API我们将在后续文(wén)章中介绍。