專利名稱:一種基于現(xiàn)場可編程門陣列的光纖i/o亂序幀處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)存儲技術(shù)領(lǐng)域,尤其是一種基于現(xiàn)場可編程門陣列(FPGA)的光纖通道協(xié)議,在I/O處理中接收到亂序幀進(jìn)行重新排列的處理方法。
背景技術(shù):
目前,在光纖通道(FC)協(xié)議中,交換由多個非并行的序列組成,而序列由多個相關(guān)的幀組成。由于發(fā)送節(jié)點(diǎn)重新發(fā)送丟失的幀或者同一序列的幀在傳輸網(wǎng)絡(luò)中通過不同路徑中傳輸,因此接收端口接收到幀的順序很可能和發(fā)送端口發(fā)送順序是不同的,稱為亂序的幀。接收端口需要將這些亂序的幀按照正確順序重新排序之后才通過DMA方式將之傳輸給接收節(jié)點(diǎn)緩存內(nèi)。接收端口可以通過光纖通道幀頭部內(nèi)的序列計(jì)數(shù)(Seq_Cnt)或者偏移 (Offset)進(jìn)行重新排序。處理方法一種直接的辦法是將這些亂序的幀暫時(shí)存起來,等到接收到其前面所有的幀之后,才將該幀傳送到接收節(jié)點(diǎn)。這種辦法在資源消耗和處理時(shí)間上效率都比較低下,因?yàn)閿?shù)據(jù)流中可能會有很多亂序的幀序列,這樣會消耗很多的存儲資源,同時(shí)在數(shù)據(jù)幀處理時(shí)間上并不均勻。另一種更加實(shí)際的辦法是接收端口在接收到亂序到達(dá)的幀之后,到系統(tǒng)緩存中依次查詢地址/長度列表,并計(jì)算亂序幀應(yīng)該存放的緩存地址,之后將該幀寫入到緩存對應(yīng)位置。但是,這種方法也有缺陷,當(dāng)數(shù)據(jù)流中有較多亂序幀時(shí),使用這種方式會反復(fù)在緩存中查詢地址/長度列表,這樣會延遲亂序幀的處理,且對整體傳輸性能造成一些影響?,F(xiàn)場可編程門陣列(FPGA)是一種十分靈活的可編程器件,用戶可多次對FPGA內(nèi)部的邏輯資源和I/O資源重新配置,以實(shí)現(xiàn)用戶需要的邏輯。光纖通道(FC)協(xié)議是一個復(fù)雜的協(xié)議簇,它支持多種服務(wù)和高層協(xié)議,同時(shí)光纖通道協(xié)議標(biāo)準(zhǔn)目前仍處于發(fā)展階段,其標(biāo)準(zhǔn)內(nèi)容仍在不斷完善過程中。使用FPGA實(shí)現(xiàn)光纖通道協(xié)議,可以方便對最新協(xié)議版本進(jìn)行更新支持。
發(fā)明內(nèi)容
本發(fā)明的目的是克服背景技術(shù)所述的現(xiàn)有處理亂序的幀的方法缺點(diǎn),在通過系統(tǒng)緩存中查詢地址/長度列表的方法基礎(chǔ)上,發(fā)明一種速度更快、效率高的處理方法。
為達(dá)上述發(fā)明目的,本發(fā)明采用的技術(shù)手段是
光纖通道的數(shù)據(jù)交換由多個非并行的序列組成,而序列由多個相關(guān)的幀組成;系統(tǒng)緩存中存有地址/長度列表;其特征是當(dāng)出現(xiàn)亂序的幀時(shí),首先在FPGA的本地存儲資源(例如BRAM等)組建一個亂序信息表項(xiàng),存儲當(dāng)前期望數(shù)據(jù)幀的“斷點(diǎn)”信息,然后通過系統(tǒng)緩存中查詢地址/長度列表,尋找亂序幀對應(yīng)的地址信息,并將該幀寫入緩存相應(yīng)位置;當(dāng)再次出現(xiàn)亂序幀時(shí),首先在亂序信息表項(xiàng)內(nèi)查詢是否存在期望偏移等于接收幀頭部內(nèi)的偏移,若存在則通過亂序信息表內(nèi)的斷點(diǎn)信息計(jì)算該亂序幀再緩存中的位置,并清除亂序信息表該項(xiàng)對應(yīng)信息;若在亂序信息表項(xiàng)內(nèi)查詢不到結(jié)果,再從緩存中查詢地址/長度列表,查找并計(jì)算亂序幀對應(yīng)的地址信息。所述的斷點(diǎn)信息是指期望偏移、緩存地址索引和緩存偏移。本發(fā)明的方法同樣適用于亂序幀的頭部序列計(jì)數(shù)(Seq_Cnt),對于按照序列計(jì)數(shù)進(jìn)行重新排序的情況,所述的斷點(diǎn)信息是指期望序列計(jì)數(shù)、緩存地址索引和緩存偏移。本發(fā)明的方法可以減少在緩存中搜索的地址/長度列表次數(shù),效率比普通的緩存搜索地址/長度列表方法高。而且?guī)蛄兄袥]有亂序幀存在時(shí),該幀交換將不占用亂序信息表項(xiàng),只有在出現(xiàn)亂序的幀交換中,才使用亂序信息表項(xiàng)記錄亂序幀的當(dāng)前”斷點(diǎn)”信息, 當(dāng)前亂序幀處理完畢之后,清空亂序信息表項(xiàng),這樣可以允許多個不同的幀交換分時(shí)共享存儲資源。
圖1是存儲設(shè)備在光纖通道(FC SAN)環(huán)境內(nèi)的拓?fù)溥B接。圖2是FC節(jié)點(diǎn)接收到數(shù)據(jù)幀的數(shù)據(jù)結(jié)構(gòu)描述。圖3是亂序信息表項(xiàng)格式。圖4是FC端口數(shù)據(jù)幀的處理流程圖。
具體實(shí)施例方式下面,以根據(jù)光纖通道幀頭部內(nèi)的偏移(Offset)字段進(jìn)行重新排序?yàn)槔?,說明本發(fā)明的實(shí)施方式。如圖1所示的一個的光纖通道(FC SAN)內(nèi)的拓?fù)溥B接內(nèi),交換網(wǎng)絡(luò)SAN包括5個交換機(jī)SWl、Sff2, Sff3, SW4和SW5,帶有HBA卡的主機(jī)端A與存儲設(shè)備B之間可通過兩條路徑完成數(shù)據(jù)通信,第一條路徑是A — SWl — SW2 - SW3 - SW5 一 B,另外一條路徑是A — Sffl - SW4 一 SW5 — B。當(dāng)主機(jī)端A和存儲設(shè)備B進(jìn)行通信時(shí),主機(jī)端A按照先后順序發(fā)送的數(shù)據(jù)幀可能分別通過兩條路徑傳送到存儲設(shè)備B,由于兩條路徑的傳輸延時(shí)不同,因此很可能在存儲設(shè)備B端存在亂序到達(dá)的數(shù)據(jù)幀。圖2為光纖(FC)節(jié)點(diǎn)接收幀的數(shù)據(jù)結(jié)構(gòu)描述,圖中交換狀態(tài)信息表、地址/長度列表以及數(shù)據(jù)緩存都存在系統(tǒng)緩存內(nèi)。交換狀態(tài)信息表內(nèi)的000位標(biāo)志當(dāng)前序列是否有亂序狀況,000_index標(biāo)志對應(yīng)著端口本地亂序信息表索引地址,系統(tǒng)驅(qū)動初始化時(shí)將會把這兩項(xiàng)設(shè)置為零,當(dāng)出現(xiàn)亂序幀后,由端口進(jìn)行配置和更新。Bufferjndex標(biāo)志地址/長度列表內(nèi)當(dāng)前地址/長度對的索引,而Buffer_0ffSet為當(dāng)前地址/長度對的索引指向緩存中偏移位置。EXpect_R0為期望下一個達(dá)到幀的偏移。Byte_C0Unt為該交換目前接收的數(shù)據(jù)幀(以byte為單位),Expect_byte_cnt為該交換所有數(shù)據(jù)幀的大小(以byte為單位)。AL_ Baseaddr為地址/長度列表的基地址。當(dāng)一個數(shù)據(jù)幀到達(dá)后,F(xiàn)C端口通過系統(tǒng)總線從緩存中取出交換狀態(tài)信息表,比較接收到數(shù)據(jù)幀頭部內(nèi)Offset字段和ExpeCt_R0是否相同,在所有數(shù)據(jù)幀到達(dá)順序和主機(jī)端 A發(fā)送順序相同的情況下,Offset字段和ExpeCt_R0是一直相同的,此時(shí)接收端口只需要根據(jù)AL_Baseaddr、Buffer_index和Buffer_offset就可以確定當(dāng)前數(shù)據(jù)幀的地址信息存放在地址/長度列表的位置,從地址/長度列表取出地址信息,并將數(shù)據(jù)幀存儲在緩存對應(yīng)位置,之后更新交換信息表內(nèi)的ExpeCt_R0字段、Bufferjndex字段、Buff er_offset字段和
4Byte_count 字段。按照傳統(tǒng)的方法,一旦在接收端口出現(xiàn)亂序數(shù)據(jù)幀,就需要讀出緩存中地址/長度列表多個地址/長度對項(xiàng),并計(jì)算亂序幀應(yīng)該存放在緩存中的地址,這可能需要多次訪問地址/長度列表。圖3為存在于FPGA本地的亂序信息表格式,它主要用來在出現(xiàn)亂序幀時(shí),存儲當(dāng)前期望數(shù)據(jù)幀在緩存中存放位置的“斷點(diǎn)”信息。亂序信息表包括字段有Exp_R0、Buff_ index和Buff_offset,Exp_R0為期望下一幀的偏移,Buffjndex為地址/長度列表內(nèi)當(dāng)前地址/長度對的索引,Buff_0ffSet為當(dāng)前地址/長度對的索引指向緩存中偏移位置。 亂序信息表內(nèi)的這三個字段分別對應(yīng)交換狀態(tài)信息表內(nèi)的ExpeCt_R0、Buffer_index和 Buffer_offset 字段。當(dāng)數(shù)據(jù)流中出現(xiàn)一個亂序幀時(shí),接收端口判斷本地是否有對應(yīng)該交換的亂序信息表,若本地不存在亂序信息表,則首先要建立亂序信息表,之后再將交換狀態(tài)信息表內(nèi)的 Expect_RO、Buffer_index和Buffer_offset字段保存在亂序信息表內(nèi)的對應(yīng)位置,接下來在緩存中地址/長度列表內(nèi)查找存儲該幀的地址信息。若本地存在亂序信息表,則首先在亂序信息表內(nèi)查找EXpect_R0字段,判斷有無與當(dāng)前收到亂序幀頭部內(nèi)偏移字段相同,若存在相同的ExpeCt_R0,則直接從亂序信息表取出Buffjndex和Buff_0ffset字段,與交換狀態(tài)信息表內(nèi)的AL_BaSeaddr —同計(jì)算出當(dāng)前亂序幀在緩存中地址信息。若在亂序信息表查詢不到相同的EXpect_R0字段,則在亂序信息表內(nèi)保存當(dāng)前”斷點(diǎn)”信息,之后再在緩存中地址/長度列表內(nèi)搜索地址/長度對,并計(jì)算出當(dāng)前亂序幀在緩存中存放位置。圖4為FC端口在接收到數(shù)據(jù)幀時(shí)的流程圖,詳細(xì)地描述了接收端口對亂序數(shù)據(jù)幀的處理過程。在步驟1中,接收端系統(tǒng)驅(qū)動會準(zhǔn)備存放數(shù)據(jù)幀的緩存塊地址,填寫地址/長度列表信息,并初始化交換狀態(tài)信息表。步驟2中,端口會不斷檢查有無收到的數(shù)據(jù)幀。當(dāng)端口接收到一個數(shù)據(jù)幀后執(zhí)行步驟3,通過系統(tǒng)總線從緩存中讀出該交換對應(yīng)的交換狀態(tài) fn息表ο步驟4中,端口會比較接收數(shù)據(jù)幀頭部內(nèi)Offset字段和交換狀態(tài)信息塊內(nèi)的 Expect_R0字段,判斷接收的數(shù)據(jù)幀是否為亂序幀。若數(shù)據(jù)幀偏移Offset字段和EXpect_R0 字段相等,說明當(dāng)前接收的數(shù)據(jù)幀與先前的接收是連續(xù)的;若兩者并不相等,則當(dāng)前接收的數(shù)據(jù)幀相對于先前的接收是亂序的。對于第一種情況,如步驟5所示,根據(jù)交換狀態(tài)信息表內(nèi)的AL_BaSeaddr字段和 Buffer_index字段,從地址/長度列表取出對應(yīng)的地址/長度對,結(jié)合Buffer_offset字段,即可確定出當(dāng)前數(shù)據(jù)幀在緩存中存放地址信息,之后執(zhí)行步驟15和16,按照獲得的地址信息將數(shù)據(jù)幀寫入緩存中相應(yīng)位置,并根據(jù)具體條件更新交換狀態(tài)信息表內(nèi)的Buffer_ index 字段、Buffer_offset 字段、Expect_R0 字段禾口 Byte_count 字段。對于第二種情況,則執(zhí)行步驟6,通過查看交換狀態(tài)信息表內(nèi)的000字段是否有效,判斷本地亂序信息表是否存在。若000字段有效,則首先執(zhí)行步驟7,查詢亂序信息表內(nèi) Exp_R0字段是否有和當(dāng)前接收數(shù)據(jù)幀的Offset字段相同記錄。若在本地亂序信息表查詢得到記錄,則執(zhí)行步驟9,從亂序信息表取出BufTjndex和BufT_0fTSet字段,與交換狀態(tài)信息表內(nèi)的AL_BaSeaddr —同計(jì)算出當(dāng)前亂序幀在緩存中地址信息,同時(shí)將該行記錄信息從亂序信息表內(nèi)刪除。此后執(zhí)行步驟10,檢查此時(shí)亂序信息表內(nèi)有無其它記錄;若無,則需要設(shè)置000變量和000_index變量無效,并清空該亂序信息表。如果步驟6中000字段無效,在步驟12中創(chuàng)建一個亂序信息表,并設(shè)置000變量和000_indeX變量,之后和步驟8中亂序信息表內(nèi)查詢不到等于偏移(offset)字段的記錄一樣,則執(zhí)行步驟13,根據(jù)交換狀態(tài)信息表內(nèi)的 AL_Baseaddr 字段、Expect_R0 字段、Buffer_index 字段和 Buffer_offset 字段以及接收數(shù)據(jù)幀頭部內(nèi)Offset字段,在地址/長度列表內(nèi)的查找當(dāng)前接收數(shù)據(jù)幀需要的地址/長度對信息,并在步驟14中計(jì)算出當(dāng)前數(shù)據(jù)幀在緩存中存放地址信息。在取得當(dāng)前數(shù)據(jù)幀在緩存中存放地址信息后,執(zhí)行步驟15和16,存儲數(shù)據(jù)幀到緩存適當(dāng)位置,并根據(jù)具體要求,更新交換狀態(tài)信息表內(nèi)的Bufferjndex字段、Buffer, offset字段、Expect_R0字段和Byte_count字段,若000變量和000_index變量設(shè)置,還需要清除交換狀態(tài)信息表內(nèi)的000字段和000_indeX字段。步驟17中,檢查設(shè)置后的Byte_ count字段是否等于交換狀態(tài)信息表內(nèi)的ExpeCt_byte_Cnt,若不相等,說明數(shù)據(jù)幀沒有接收完畢,回到步驟2重新接收下一幀;若兩者相等,則說明數(shù)據(jù)幀接收完畢,執(zhí)行步驟18,向系統(tǒng)發(fā)送完成請求,通知系統(tǒng)處理接收完畢的數(shù)據(jù)。如果亂序數(shù)據(jù)幀之間偏移相差比較大時(shí),為得到正確的地址/長度對,可能需要多次搜索地址/長度列表。通過引入本地亂序信息表,可以在接收端口出現(xiàn)亂序數(shù)據(jù)幀時(shí), 減少在緩存中地址/長度列表的搜索地址/長度對的過程。由于在只有在出現(xiàn)亂序的幀交換才需要亂序信息表,這樣就可以允許并行的幀交換可以分時(shí)共享建立亂序信息表需要的存儲資源。以上實(shí)施例是基于幀頭部偏差的處理方法,同時(shí)對基于光纖通道幀頭部內(nèi)的序列計(jì)數(shù)(Seq_Cnt)也有同樣效果。
權(quán)利要求
1.一種基于現(xiàn)場可編程門陣列的光纖I/O亂序幀處理方法,光纖通道的交換由多個非并行的序列組成,而序列由多個相關(guān)的幀組成;系統(tǒng)緩存中存有地址/長度列表;其特征是當(dāng)出現(xiàn)亂序的幀時(shí),首先在FPGA的本地存儲資源(例如BRAM等)組建一個亂序信息表項(xiàng),存儲當(dāng)前期望數(shù)據(jù)幀的“斷點(diǎn)”信息,然后通過系統(tǒng)緩存中查詢地址/長度列表,尋找亂序幀對應(yīng)的地址信息,并將該幀寫入緩存相應(yīng)位置;當(dāng)再次出現(xiàn)亂序幀時(shí),首先在亂序信息表項(xiàng)內(nèi)查詢是否存在期望偏移等于接收幀頭部內(nèi)的偏移,若存在則通過亂序信息表內(nèi)的斷點(diǎn)信息計(jì)算該亂序幀再緩存中的位置,并清除亂序信息表該項(xiàng)對應(yīng)信息;若在亂序信息表項(xiàng)內(nèi)查詢不到結(jié)果,再從緩存中查詢地址/長度列表,查找并計(jì)算亂序幀對應(yīng)的地址信息。
2.根據(jù)權(quán)利要求1所述的一種基于現(xiàn)場可編程門陣列的光纖通道I/O亂序幀處理方法,其特征是所述的斷點(diǎn)信息是指期望偏移、緩存地址索引和緩存偏移。
3.根據(jù)權(quán)利要求1所述的一種基于現(xiàn)場可編程門陣列的光纖通道I/O亂序幀處理方法,其特征是所述的斷點(diǎn)信息是期望序列計(jì)數(shù)、緩存地址索引和緩存偏移。
全文摘要
本發(fā)明是一種基于現(xiàn)場可編程門陣列的光纖I/O亂序幀處理方法,涉及一種存儲技術(shù),其特征是在FC數(shù)據(jù)幀接收過程中出現(xiàn)亂序幀時(shí),通過在系統(tǒng)緩存反復(fù)查找地址/長度列表基礎(chǔ)上,利用FPGA內(nèi)的本地存儲資源組建一個亂序信息表項(xiàng),用來在出現(xiàn)亂序幀時(shí),存儲當(dāng)前期望數(shù)據(jù)幀的“斷點(diǎn)”信息。當(dāng)再次出現(xiàn)亂序幀時(shí),首先在亂序信息表項(xiàng)內(nèi)查詢是否存在期望偏移等于接收幀頭部內(nèi)的偏移。若在亂序信息表項(xiàng)內(nèi)查詢不到結(jié)果,再從緩存中查詢地址/長度列表,查找并計(jì)算亂序幀對應(yīng)的地址信息,這樣可以減少在緩存中搜索的地址/長度列表次數(shù),提高數(shù)據(jù)交換的效率。
文檔編號H04L1/00GK102215162SQ20111007138
公開日2011年10月12日 申請日期2011年3月24日 優(yōu)先權(quán)日2011年3月24日
發(fā)明者張慶敏, 張衡, 李天仁, 胡剛 申請人:無錫眾志和達(dá)存儲技術(shù)有限公司