一種支持多類型網卡鏈路聚合的零拷貝方法
2023-04-23 21:14:31 5
專利名稱:一種支持多類型網卡鏈路聚合的零拷貝方法
技術領域:
本發明涉及一種零拷貝捕包方法,具體地說是一種可支持多類型網卡、 實現鏈路聚合功能的零拷貝方法。
背景技術:
在高速網絡環境中,進行偵聽,檢測等工作的應用軟體需要高效的報文
捕獲方式,也就是零拷貝捕包方式,在傳統的零拷貝捕包軟體中, 一般採用
內核驅動和應用接口庫兩層結構。內核驅動負責向報文緩衝區中寫入報文, 應用接口庫負責把報文緩沖區提交給應用,當應用軟體處理完報文後,會再
把緩衝區通過應用接口庫釋放,以便內核驅動向緩衝區寫入新的報文。
在傳統的零拷貝軟體中,當一個應用在一塊網卡上捕包時,應用通過零
拷貝接口庫和內核緩衝區共同操作一個緩沖區隊列。但是隨著CPU計算能力
的增強,現在一臺伺服器已經有能力處理多塊網卡上的流量,所以需要零拷 貝軟體提供鏈路聚合功能,把多個網卡的流量聚合成一個數據流提交給應用 軟體。
實現鏈路聚合的一般方法是,在接口庫中建立一系列緩沖隊列,對應每 個網卡設備有一個隊列,當接口庫向應用提交報文緩衝區時,接口庫對每個
網卡進行輪詢,並尋找一個緩衝區給應用;當應用釋放緩沖區時,接口庫根 據緩衝區的位置計算緩衝區屬於哪個網卡,把緩衝區放入該網卡的空閒隊列。
隨著應用需求的發展,現有技術方案出現了可擴展性不好的缺點,因為 很多高速網上的報文處理應用需要特殊的定製化的網卡硬體,在這些定製網 卡上,往往要對原始的網絡報文做一些預處理,常見的是在原始報文結構前面增強一個額外的數據結構,或者把多個小報文拼合在一個緩衝區內。由於 不同的捕包網卡上傳的報文結構不同,現有的技術方案中,應用接口庫把緩 衝區和報文作為 一致的數據結構處理,導致一套接口庫只能在一種類型的網 卡設備上使用,無法解決一個應用使用多種網卡的問題。
發明內容
本發明的目的在於解決現有技術方案的缺點,從而提供一種通過將現有 技術中的捕包應用接口層劃分為緩沖區接口層和報文接口層的分層結構實現 對多類型網卡的報文的聚合、對應用提供分流、過濾等附加功能的零拷貝方 法。
為實現上述發明目的,本發明通過如下技術方案實現 一種支持多類型 網卡鏈路聚合的零拷貝方法,包括如下步驟
A) 應用程式調用接口庫提供的緩衝區接口層函數打開設備接口,對各網
卡指定一個用於區分不同類型網卡的類型號碼,將各類型號碼記錄在設備類 型列表中;在各網卡的內核驅動中都增加一個用於返回網卡類型號碼的系統 調用命令;
B) 緩沖區接口層提供的打開設備接口函數在用戶空間中申請一片連續的 內存作為緩衝區,並將緩沖區首地址傳給內核驅動;
C) 內核驅動申請連續的頁面來構造緩衝區隊列的控制結構,並把控制結 構的物理地址傳給緩衝區接口層函數;
D) 接口函數根據緩衝區控制結構的地址,通過內存映射得到緩沖區控制 結構中的信息;
E) 應用程式調用接口庫提供的報文接口層函數打開設備接口 ,通過各網 卡設備的系統調用命令獲得各網卡設備的類型號碼,並將記錄所有號碼的設 備類型列表記錄在一個全局數據結構中,報文接口層根據類型號碼對相應網 卡設備的緩衝區進行操作;
F) 在用戶空間中為應用新建報文指針隊列,將從緩沖區中提取出的報文
5指針放入報文指針隊列,應用程式對報文指針隊列中的報文數據進行處理。
所述步驟B中緩沖區的大小為2KB,為保證在用戶空間申請的緩沖區位於 連續的內存頁面上,接口庫函數申請的內存為共享內存,因為在linux操作 系統中,共享內存位於連續的物理頁面上,具體操作為
Bl)接口庫函數在用戶空間申請共享緩沖區,並連接到共享緩衝區; B2)接口庫函數把共享緩衝區的首地址通過ioctl系統調用命令傳給內 核驅動。
B3)內核驅動計算緩沖區隊列中每個緩沖區的物理地址,並將所述地址 保存在一張物理地址表中以便DMA使用;
所述步驟C中的緩沖區控制結構包括緩沖區隊列,此隊列包括空閒隊列、 接收緩沖區隊列、描述驅動工作模式的正常模式和直接拷貝模式,用於進程 同步及互斥的變量等。
所述步驟D的具體步驟為
Dl )用戶接口庫函數從系統調用返回的數據結構中獲得內核驅動中構造 的緩衝區隊列控制結構的物理地址;
D2)用戶接口庫函數打開內存設備文件;
D 3 )用戶接口庫函數通過系統調用把內核中的緩衝區控制結構映射到自 己的地址空間。
所述步驟F的具體步驟為
Fl )報文接口層提供的打開設備接口函數在用戶空間中新建報文指針隊
列;
F2 )報文接口庫的報文提取函數通過設備類型列表判斷各網卡的緩衝區 中的結構,從而提取出報文指針,放入報文指針隊列中。
F3 )報文獲取接口函數從全局數據結構中得到報文指針隊列; F4)當獲取報文接口被應用程式調用時,報文接口層函數從接收報文指 針隊列中取出 一報文,緩沖區接口層繼續從填滿報文的緩衝區中定位每個報 文,以提取出報文首地址指針存入報文接口層的接收報文指針隊列。F5)當報文被應用程式4吏用完後即釋放才艮文接口淨皮應用程式調用時,報 文接口層函數向釋放報文指針隊列中插入一報文,緩沖區接口層通過驅動把 釋放了報文的緩沖區傳給相應的網卡設備,等待網卡設備再次向緩衝區中寫 入報文。
所述全局數據結構是在用戶空間申請一塊連續的內存所構建的,其成員 包括接收報文指針隊列和釋放報文指針隊列。
本發明所帶來的有益效果為
1、 本發明通過分層結構,將現有的應用接口層劃分為緩沖區接口層和 報文接口層,緩衝區接口層不關心具體設備的緩衝區結構,報文接口層根據 設備類型從緩沖區提取報文,這樣不同設備的報文數據流可以在報文接口層 聚合為一個數據流,實現同 一臺機器上混合使用多種類型的網卡。
2、 本發明通過採用分層結構,實現了接口庫針對不同設備的代碼,只 有報文接口層不同,可以方便軟體的移植和擴展。
圖1是應用接口層的結構示意圖,圖中虛線框中為現有技術的應用接口 層,本發明中將其拆分為緩衝區接口層和報文接口層; 圖2是實現本發明零拷貝方法的流程示意圖。
具體實施例方式
下面結合附圖,以兩種類型網卡(網卡A和網卡B)為例對本發明作進一 步說明。
如圖1所示,本發明通過分層結構,將現有零拷貝技術的捕包應用接口 層劃分為緩衝區接口層和報文接口層,在緩沖區接口層中只有緩衝區的概 念,只針對一個網絡設備和一個緩沖區隊列進行操作,不再關心緩衝區內的 數據結構,緩沖區接口層A面向網卡A,緩衝區接口層B面向網卡B;報文接口層面向應用,使用設備類型列表,對每個設備的緩衝區進行獲取和釋放操 作,把報文結構從緩沖區提取出來,並進行多網卡的報文的聚合。 圖2為實現本發明零拷貝方法的總體流程圖。
A) 應用程式調用接口庫提供的緩沖區接口層函數打開設備接口,對各網 卡指定一個用於區分不同類型網卡的類型號碼,設備類型列表是一個全局數 組dev—type[],每類設備有一個全局唯一的類型號碼,設定網卡A的類型號 碼為1,網卡B的類型號是2,那麼就在設備類型列表中記錄dev—type[A]= 1, dev—type[B] =2。在網卡A和網卡B的驅動中均^是供ioctl接口 , ioctl 接口中提供GET-DEV-TYPE命令,該命令返回設備的類型號碼,用戶空間的函 數可以通過使用GET-DEV—TYPE命令調用網卡A和網卡B的ioctl接口,獲得 相應網卡設備的類型號碼。
B) 緩沖區接口層提供的打開設備接口函數在用戶空間中申請一片連續的 內存作為報文緩衝區,並將緩沖區首地址傳給內核驅動。在本步驟中,檢查 系統初始設置的最大共享內存值,若請求內存值大於系統默認共享內存值, 則對系統默認內存值進行修改,根據所需的內存大小來分配共享內存,成功 返回內存的起始地址後,就可以對內存進行保存數據或鎖定操作。在使用完 內存後,將此內存歸還給系統。
緩衝區隊列是由一系列指向緩衝區的指針組成的循環隊列,內核驅動分 別從緩沖區隊列A和緩衝區隊列B中取出空閒緩衝區,將網卡A的報文傳送 到緩衝區隊列A中的空閒緩衝區中,將網卡B的報文傳送到緩沖區隊列B中 的空閒緩衝區。
C )首先內核驅動根據整個緩沖區隊列的大小計算需要的緩衝區控制結構 的大小,其次內核驅動申請連續的頁面來構造緩沖區隊列的控制結構,再次 內核驅動計算緩衝區隊列中每個緩衝區的物理地址,保存在一張物理地址表 中以便畫A使用,最後內核驅動計算緩沖區隊列控制結構的物理地址傳給緩 衝區接口層函數。
緩衝區控制結構的成員包括緩衝區隊列,此隊列的結構包括空閒隊列、接收緩衝區隊列、描述驅動工作模式的正常模式和直接拷貝模式,用於 進程同步及互斥的變量等。控制句柄進行初始化時,將每一塊緩沖區的首地
址轉換成內核空間的物理地址,即DMA操作所需的地址,存儲在物理地址表 中。
D) 首先,緩衝區接口庫接口函數從系統調用返回數據結構中獲得內核驅 動中構造的緩衝區隊列控制結構的物理地址;其次,打開內存設備文件 /dev/mem;最後,通過系統調用mmap把內核中的緩衝區控制結構映射到自己 的i也址空間。
E) 應用程式調用接口庫提供的報文接口層函數打開設備接口,通過各網 卡設備的ioctl系統調用命令獲得各網卡設備的類型號碼,並將記錄所有號 碼的設備類型列表記錄在 一個全局數據結構中,報文接口層根據類型號碼對 相應網卡設備的緩衝區進行操作。
在用戶空間申請一塊連續的內存作為全局數據結構,其成員包括接收報 文指針隊列和釋放才艮文指針隊列。
由報文接口層的函數到網卡設備列表中找到各網卡設備,並調用這些網 卡設備的緩衝區接口層的函數打開設備接口,通過各網卡設備的ioctl系統 調用命令獲得各網卡設備的類型號碼,將記錄所有號碼的設備類型列表記錄 在全局數據結構中。
F )首先,報文接口層提供的打開設備接口函數在用戶空間的數據結構中 新建報文指針隊列,所述報文指針隊列中的隊列元素是指向每個報文的指 針,這些報文是從多個不同設備獲得的。報文接口庫的報文提取函數通過設 備類型列表判斷網卡A和網卡B的緩衝區中的結構,從而提取出報文指針, 放入報文指針隊列中;
報文獲取接口函數從全局數據結構中獲取報文指針隊列,當獲取報文接 口被應用程式調用時,報文接口層函數從接收報文指針隊列中取出 一報文, 應用程式便對此報文進行相應處理,此時緩衝區接口層繼續從填滿報文的緩 衝區中定位每個報文,以提取出報文首地址指針存入報文接口層的接收報文
9指針隊列;當報文被應用程式使用完後即釋放報文接口被應用程式調用時, 報文接口層函數向釋放報文指針隊列中插入一報文,此時緩沖區接口層通過 驅動把釋放了報文的緩沖區傳給相應的網卡設備,等待網卡設備再次向緩衝 區中寫入報文。
應用程式會不斷從報文指針隊列中獲取報文指針,此時被提取的報文數 據便會形成一個數據流,以實現數據的聚合。
實施例2
本實施例的結構和操作步驟基本同與實施例1,唯有不同之處在於,所 述步驟B中每個緩沖區的大小為2KB,為保證在用戶空間申請的緩衝區位於連 續的內存頁面上,接口庫函數申請的內存為共享內存,因為在linux作業系統 中,共享內存位於連續的物理頁面上。具體操作為
Bl)在接口庫函數申請共享緩衝區,並連接到共享緩沖區。 B2)接口庫函數4巴共享緩衝區的首地址通過ioctl系統調用命令傳給內 核驅動。
最後應當說明的是以上實施例僅用以說明本發明的技術方案而非對其 限制,儘管參照上述實施例對本發明進行了詳細的說明,所屬領域的普通技 術人員英當理解依然可以對本發明的具體實施方式
進行修改或者等同替換, 而未脫離本發明精神和範圍的任何修改或者等同替換,其均應涵蓋在本發明 的權利要求範圍當中。
權利要求
1、一種支持多類型網卡鏈路聚合的零拷貝方法,其特徵在於,所述方法包括如下步驟A)應用程式調用接口庫提供的緩衝區接口層函數打開設備接口,對各網卡指定一個用於區分不同類型網卡的類型號碼,將各類型號碼記錄在設備類型列表中;在各網卡的內核驅動中都增加一個用於返回網卡類型號碼的系統調用命令;B)緩衝區接口層提供的打開設備接口函數在用戶空間中申請一片連續的內存作為緩衝區,並將緩衝區首地址傳給內核驅動;C)內核驅動申請連續的頁面來構造緩衝區隊列的控制結構,並把控制結構的物理地址傳給緩衝區接口層函數;D)接口函數根據緩衝區控制結構的地址,通過內存映射得到緩衝區控制結構中的信息;E)應用程式調用接口庫提供的報文接口層函數打開設備接口,通過各網卡設備的系統調用命令獲得各網卡設備的類型號碼,並將記錄所有號碼的設備類型列表記錄在一個全局數據結構中,報文接口層根據類型號碼對相應網卡設備的緩衝區進行操作;F)在用戶空間中為應用新建報文指針隊列,將從緩衝區中提取出的報文指針放入報文指針隊列,應用程式對報文指針隊列中的報文數據進行處理。
2、 根據權利要求1所述的零拷貝方法,其特徵在於,所述步驟B中緩沖區的大小為2KB,為保證在用戶空間申請的緩沖區位於連續的內存頁面上,接口庫函數申請的內存為共享內存,因為在linux作業系統中,共享內存位於連續的物理頁面上,具體操作為Bl)接口庫函數在用戶空間申請共享緩沖區,並連接到共享緩衝區;B2)接口庫函數把共享緩沖區的首地址通過ioctl系統調用命令傳給內核驅動。B3)內核驅動計算緩沖區隊列中每個緩衝區的物理地址,並將所述地址保存在一張物理地址表中以《更DMA使用;
3、 根據權利要求1所述的零拷貝方法,其特徵在於所述步驟C中的緩衝區控制結構包括緩衝區隊列,此隊列包括空閒隊列、接收緩沖區隊列、描述驅動工作模式的正常模式和直接拷貝模式,用於進程同步及互斥的變量等。
4、 根據權利要求1所述的零拷貝方法,其特徵在於,所述步驟D的具體步驟為Dl )用戶接口庫函數從系統調用返回的數據結構中獲得內核驅動中構造的緩沖區隊列控制結構的物理地址;D2)用戶接口庫函數打開內存設備文件;D3)用戶接口庫函數通過系統調用把內核中的緩沖區控制結構映射到自己的地址空間。
5、 根據權利要求1所述的零拷貝方法,其特徵在於,所述步驟F的具體步驟為Fl )報文接口層提供的打開設備接口函數在用戶空間中新建報文指針隊列;F2 )報文接口庫的報文提取函數通過設備類型列表判斷各網卡的緩沖區中的結構,從而提取出報溫指針,放入報文指針隊列中。F3 )報文獲取接口函書從全局數據結構中得到報文指針隊列;F4)當獲取報文接口被應用程式調用時,報文接口層函數從接收報文指針隊列中取出 一報文,緩沖區接口層繼續從填滿報文的緩沖區中定位每個報文,以提取出報文首地址指針存入報文接口層的接收報文指針隊列。F5)當報文被應用程式使用完後即釋放才艮文接口被應用程式調用時,報文接口層函數向釋放報文指針隊列中插入一報文,緩沖區接口層通過驅動把釋放了報文的緩衝區傳給相應的網卡設備,等待網卡設備再次向緩衝區中寫入報文。
6、 根據權利要求1或5任一所述的零拷貝方法,其特徵在於所述全局數據結構是在用戶空間申請一塊連續的內存所構建的,其成員包括接收報文指針隊列和釋放才艮文指針隊列。
全文摘要
本發明涉及零拷貝捕包方法,具體地說是一種可支持多類型網卡、實現鏈路聚合功能的零拷貝方法,所述零拷貝方法包括A緩衝區接口層函數打開設備接口;B在用戶空間緩衝區;C構造緩衝區隊列;D接口函數通過內存映射得到緩衝區控制結構的信息;E報文接口層函數打開設備接口;F為應用新建報文指針隊列,從緩衝區中提取出報文指針放入報文指針隊列,應用程式報文指針隊列中的報文數據進行處理。本發明採用分層結構,將現有的應用接口層劃分為不關心具體設備緩衝區結構的緩衝區接口層和根據設備類型從緩衝區提取報文的報文接口層,實現了同一臺機器上混合使用多種類型的網卡,並且方便了軟體的移植和擴展。
文檔編號G06F13/20GK101540720SQ200810114690
公開日2009年9月23日 申請日期2008年6月6日 優先權日2008年6月6日
發明者劉朝輝, 軍 歷, 宇 曾, 華 聶 申請人:曙光信息產業(北京)有限公司