FAST編程庫Libua.a和(hé)linreg.a爲Fast軟件編程提供标準編程API。Fast編程API主要分爲三類。一是用(yòng)戶UA編程API,用(yòng)戶可在UA進程中直接調用(yòng)這(zhè)些(xiē)API函數實現(xiàn)與FAST平台的通信,包含UA管理(lǐ)、分組收發和(hé)FAST流水(shuǐ)線管理(lǐ)三類;二是Fast平台管理(lǐ)API,實現(xiàn)對(duì)Fast硬件平台中FPGA OS的管理(lǐ);三是擴展API,即面向FAST流水(shuǐ)線中特定硬件模塊特定功能(néng)而設計(jì)的API。
一、UA編程API
UA編程使用(yòng)的基本API如下(xià)表所示。如果用(yòng)戶沒有向硬件流水(shuǐ)線中添加自(zì)定義的模塊,那麽用(yòng)戶UA隻使用(yòng)以下(xià)6個函數就可以實現(xiàn)與Fast平台的交互。如果用(yòng)戶向Fast流水(shuǐ)線中添加了(le)定制的模塊,則需要根據所添加硬件模塊的功能(néng)對(duì)編程API進行擴充。
爲了(le)簡化UA對(duì)硬件流水(shuǐ)線模塊的管理(lǐ),Fast編程API提供了(le)讀寫硬件模塊的函數。在Fast編程庫函數實現(xiàn)時(shí),上(shàng)述讀寫函數均被轉換成控制類的Fast分組發往硬件流水(shuǐ)線,并通過流水(shuǐ)線的Cin/Cout控制環操作(zuò)實現(xiàn)對(duì)分組的讀寫。
上(shàng)表中的6個API函數的原型和(hé)參數說明(míng)如下(xià)。
(1)int fast_ua_init(int mid, fast_ua_recv_callbackcallback);
輸入參數mid爲用(yòng)戶爲UA設置的模塊号,該模塊号是FAST平台對(duì)軟硬件模塊的唯一标識。根據FAST規範,軟件UA的mid範圍是128-255,由于128默認爲内核協議(yì)棧,因此用(yòng)戶UA的mid範圍可設置爲129-255。用(yòng)戶需保證mid參數不與系統中其他(tā)UA的參數沖突,如果發生沖突,函數返回值爲1,表明(míng)注冊失敗。輸入參數callback爲Fast平台在接收到(dào)發往用(yòng)戶UA的分組時(shí)的回調函數,用(yòng)戶需要在程序中對(duì)callback函數進行定義。如果UA注冊成功,函數返回值爲0,否則返回非0值。
(2)void fast_ua_destroy(void);
用(yòng)戶UA在退出時(shí)需執行的操作(zuò),主要是通知(zhī)FAST平台釋放(fàng)向UA分配的mid編号。
(3)int fast_ua_send(struct fast_packet *pkt,int pkt_len);
用(yòng)戶UA調用(yòng)該函數向Fast平台發送分組。其中pkt是指向fast_packet數據結構的指針。該數據結構包含了(le)指向分組緩沖區(qū)的指針以及分組的目的mid等參數。執行成功返回報(bào)文(wén)長度,執行失敗返回-1。用(yòng)戶在調用(yòng)該函數時(shí),需要注意以下(xià)兩點。一是如果UA想直接将分組從(cóng)Fast平台的網絡接口發出,需要将dmid設置爲5,即将目的模塊設置爲Fast硬件流水(shuǐ)線中的通用(yòng)輸出模塊(GOE),同時(shí)設置Outport和(hé)Outtype字段,指明(míng)輸出的類型(單播/組播/廣播)以及輸出端口号或組播ID;二是如果UA想将分組發送給其他(tā)的UA,則需要将dmid設置爲UA的mid編号。一個用(yòng)戶UA如何獲取其他(tā)UA的mid不是Fast規範考慮的問題。
(4)void fast_ua_recv();
UA啓動接收FAST報(bào)文(wén)。每當Fast内核接收到(dào)目的mid爲用(yòng)戶UAmid的分組後,會(huì)通過Netlink機制将分組拷貝到(dào)用(yòng)戶空(kōng)間,并調用(yòng)UA初始化時(shí)設置好(hǎo)的callback回調函數對(duì)報(bào)文(wén)進行處理(lǐ)。
(5)u32 fast_ua_hw_rd(u8 dmid, u32addr, u32 mask);
其中dmid爲讀操作(zuò)的硬件流水(shuǐ)線模塊号,addr爲模塊内部的讀地址偏移量。mask爲讀數據的掩碼,目前未使用(yòng),用(yòng)戶應将mask設置爲0。
(6)void fast_ua_hw_wr(u8dmid,u32 addr,u32 value,u32 mask);
其中dmid爲寫操作(zuò)的硬件流水(shuǐ)線模塊号,addr爲模塊内部的寫地址偏移量,value爲寫數據的值。mask爲寫數據的掩碼,目前未使用(yòng),用(yòng)戶需設置爲0。
三、擴展API
根據Fast流水(shuǐ)線的規範,用(yòng)戶可以根據分組處理(lǐ)的需求對(duì)Fast硬件流水(shuǐ)線中的模塊進行擴展和(hé)定制。因此對(duì)于不同硬件流水(shuǐ)線模塊也(yě)會(huì)産生不同的擴展API。
典型的例子是基于Fast的SDN交換實現(xiàn)中,硬件流水(shuǐ)線包含了(le)GPP,GKE,GME,GAC和(hé)GOE5個功能(néng)模塊。用(yòng)戶UA可能(néng)需要對(duì)這(zhè)些(xiē)功能(néng)模塊進行管理(lǐ)。例如配置GME模塊的規則表和(hé)GAC模塊中的動作(zuò)表等。雖然規則表和(hé)動作(zuò)表在模塊中具有固定的偏移地址,UA可使用(yòng)fast_ua_hw_rd()和(hé)fast_ua_hw_wr()函數對(duì)其管理(lǐ),但(dàn)這(zhè)樣十分複雜(zá)。爲此,可基于基礎的fast_ua_hw_rd()和(hé)fast_ua_hw_wr()函數,再封裝成fast_rule_add()和(hé)fast_rule_del()等擴展的API,簡化用(yòng)戶UA編程的複雜(zá)性。
關于Fast通用(yòng)模塊的擴展API我們将在後續文(wén)章中介紹。