struct sk_buff *sb
根据下图可以得出通过
struct tcphdr *tcph = (struct tcphdr*)(sb->h.th);
可以得出tcp包头,但是实际上得不到,反而通过下面的办法可以得到
struct tcphdr *tcph = (struct
tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
可问题该方法的链路层包头怎么没有计算呢?
按说一个数据包应该是
链路包头14字节
然后是ip包头
tcp包头(假设数据包是tcp的)
可是
struct tcphdr *tcph = (struct
tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
这个办法是没有链路层包头的啊?
请问是怎么回事?
Godbach:
你需要了解那几个union中的指针分别在什么时候才有效。
你说的情况就是union中的指针还不是有个有效指针。
rain_fish:
哦,明白了,还有个问题就是
struct tcphdr *tcph = (struct
tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
是不是应该是struct tcphdr *tcph = (struct
tcphdr*)(sb->data+14(链路层包头)+(sb->nh.iph->ihl*4));
?
Godbach :
不用加MAC
len。你之所以没有理解正确,还是我说的那个问题。skb中有些成员是会随着skb在不同的协议层而变化的,比如skb->data就是这样的成
员。
因此,建议LZ看一下分析sk_buff数据结构的文章,充分的理解这个结构体中若干关键成员的含义。
阅读(2489) | 评论(0) | 转发(0) |