先說一下應用環(huán)境:
采用Tilera的平臺(一種眾核平臺,),三張網(wǎng)卡,兩個10G的xgbe網(wǎng)卡,用來進行數(shù)據(jù)的發(fā)送和接受;一個1G的普通網(wǎng)卡,用來做管理接口.
10G的xgbe工作在Tilera的特定sdk下,其中的數(shù)據(jù)包不經(jīng)過內核協(xié)議棧,直接交付給用戶。這樣的好處是數(shù)據(jù)處理效率很高(普通的linux協(xié)議棧中需要兩次內存的拷貝,效率低),但是也因此帶來了一些問題,有些包需要交給標準的協(xié)議棧 ,比如ospf報文,zebra工作在用戶態(tài),需要從標準的協(xié)議棧內獲取網(wǎng)絡數(shù)據(jù)包,而xgbe是不會直接把數(shù)據(jù)交付給標準協(xié)議棧的。
TAP虛擬網(wǎng)卡是Linux標準的虛擬網(wǎng)絡設備,在Tilera平臺上其編程也是一樣的。
擁有這樣的虛擬網(wǎng)卡后可以利用其通用linux協(xié)議棧的特性,并可以將數(shù)據(jù)包交付應用層的socket程序處理。ospfd程序就可以利用TAP進程收到ospf報文,并發(fā)布默認路由出去。


上圖是TAP網(wǎng)卡的收發(fā)包流程圖
左側紅色箭頭標示的為從協(xié)議棧經(jīng)TAP網(wǎng)卡發(fā)包標示,對從tap讀進來的包進行一下netio封裝,然后經(jīng)過xbge發(fā)送出去
右側綠色箭頭標示的為數(shù)據(jù)包經(jīng)TAP網(wǎng)卡收至協(xié)議棧的流程,調用netio(tilera 特定的網(wǎng)絡編程api)從xgbe中收到發(fā)送給tap的報后,經(jīng)過包處理進程將數(shù)據(jù)包交付給TAP進程,其實就是將收到的包寫進tap網(wǎng)卡中,這樣用戶進程就可以再內核協(xié)議棧中接受到通過xgbe發(fā)送來的包。