SK_BUFF结构成员

时间:2015-02-15 19:04:16

标签: c struct linux-kernel netfilter

结构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 ... Crazyness!

  • len个

背景:

我想要做的是:我在netfilter挂钩中编辑数据包,当我完成时,我重建了整个报头(UDP / TCP,IP4 / IP6) ,以太网)... 由于我可能在这些标题中包含/删除了新选项,其大小发生了变化,因此skb->数据移动......以及我需要与这些成员打交道的原因。

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

1 个答案:

答案 0 :(得分:0)

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

mac_header,network_header,transport_header:是从skb->数据计数的偏移量。尽量不要直接操作它们并始终在skbuff.h中使用API​​

您没有提供有关您正在做的事情的详细信息,但您可能需要考虑:

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