gpt4 book ai didi

linux - 完成压缩 IP 报头的 Xmit

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:18 26 4
gpt4 key购买 nike

我正在将 IP header 压缩协议(protocol)作为可加载内核模块来实现,该模块采用 IPv4 header 并将其压缩为较小的 header (我们称之为“iphc” header )。

为此,对于传出数据包,我使用了 NF_IP_POST_ROUTING netfilter Hook 在完成路由决策后抓取数据包。然后,我想用 IPHC header (压缩 IP)替换 IP header ,将以太网类型更改为其他类型,将其向下发送到堆栈(到以太网)并发送出去。据我所见,当我在 NF_IP_POST_ROUTING Hook 处拦截数据包时,MAC header 尚未添加。

我有几个问题:

  1. 考虑到我要替换 IP header ,这会影响以太网查找 MAC 硬件地址的能力吗?我看到在 ip_finish_output2() 函数中,它们使用 skbuff 中的 dst 值(使用 skb_dst() 函数)来搜索邻居表以查找 ARP 条目。如果我只是用 IPHC header 交换 IP header 并更改协议(protocol),ARP 查找会失败吗?我认为我没有触及 skbuff 中的“dst”字段。

  2. 我只需将 IP header 替换为 IPHC header 、更改 Ethertype,然后将其发送回堆栈就够了吗?或者我应该自己直接传输它而不返回给 ip_finish_output2

出于某种原因,如果我执行#2,我的代码就会崩溃。下面是我在挂接到 NF_IP_POST_ROUTING netfilter Hook (传入 skb)后尝试做的事情的示例:

struct iphc *my_hdr;

/* stripping the IPv4 header from skbuff */
skb_pull(skb, sizeof (struct iphdr));

/* adding my header skb */
skb_push(skb, IPHC_HDR_SIZE);

/* reset network header */
skb_reset_network_header(skb);

my_hdr = (struct iphc *)skb;

my_hdr->field1 = 1;
my_hdr->field2 = 2;

/* change ethertype */
skb->protocol = __constant_htons(ETH_P_IPHC);

return NF_ACCEPT;

我在这里遗漏了什么吗?谢谢!

最佳答案

在不知道 skb->data 当前指向何处的情况下不能使用 skb_pull() 和 skb_push()。

当数据包在 NF_IP_POST_ROUTING 被拦截时,很可能 skb->data 指向帧的开头,这也是 MAC header 的开头。

因此,在进行任何 skb_push() 操作之前,您应该先使用 skb_pull() 提取 MAC header ,然后再提取 IP header 。然后将数据 (MAC+IPHDR) 压缩为 (MAC+IPHC),然后 skb_push() 将组合的 (MAC+IPHC) 一起压缩 - 或者您可以先推送 IPHC,然后推送 MAC。

有关这些 skb 函数的详细信息,请参阅 skbuff.h,并且可以找到关于 skb 的一个很好的教程 here .

关于linux - 完成压缩 IP 报头的 Xmit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428869/

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