接著上一文章,大致分析一下: 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)容。