Chinaunix
标题:
关于通过sk_buff获取网络数据包头的问题
[打印本页]
作者:
rain_fish
时间:
2010-03-19 14:00
标题:
关于通过sk_buff获取网络数据包头的问题
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));
这个办法是没有链路层包头的啊?
请问是怎么回事?
skbuff.png
(5.29 KB, 下载次数: 13)
下载附件
2010-03-19 13:59 上传
作者:
flw
时间:
2010-03-19 14:15
因为钩子调用的时机不同。
NF_IP_LOCAL_IN 时还没有填充传输层的头
作者:
rain_fish
时间:
2010-03-19 14:17
谢谢flw。
作者:
rain_fish
时间:
2010-03-19 14:17
Godbach 大侠给的答复是:
不用加MAC len。你之所以没有理解正确,还是我说的那个问题。skb中有些成员是会随着skb在不同的协议层而变化的,比如skb->data就是这样的成员。
因此,建议LZ看一下分析sk_buff数据结构的文章,充分的理解这个结构体中若干关键成员的含义。
作者:
doofy
时间:
2010-03-19 14:26
data指向ip头部,你要mac头部,需要把指针往前移一下,比如14个字节..
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2