OpenFastPath 學(xué)習(xí)4(slow path)

接著上一文章,大致分析一下: sp_rx_thread 和 sp_tx_thread線程。

與tilera的mpipe抓包不一樣,OpenFastPath通過ODP(dpdk)抓包時(shí),是一股腦全抓上來的,抓上來之后,一看,不是我要抓的包,那咋辦?再塞回去唄。于是,它采用年linux內(nèi)核自帶的虛擬網(wǎng)卡(tun)。用于將某些抓到的數(shù)據(jù)包再塞回內(nèi)核協(xié)議棧,通過內(nèi)核協(xié)議棧到達(dá)上層。

在ofp_packet_input函數(shù)中,在用戶態(tài)收到包之后, res = pkt_func(&pkt); 會(huì)進(jìn)行進(jìn)一步的協(xié)議分析(arpip),如果需要繼續(xù)處理(continue),最后會(huì)調(diào)用 ofp_sp_input,將數(shù)據(jù)包放入隊(duì)列,然后在sp_rx_thread線程中,會(huì)從該隊(duì)列取出數(shù)據(jù)包,并調(diào)研write,寫入內(nèi)核協(xié)議棧。

發(fā)包也有這種情況。運(yùn)行OpenFastPath的linux機(jī)器上,有兩種應(yīng)用:一種是用OpenfastPath開發(fā)的網(wǎng)絡(luò)程序;一種是傳統(tǒng)的程序,比如系統(tǒng)的telnet命令。前一種程序采用用戶態(tài)協(xié)議棧發(fā)送數(shù)據(jù),因此稱為FastPath。后一種是傳統(tǒng)的應(yīng)用,數(shù)據(jù)會(huì)進(jìn)入到內(nèi)核協(xié)議棧。通過路由設(shè)置,我們可以讓內(nèi)核要發(fā)出去的包到達(dá)虛擬網(wǎng)卡,然后 sp_tx_thread 線程通過read將數(shù)據(jù)包讀到用戶態(tài),最終通過發(fā)包函數(shù)發(fā)出去。

sp_rx_thread 和 sp_tx_thread線程不需要太快,因此,他們應(yīng)該是綁定在控制平面核上。主要源碼: ofp_ifnet.c的ofp_ifnet_create函數(shù),SP宏所包括的內(nèi)容。

與虛擬網(wǎng)卡通信的兩個(gè)線程
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容