首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >netfilter -如何在内核模块中指定队列号?

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

Stack Overflow用户
提问于 2015-10-10 10:28:49
回答 1查看 449关注 0票数 1

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

我已经启动并运行了内核模块,目前它接受所有传入数据包,并在所有传出数据包上返回NF_QUEUE。然后,我可以在用户空间中使用libnetfilter (类似于Python和NetfilterQueue)来获取这些数据包,但问题是Python库接受队列号,而我的内核模块将数据包排在队列#0中。我该怎么配置?!

这就是我的内核模块的外发数据包钩子的样子(从不同的来源拼凑而来):

代码语言:javascript
运行
复制
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);

我应该在哪里指定数据包将在哪个队列上结束?排队数的意义是什么?我不能处理由另一个钩子排队的随机丢包,这在默认情况下已经完成了吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-13 16:17:25

使用NF_QUEUE_NR(x)宏。传递给它一个参数(队列号),它将为您构建返回值。具体来说,它将把队列号左移16位,然后使用NF_QUEUE。

如果您感兴趣,实现是在include/uapi/linux/netfilter.h中实现的

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33052951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档