Trunk模式的数据包iph->version异常
最近基于网桥 + NatFilter分析Trunk模式发来的数据包.发现其中 iph->version为0, 正常应为iph->version:4对于Trunk模式的数据, 在代码中是先移位4的, 请问各位有没有遇到同类问题: 这是移位代码:
if(skb->protocol==htons(ETH_P_8021Q))
{
iph=(struct iphdr *)((u8*)iph+4);
} bridge在调inet_netfilter之前,应该已经把nh+4(指向iphdr)[@net/bridge/br_netfiler.c],所以在hook里面是不需要再次偏移的。 在Trunk模式下, 实际收到的iph->version为0, 说明这个数据包还是有问题, 请问应如何解析来自Trunk模式下的数据包? 回复 4# tough_lion
建议先假设数据包是没有问题的(正常的带tag的ip报文),在你的抓包点里把从skb->head到skb->data+32这个区间的数据打印出来,
人为判断mac头在什么地方,vlan头在什么地方,ip头在什么地方,然后跟skb_network_header、skb->data比较,
这样就能知道在你的抓包点,skb的各个字段是否需要偏移了。
可以去看我帖子里的源码
http://bbs.chinaunix.net/thread-4171778-1-1.html 回复 6# jasonew
你帖子里并没有源码, 方便再给我个链接吗? 回复 5# nswcfd
感谢, 我先试试, 另外Trunk模式下, 应该是公共标准, 即移动4位吧? 本帖最后由 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]