netfilter_queue:在多线程环境中使用--queue-balance

时间:2012-03-02 11:46:02

标签: c linux kernel

我正在使用libnetfilter_queue进行用户空间修改 传入/传出数据包。我一直在使用单线程模型。 但我发现从2.6.31内核,它可能有 不同的队列,用于不同的连接。所以我徘徊,如果它 可以管理不同线程中的每个队列。

通常我将队列处理设置为如下:

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数据包 队列平行。

编辑:如果有人需要他们来理解我的问题,我会提供我的代码。粘贴所有代码似乎不合理,因为它会产生视觉噪音。

1 个答案:

答案 0 :(得分:2)

我知道这有点像坏死,但万一有人偶然发现这个问题。

如果对多线程使用--queue-balance并且netfilter似乎将所有数据包放在一个队列中,则应该添加--queue-cpu-fanout,这会强制iptables基于cpuid而不是flow来共享数据包。