1. 程式人生 > >將DPDK移植到snort上的DAQ

將DPDK移植到snort上的DAQ

DAQ 與Snort

在snort-daq中,daq的控制流程是這樣的。
snort_daq
如上所述,Snort在初始化的時候載入了daq。這個時候snort的所呼叫的api是daq_load_modules。也就是說,這個時候在主執行緒沒有啟動網絡卡,初始化例項的操作。
在初始化整個snort之後(載入配置,載入daq及其他各個模組等等)。snort就進入了分析的階段了。這個階段的主角是
pig,或者說更本質的,是pig下的analyzer
Snort下面開n個pig執行緒。pig執行緒下面呼叫analyzer來進行包解析。
包解析的過程中是在pig執行緒中多執行緒並行進行的。每一個analyzer

下面都初始化一個daq instance並呼叫acquire進行抓包並分析。每一個daq instance下面都有一個或多個網絡卡來獲取資料。因為目的主要是介紹daq,所以怎麼解析就不提了。
pig_daq
從上圖和上面的介紹就可以看得出來,一個snort下面有多個daq instance並行執行。每一個daq instance都會進行初始化操作,佔用系統資源,獲取網絡卡,抓包,呼叫callback,之間相互獨立。並且是單執行緒的。

DAQ與DPDK

如上面所介紹的。DAQ在設計的時候是單執行緒的。在本身的實現的幾個模組中(Netmap,pcap等等)完全沒有涉及到多執行緒的事情。在snort中的呼叫也是單執行緒並行呼叫的,相互之間各不影響。而Inter的DPDK在多執行緒方面則有限制。它所初始化的EAL

層只能初始化一次。一個程式中只能執行一個dpdk主程式。所以就沒有辦法在snort中使用多執行緒。因為如果在snort中使用了多執行緒。那麼實際上每個執行緒都會去嘗試初始化dpdk的EAL。那麼就會出錯,導致最後只有一個執行緒能夠成功初始化並啟動。
所以如果要想實現一個支援snort多執行緒的daq。就需要修改daq中api的邏輯。
在實現中,利用執行緒id來繫結網絡卡。
在daq的content中加入了一個nic-threadid的對映表。然後每個網絡卡都有一個獨立的instance儲存原本在daq_content中的資訊。然後線上程呼叫daq相關函式的時候,都會先利用threadid來進行檢索這個instance
進行操作。通過這個方法就能夠將dpdk中的各個網絡卡獨立執行。

Github地址

daq_dpdk
基於的是dpdk16.04, daq2.1.0,snort 3.0 a04.
使用方法在專案主頁中。