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