將DPDK移植到snort上的DAQ
阿新 • • 發佈:2019-01-04
DAQ 與Snort
在snort-daq中,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,所以怎麼解析就不提了。 從上圖和上面的介紹就可以看得出來,一個snort下面有多個
daq instance
並行執行。每一個daq instance
都會進行初始化操作,佔用系統資源,獲取網絡卡,抓包,呼叫callback
,之間相互獨立。並且是單執行緒的。
DAQ與DPDK
如上面所介紹的。DAQ在設計的時候是單執行緒的。在本身的實現的幾個模組中(Netmap,pcap等等)完全沒有涉及到多執行緒的事情。在snort中的呼叫也是單執行緒並行呼叫的,相互之間各不影響。而Inter的DPDK在多執行緒方面則有限制。它所初始化的EAL
EAL
。那麼就會出錯,導致最後只有一個執行緒能夠成功初始化並啟動。 所以如果要想實現一個支援snort多執行緒的daq。就需要修改daq中api的邏輯。
在實現中,利用執行緒id來繫結網絡卡。
在daq的content中加入了一個
nic
-threadid
的對映表。然後每個網絡卡都有一個獨立的instance
儲存原本在daq_content
中的資訊。然後線上程呼叫daq相關函式的時候,都會先利用threadid來進行檢索這個instance
Github地址
daq_dpdk
基於的是dpdk16.04
, daq2.1.0
,snort 3.0 a04
.
使用方法在專案主頁中。