薛 鐳,賀亞龍
(中國(guó)船舶重工集團(tuán)公司第七一五研究所,杭州 310023)
目前主流的操作系統(tǒng)網(wǎng)絡(luò)協(xié)議棧基本上都使用TCP/IP協(xié)議棧。經(jīng)典的TCP/IP參考模型從上至下分為4個(gè)層次:應(yīng)用層、傳輸層、網(wǎng)絡(luò)互聯(lián)層和主機(jī)到網(wǎng)絡(luò)層[1]。在以太網(wǎng)通信中,最大傳輸單元(Maximum Transmission Unit,MTU)規(guī)定了經(jīng)過(guò)網(wǎng)絡(luò)層封裝的數(shù)據(jù)包的最大長(zhǎng)度。當(dāng) IP層需要傳送的數(shù)據(jù)超過(guò) MTU值時(shí),IP層需要對(duì)該數(shù)據(jù)包進(jìn)行分片,使每一片的長(zhǎng)度小于或等于MTU值;在TCP通信建立連接時(shí),取兩端提供的最大報(bào)文長(zhǎng)度(Maximum Segment Size,MSS)的最小值作為會(huì)話的MSS值,由于TCP分段有MSS值的限制,通常情況下TCP數(shù)據(jù)經(jīng)過(guò)IP層封裝后的長(zhǎng)度不會(huì)大于MTU。因此,在一般情況下,TCP數(shù)據(jù)包不會(huì)進(jìn)行IP分片。如果出現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包太小的情況,操作系統(tǒng)網(wǎng)絡(luò)協(xié)議棧及應(yīng)用軟件對(duì)網(wǎng)絡(luò)數(shù)據(jù)的解析計(jì)算會(huì)消耗大量的CPU時(shí)間,導(dǎo)致網(wǎng)絡(luò)數(shù)據(jù)傳輸效率急劇下降,甚至出現(xiàn)丟包。為了解決這些問(wèn)題,本文著重研究了一種基于offload和FPGA的網(wǎng)絡(luò)數(shù)據(jù)采集方法,將網(wǎng)絡(luò)數(shù)據(jù)的解析工作放到FPGA中進(jìn)行,然后通過(guò)PCIe總線高速傳輸?shù)絇C機(jī)應(yīng)用程序中處理。
PCIe總線可以提供更大的總線帶寬,PCIe V3.0支持的最高總線頻率為4 GHz,遠(yuǎn)高于PCI-X總線支持的最高總線頻率。PCIe總線支持虛通路(Virtual Channel,VC)技術(shù),優(yōu)先級(jí)不同的數(shù)據(jù)報(bào)文可以使用不同的虛通路,而每一路虛通路可以獨(dú)立設(shè)置緩沖,從而相對(duì)合理地解決了數(shù)據(jù)傳送過(guò)程中存在的服務(wù)質(zhì)量問(wèn)題[2]。
本文描述的offload主要是指將原本在網(wǎng)絡(luò)協(xié)議棧中進(jìn)行的IP分片、TCP分段、重組、checksum校驗(yàn)等操作轉(zhuǎn)移到FPGA中進(jìn)行,以降低系統(tǒng)CPU負(fù)荷、提高處理性能。
TSO(TCP Segmentation Offload)就是把TCP分段的過(guò)程轉(zhuǎn)移到 FPGA中進(jìn)行,直接把不超過(guò)滑動(dòng)窗口大小的payload下傳給協(xié)議棧,而由FPGA進(jìn)行TCP分段操作,并執(zhí)行checksum計(jì)算和包頭、幀頭的生成工作。
UFO(UDP Fragmentation Offload)是一種專(zhuān)門(mén)針對(duì)UDP協(xié)議的特性,主要機(jī)制就是將IP分片的過(guò)程轉(zhuǎn)移到 FPGA中進(jìn)行,用戶層可以發(fā)送任意大小的UDP數(shù)據(jù)包(UDP數(shù)據(jù)包總長(zhǎng)度最大不超過(guò)64k),而不需要協(xié)議棧進(jìn)行任何分片操作。
LRO(Large Receive Offload)在FPGA層面上接收到多個(gè)TCP數(shù)據(jù)包,并將其聚合成一個(gè)大的數(shù)據(jù)包,然后上傳給應(yīng)用程序處理。這樣就可以減少CPU處理的開(kāi)銷(xiāo),提高系統(tǒng)接收TCP數(shù)據(jù)的能力和效率。
RSS(Receive Side Scaling)可以將不同的網(wǎng)絡(luò)數(shù)據(jù)流分成不同的隊(duì)列,再將這些隊(duì)列分配到多個(gè) CPU核心上進(jìn)行處理,從而將負(fù)荷分散,充分利用多核處理器的能力,提高數(shù)據(jù)接收的能力和效率。
網(wǎng)絡(luò)數(shù)據(jù)經(jīng)過(guò)FPGA主控處理后,通過(guò)PCIe總線傳遞給PC主機(jī)應(yīng)用程序處理,F(xiàn)PGA網(wǎng)卡傳輸功能框架如圖1所示。

