- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的任务是为 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”位于:
请注意,我已经 4 年多没有关心过这段代码了,从那时起我就没有使用过 Linux 网络代码。同时,据我所知,Ebtables 已合并到 netfilter 中。但我认为基本方法应该仍然有效并且可以为您提供帮助。
关于linux-kernel - 我将如何自然地翻译 Linux 内核中的第 3 层 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12823789/
我有一列(VARCHAR 类型),其值如下: 1 2 3 1.1 1.1.1 1.2.1 5 4 7 8 9 10 10.2 10.1 我希望[e 选择此列并对其进行自然排序,如下所示: 1 1.1
我是一名优秀的程序员,十分优秀!