gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:01 24 4
gpt4 key购买 nike

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

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

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

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);

我在哪里指定数据包将在哪个队列中结束?队列号有什么意义?我不能处理由另一个钩子(Hook)排队的随机杂散数据包,默认情况下已经完成了吗?

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

最佳答案

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

如果你有兴趣,实现在include/uapi/linux/netfilter.h

关于c - netfilter - 如何在内核模块中指定队列号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33052951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com