【问题标题】:The SK_BUFF struct membersSK_BUFF 结构成员
【发布时间】:2015-02-15 19:04:15
【问题描述】:

struct sk_buff 真的很难理解(至少对我来说,当你第一次处理它时)。

在有人说我应该在提问之前先在网上搜索一下,请理解我做到了,但没有运气。 那里有一些很好但又旧又过时的文档和论文,在 GIT 上查看源代码,甚至浏览源代码 http://lxr.free-electrons.com 只会让一切变得越来越混乱。

我要问的比我需要的更多,以使此页面中的任何最终结论更加完整,因此任何到达这里的人都会(希望)得到他/她的问题的回答。

你能解释一下 struct sk_buff 的那些成员吗?

  • mac_header、network_header、transport_header

    它们似乎是偏移量。但是从哪里算起?从头开始?

    告诉大家我的struct没有mac_header,比如我该怎么办?因为 skb_mac_header_was_set() 的来源返回这个:skb->mac_header != (typeof(skb->mac_header))~0U

    但是没有skb_network_header_was_set()函数;还有一个用于transport_header ... 疯了!

  • 长度

背景:

我要做的是:我正在 netfilter 挂钩中编辑数据包,完成后,我正在重建整个标头(UDP/TCP、IP4/IP6、以太网)... 因为我可能在这些标题中包含/删除了新选项,它们的大小发生了变化,skb-> 数据移动......这就是我需要处理这些成员的原因。

我的模块适用于每个 netfilter 挂钩(PREROUTING、POSTROUTING、FORWARD、INPUT)...

【问题讨论】:

  • 您的代码是使用 IP 网络过滤器钩子还是网桥网络过滤器钩子?
  • 我正在使用 IP 网络过滤器...

标签: c struct linux-kernel netfilter


【解决方案1】:

在 IP 层,您无需担心 MAC 标头。相邻子系统和桥接子系统要么已经完成工作(rx 路径),要么稍后添加 MAC 标头(tx 路径)。

mac_header、network_header、transport_header:是从 skb->data 开始计算的偏移量。尽量不要直接操作这些,始终使用 skbuff.h 中的 API

你没有提供太多关于你在做什么的细节,但你可能想考虑一下:

  1. ip_send_check(iph) : 修复IP头的校验和
  2. skb_set_network_header():重新设置IP头偏移到一个新点
  3. skb_set_transport_header():将 TCP/UDP 标头偏移重新设置为新点
  4. udph->check = csum_tcpudp_magic():修复 UDP 标头校验和

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2012-09-21
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多