Surciata原始碼分析之IpsNFQ模式(2)

2021-06-06 14:09:43 字數 1588 閱讀 2435

2. 各模組功能分析

3. tm-queue&tm-queuehandler分析

tm-queue是各個模組(執行緒)之間傳遞資料的緩衝區(圖中橢圓),這在多執行緒程式設計中經常會被用到,用來快取資料。在這裡提醒一下,不要將這裡的tm-queue與nfq中的queue混淆了,後者是核心中的queue(netfilter queue),這裡的tm-queue只是suricata各模組間的緩衝區。

乙個tm-queue在程式中包括structtmq_和struct packetqueue兩個結構,前者只存了簡單的資訊,用於檢索,後者用於實際儲存資料報,兩者之間通過tmq->id進行關聯。這兩個結構的定義分別如下:

tm-queue.h:

typedef struct tmq_ tmq;

decode.h:

typedef struct packetqueue_ packetqueue;

tmq的建立是在程式呼叫tmthreadcreate()(tm-threads.c)函式建立執行緒時呼叫tmqcreatequeue()(tm-queues.c)函式進行建立。

在nfq模式中用到的tm-queue除了packetpool是迴圈佇列之外,其它的(pickup-queue、decode-queue等)都是fifo佇列。所以,這裡只對packetpool這個特例進行一下說明。

packetpool這個tm-queue其實在原始碼中是用ringbuffer這個迴圈佇列表示,所以對packetpool的操作其實是在操作ringbuffer。ringbuffer是存放packet*指標的乙個陣列,陣列的大小由max_pending_packets(在配置檔案中配置,預設為50)的值決定。main()(suricata.c)函式對ringbuffer陣列進行了初始化,建立一定數量的packet,在程式的整個執行中迴圈使用,直到程式完全退出才釋放。

queuehandler是各緩衝區的操作介面,用來對緩衝區進行輸入輸出操作。該結構在tm-queuehandlers.h檔案中的定義如下:

typedef structtmqh_ tmqh;

其中inhandler和outhandler就是分別指向緩衝區的輸入、輸出操作函式。

所有的queuehandler組成了乙個陣列存放在tmqh_table中。tm-queuehandlers.c中的tmqh_setup()函式被main()呼叫來對tmqh_table陣列進行初始化,並將所有會用到的queuehandler註冊到tmqh_table陣列中。下面是nfq模式中用到的三種queuehandler:

1) packepool

通過read和write兩個位置標記對packetpool(ringbuffer)這個迴圈佇列進行進出操作。

2) ******

按照fifo(先進先出)原則對緩衝區內容進行進出操作。

3) flow

出隊的時候是按照fifo進行,入隊的時候對資料報的頭部資訊進行hash,然後將具有相同hash值的資料報放到乙個緩衝區。

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...

原始碼分析之HashMap

首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...

原始碼分析之String

先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...