tough_lion 发表于 2015-03-13 09:51

Trunk模式的数据包iph->version异常

最近基于网桥 + NatFilter分析Trunk模式发来的数据包.发现其中 iph->version为0, 正常应为iph->version:4

对于Trunk模式的数据, 在代码中是先移位4的, 请问各位有没有遇到同类问题:

tough_lion 发表于 2015-03-13 09:52

                   这是移位代码:
                        if(skb->protocol==htons(ETH_P_8021Q))
                {
                        iph=(struct iphdr *)((u8*)iph+4);                       
                }

nswcfd 发表于 2015-03-13 11:36

bridge在调inet_netfilter之前,应该已经把nh+4(指向iphdr)[@net/bridge/br_netfiler.c],所以在hook里面是不需要再次偏移的。

tough_lion 发表于 2015-03-13 14:14

在Trunk模式下, 实际收到的iph->version为0, 说明这个数据包还是有问题, 请问应如何解析来自Trunk模式下的数据包?

nswcfd 发表于 2015-03-13 15:08

回复 4# tough_lion

建议先假设数据包是没有问题的(正常的带tag的ip报文),在你的抓包点里把从skb->head到skb->data+32这个区间的数据打印出来,
人为判断mac头在什么地方,vlan头在什么地方,ip头在什么地方,然后跟skb_network_header、skb->data比较,
这样就能知道在你的抓包点,skb的各个字段是否需要偏移了。


   

jasonew 发表于 2015-03-13 18:14

可以去看我帖子里的源码

http://bbs.chinaunix.net/thread-4171778-1-1.html

tough_lion 发表于 2015-03-13 20:53

回复 6# jasonew


    你帖子里并没有源码, 方便再给我个链接吗?

tough_lion 发表于 2015-03-13 20:54

回复 5# nswcfd


   感谢, 我先试试, 另外Trunk模式下, 应该是公共标准, 即移动4位吧?

jasonew 发表于 2015-03-20 21:37

本帖最后由 jasonew 于 2015-03-20 21:37 编辑

回复 7# tough_lion



二层数据包 如果带VLAN TAG的话,那就是数据头指针P + 18 得到IP头指针的位置 struct iphdr *iph = (struct iphdr*)(pData + 18);,然后可以根据协议,比如IPPROTO_TCP == iph->protocol,那么 struct tcphdr *tcph = (struct tcphdr*)(iph + 1),UDP 一样,换个结构体就好

如果是正常的二层数据包,那么数据头指针P + 14 得到IP头指针的位置struct iphdr *iph = (struct iphdr*)(pData + 14);,其他都一样
   
页: [1]
查看完整版本: Trunk模式的数据包iph->version异常