2012-03-02 15 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個のキューのように管理したい場合は、今、私は初期化するために、その上に 構造やループをH、QHとque_numをパックします。

は今、私の質問は:

私はメインスレッドで上記初期化して別々のスレッドでコールバック を実行する場合、それは十分 pthread_createのために与えられます関数の中でも、ループを実行することです()?コールバックはスレッドで実行されますか?

確かに分かりませんが、nfq_set_verdictが返されたときにパケットが キューからポップされています。だから、 nfq_set_verdictを別のスレッドで実行して、iパケットを キューから並列にポップできるようにする必要があります。

EDIT:誰かに自分の問題を理解する必要がある場合は、私のコードを提供します。ここですべてのコードを貼り付けると、視覚的なノイズが発生するので不合理なようです。

+0

1つのスレッドでこれを行うのが遅すぎますか?そうでない場合、なぜあなたはそれにスレッドを投げるために飛び跳ねていますか?人々は実際にそれを考えずに、スレッドレバーをあまりにも頻繁に投げます。 – tbert

答えて

1

私はこれがちょっとした奇抜であることを知っていますが、誰でもこの問題を抱えています。

マルチスレッド化に--queue-balanceを使用すると、すべてのパケットを1つのキューに入れるように見える場合、--queue-cpu-fanoutを追加する必要があります。これにより、iptablesはflowではなくcpuidに基づいてパケットを共有します。

関連する問題