圖1 網(wǎng)卡功能框架圖
網(wǎng)絡(luò)電路由PHY芯片及周?chē)娐方M成,PHY芯片選用Marvel公司的88e1111型號(hào),該芯片的特性為:支持GMII、RGMII和MII等接口;具備4個(gè)GMII時(shí)鐘模式;支持自適應(yīng)功能;可選擇2.5 V和1.0 V輸入輸出電壓。
FPGA芯片采用Xilinx公司Virtex-5系列芯片,包含多種硬 IP系統(tǒng)級(jí)模塊,包括強(qiáng)大的 36 kb Block RAM/FIFO、第二代25×18 DSP Slice、帶有內(nèi)置數(shù)控阻抗的SelectIO技術(shù)、ChipSync源同步接口模塊、系統(tǒng)監(jiān)視功能、帶有集成數(shù)字時(shí)鐘管理器(Digital Clock Manager,DCM)和鎖相環(huán)(Phase Locked Loop,PLL)時(shí)鐘發(fā)生器的增強(qiáng)型時(shí)鐘管理模塊以及高級(jí)配置選項(xiàng)[3]。
FPGA程序的組成框圖如圖2所示。FPGA程序主要實(shí)現(xiàn)如下功能:1)集成3個(gè)MAC核,實(shí)現(xiàn)與PHY芯片的通信以及以太網(wǎng)包的收發(fā);2)根據(jù) IP地址和PORT、數(shù)據(jù)類(lèi)型進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)分包,并加上時(shí)間戳信息;3)使用MircroBlaze配置IP/PORT/MAC地址等參數(shù);4)提供 PCIe接口接入 PC機(jī)操作系統(tǒng),處理與PC機(jī)的PCIe數(shù)據(jù)交換。

圖2 FPGA程序的組成框圖
本程序?qū)σ蕴W(wǎng)包的處理采用嵌入式操作系統(tǒng)+邏輯模塊的結(jié)構(gòu),網(wǎng)絡(luò)包處理模塊采用片內(nèi)邏輯資源設(shè)計(jì),實(shí)現(xiàn)對(duì)以太網(wǎng)包 1~3層的解析和數(shù)據(jù)分發(fā),收包流程如圖3所示。

