gpt4 book ai didi

linux-kernel - 我将如何自然地翻译 Linux 内核中的第 3 层 header ?

转载 作者:行者123 更新时间:2023-12-02 03:55:38 26 4
gpt4 key购买 nike

我的任务是为 Linux 内核编写 IPv4-IPv6 转换器 ( RFC 6146 )。简而言之,它是一个介于 IPv4 和 IPv6 网络之间的网关,通过交换数据包 header 和屏蔽地址来实现它们之间的透明通信。

看到内核有Netfilter,一个改变数据包的框架,本来我想我可以写一个Netfilter模块并从那里翻译。我可以拦截所有数据包,使用通常的 skb_pull/skb_push 操作调整它们的大小,覆盖一些字节,最后愉快地将它们返回给内核。

事实证明,切换协议(protocol)对于 Netfilter 来说过于极端。因为处理 IPv4 数据包的代码完全独立于处理 IPv6 数据包的代码,所以 Netfilter 模块之前和之后的代码都假定网络协议(protocol)的 header 仍然存在。因此,如果我将 IPv4 header 更改为 IPv6 header ,内核就会发疯,因为它将继续读取 header ,就好像它是 IPv4 header 一样。

(或者至少,这是我在阅读 net/ipv4/ip_input.c 后所相信的;内核在调用 NF_HOOK 之后所做的第一件事是在 ip_rcv_finish() 期间提取 IPv4 header 。)

我看到了第二个选项:从头推导出一个新的 sk_buff,要求 Netfilter NF_DROP 原始数据包,然后以某种方式发送新数据包。

这就是我对内核原理和风格的有限了解让我停滞不前的地方:我想尽量减少对我的解决方案的不满,但替换整个数据包而不是改变其 header 似乎不自然、无效率,甚至亵渎了 Netfilter 的设计。但我不能肯定地说,我希望有经验的建议。另外,我别无选择。

问题:还有其他选择吗?最自然的方法是什么?

我想支持 2.6 之后的所有内核版本。如果那不可能,则越新越好。

最佳答案

我曾经写过一个 ebtables 目标,它的工作是用 VLAN 标记标记以太网帧。这需要在帧数据之前移动和更改以太网报头。所以它在做类似的事情,但在较低的层次上。 skb 可以在开始时就地放大(我猜至少在大多数情况下是这样),所以性能应该没问题。

直接链接: http://goo.gl/3DPEB

“008-ebt-vlan_t-0.1.diff.bz2”位于:

http://goo.gl/S1tVv

请注意,我已经 4 年多没有关心过这段代码了,从那时起我就没有使用过 Linux 网络代码。同时,据我所知,Ebtables 已合并到 netfilter 中。但我认为基本方法应该仍然有效并且可以为您提供帮助。

关于linux-kernel - 我将如何自然地翻译 Linux 内核中的第 3 层 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12823789/

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