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