圖3 網(wǎng)絡(luò)包處理模塊收包流程
按照上述流程,大部分以太網(wǎng)包由該模塊處理,或提交主機(jī)、或直接丟棄,其他少量命令/狀態(tài)包則提交給 MicroBlaze進(jìn)一步處理,如命令 UDP包、ARP包、ICMP包、TCP包和其他未識(shí)別的以太網(wǎng)包等,這樣既確保了對(duì)各通道UDP數(shù)據(jù)包的線速處理,同時(shí)利用MicroBlaze內(nèi)部的TCP/IP協(xié)議棧實(shí)現(xiàn)復(fù)雜網(wǎng)絡(luò)處理能力。
MicroBlaze除了解析命令UDP包外,還實(shí)現(xiàn)對(duì)返回給客戶端的狀態(tài)信息的打包,以及FPGA片內(nèi)外寄存器空間的配置和狀態(tài)收集。
PCIe總線支持3個(gè)獨(dú)立的物理地址空間:存儲(chǔ)器空間、IO空間和配置空間[4]。每個(gè)PCIe設(shè)備都有一個(gè)配置空間,配置空間采用ID尋址方法,用總線號(hào)、設(shè)備號(hào)、功能號(hào)和寄存器號(hào)來(lái)唯一標(biāo)識(shí)一個(gè)配置空間[5-6]。
FPGA的PCIe IP核在生成時(shí),會(huì)生成相應(yīng)的PCIe總線號(hào)、設(shè)備號(hào)等ID[7-8],驅(qū)動(dòng)程序通過(guò)設(shè)備ID和廠商ID對(duì)設(shè)備鏈進(jìn)行掃描,進(jìn)行匹配。驅(qū)動(dòng)與設(shè)備匹配之后,驅(qū)動(dòng)程序中申請(qǐng)內(nèi)存緩沖空間,提供DMA讀寫(xiě)接口將數(shù)據(jù)從PCIe總線傳輸?shù)絇C機(jī)應(yīng)用程序緩沖空間。
FPGA程序?qū)崿F(xiàn)了數(shù)據(jù)包的過(guò)濾,需要完成如下功能。
3.2.1 FPGA過(guò)濾規(guī)則配置
FPGA已從數(shù)字電路設(shè)計(jì)上實(shí)現(xiàn)了通道選擇,緩存大小設(shè)置,ARP協(xié)議、ICMP協(xié)議、IGMP協(xié)議、IP協(xié)議、UDP協(xié)議、TCP協(xié)議等網(wǎng)絡(luò)數(shù)據(jù)包過(guò)濾配置功能。應(yīng)用程序需要在初始化階段完成過(guò)濾規(guī)則的參數(shù)配置。
3.2.2 數(shù)據(jù)緩沖隊(duì)列
初始化緩沖隊(duì)列,網(wǎng)絡(luò)數(shù)據(jù)包經(jīng)過(guò)FPGA過(guò)濾之后,通過(guò)驅(qū)動(dòng)程序傳輸進(jìn)入內(nèi)存不同協(xié)議的數(shù)據(jù)緩沖隊(duì)列。
3.2.3 數(shù)據(jù)解析
根據(jù)網(wǎng)絡(luò)協(xié)議規(guī)范,從各種數(shù)據(jù)緩沖隊(duì)列中取出需要的數(shù)據(jù)提交給應(yīng)用程序處理,應(yīng)用程序工作流程如圖4所示。

圖4 應(yīng)用程序工作流程
使用本文設(shè)計(jì)的基于offload的FPGA實(shí)現(xiàn)網(wǎng)卡功能,進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸,并與普通網(wǎng)卡進(jìn)行對(duì)比,試驗(yàn)數(shù)據(jù)如表1所示。

表1 網(wǎng)絡(luò)數(shù)據(jù)傳輸比對(duì)
測(cè)試結(jié)果顯示:基于offload的FPGA實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)木W(wǎng)速提升明顯、沒(méi)有丟包、網(wǎng)速較穩(wěn)定無(wú)波動(dòng)情形。
本文設(shè)計(jì)了基于offload的FPGA實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸,其充分運(yùn)用了FPGA可編程的靈活性,具有結(jié)構(gòu)簡(jiǎn)單、易于控制、小型化、低功耗等特點(diǎn)。相關(guān)驗(yàn)證測(cè)試結(jié)果顯示:該設(shè)計(jì)傳輸網(wǎng)絡(luò)數(shù)據(jù)正確、工作穩(wěn)定可靠、傳輸速率提高20%以上、即使PC端應(yīng)用程序出現(xiàn)卡頓也無(wú)丟包、對(duì)實(shí)時(shí)數(shù)據(jù)的處理與存儲(chǔ)效率有所提升,具有實(shí)際工程應(yīng)用價(jià)值。
同時(shí),結(jié)合 FPGA豐富的資源及并行處理能力,后續(xù)可以考慮優(yōu)化應(yīng)用程序軟件架構(gòu),進(jìn)一步提高網(wǎng)絡(luò)數(shù)據(jù)傳輸與處理能力。