netfilter - 如何在内核模块中指定队列号?

时间:2015-10-10 10:28:50

标签: c linux linux-kernel netfilter

我正在编写一个内核模块,需要在IP层进行一些包过滤工作。我需要做的是拦截所有的IP数据包,在一些传出的数据包上,我需要在发送它们之前将它们扣留一小段时间(如几十毫秒)进行分析。

我已启动并运行内核模块,此时它接受所有传入的数据包并在所有传出数据包上返回NF_QUEUE。然后我可以在用户空间使用libnetfilter获取这些数据包(比如使用Python脚本和NetfilterQueue),但问题是Python库需要一个队列号,而我的内核模块将队列#0中的数据包排队。我该如何配置?!

这就是我的内核模块的传出数据包钩子的样子(从各种来源拼凑而成):

static struct nf_hook_ops nfho_send;

unsigned int hook_send_func(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
{
  return NF_QUEUE;
}

/* in init_module() */

nfho_send.hook = hook_send_func;
nfho_send.hooknum = NF_INET_POST_ROUTING;
nfho_send.pf = NFPROTO_IPV4;
nfho_send.priority = NF_IP_PRI_LAST;
nf_register_hook(&nfho_send);

我在哪里指定数据包最终会在哪个队列中?队列号的意义是什么?我无法处理由我的另一个钩子排队的随机杂散数据包,默认情况下已经完成了吗?

谢谢!另外,我使用的是Linux 3.x。

1 个答案:

答案 0 :(得分:2)

使用NF_QUEUE_NR(x)宏。您传递一个参数(队列号),它将为您构建返回值。具体来说,它会将队列号左移16位,然后将其与NF_QUEUE进行AND运算。

如果您有兴趣,请执行include/uapi/linux/netfilter.h