2012-03-02 87 views
1

我正在使用libnetfilter_queue來修改 的傳入/傳出數據包。我一直在使用單線程模型。 但我從2.6.31內核發現,它可能有 不同隊列的不同連接。所以我徘徊,如果它的 可能管理不同線程中的每個隊列。netfilter_queue:在多線程環境中使用--queue-balance

通常我設置的隊列處理類似波紋管:

struct nfq_handle * h = nfq_open(); 
nfq_unbind_pf(h, AF_NET); 
nfq_bind_pf(h,m AF_NET); 
struct nfq_q_handle(h, 0, &cb, NULL); 
nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff); 

現在,如果我要管理像100個隊列,我將包小時,QH和que_num在 結構和遍歷初始化。

現在我的問題是:

,如果我在主線程上述初始化並想要運行在單獨的線程回調 ,是它足以在將 給予在pthread_create函數運行甚至環()?它會在線程中運行回調嗎?

我不確定,但是我的理解告訴我,當返回nfq_set_verdict時,數據包將從 隊列中彈出。所以我需要在單獨的線程中運行 nfq_set_verdict,這樣我的數據包可以從 平行排隊。

編輯:我提供我的代碼,如果有人需要他們來了解我的問題。在此粘貼所有代碼似乎不合理,因爲它會產生視覺噪聲。

+0

在單線程中這樣做太慢了嗎?如果不是的話,你爲什麼要跳起來向它扔線?人們常常把螺紋槓桿扔得太多而沒有真正思考。 – tbert 2012-03-02 12:49:14

回答

1

我知道這是一個necroposting,但如果有人在這個問題上絆倒。

如果您使用--queue-balance進行多線程並且netfilter似乎將所有數據包放入一個隊列中,則應該添加--queue-cpu-fanout,這會迫使iptables基於cpuid而不是流來共享數據包。