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


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