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