OpenFastPath 學習4(slow path)
接著上一文章,大致分析一下: sp_rx_thread 和 sp_tx_thread執行緒。
與tilera的mpipe抓包不一樣,OpenFastPath通過ODP(dpdk)抓包時,是一股腦全抓上來的,抓上來之後,一看,不是我要抓的包,那咋辦?再塞回去唄。於是,它採用年linux核心自帶的虛擬網絡卡(tun)。用於將某些抓到的資料包再塞回核心協議棧,通過核心協議棧到達上層。
在ofp_packet_input函式中,在使用者態收到包之後, res = pkt_func(&pkt); 會進行進一步的協議分析(arpip),如果需要繼續處理(continue),最後會呼叫 ofp_sp_input,將資料包放入佇列,然後在sp_rx_thread執行緒中,會從該佇列取出資料包,並調研write,寫入核心協議棧。
發包也有這種情況。執行OpenFastPath的linux機器上,有兩種應用:一種是用OpenfastPath開發的網路程式;一種是傳統的程式,比如系統的telnet命令。前一種程式採用使用者態協議棧傳送資料,因此稱為FastPath。後一種是傳統的應用,資料會進入到核心協議棧。通過路由設定,我們可以讓核心要發出去的包到達虛擬網絡卡,然後 sp_tx_thread 執行緒通過read將資料包讀到使用者態,最終通過發包函式發出去。
sp_rx_thread 和 sp_tx_thread執行緒不需要太快,因此,他們應該是繫結在控制平面核上。主要原始碼: ofp_ifnet.c的ofp_ifnet_create函式,SP巨集所包括的內容。

與虛擬網絡卡通訊的兩個執行緒