结构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)......
答案 0 :(得分:0)
在IP层,您无需担心MAC标头。相邻和桥接子系统要么已经完成了它们的工作(rx路径),要么稍后会添加MAC头(tx路径)。
mac_header,network_header,transport_header:是从skb->数据计数的偏移量。尽量不要直接操作它们并始终在skbuff.h中使用API
您没有提供有关您正在做的事情的详细信息,但您可能需要考虑:
ip_send_check(iph)
:修复IP标头的cheksum skb_set_network_header()
:将IP标头偏移重新设置为新点skb_set_transport_header()
:将TCP / UDP标头偏移重新设置为新点udph->check = csum_tcpudp_magic()
:修复UDP标头校验和