新人求教:关于利用sk_buff获得传输层首部
我初学netfilter,想自己编一个钩子函数实现过滤规则,现在想获得传输层首部,我用的方法是: struct sk_buff *sb;sb = skb;
struct tcphdr *tcph;
tcph = tcp_hdr(sb);
然后输出tcph->source,但是输出的内容和我用wireshark接收到的包完全不一样,不光source,tcph结构体的其他参数也完全不一样,请问这是为什么啊?
回复 1# szlzzyli
你可以看一下 tcp_hdr 的是实现,自己尝试找一下原因。
回复 2# Godbach
谢谢,问题已经解决了,我换了种方式获取传输层首部:tcph = (struct tcphdr *)(sb->data+iph->ihl*4); 就获取到了正确的头部信息··· 回复 3# szlzzyli
恭喜。你所遇到的问题,基本上是内核版初学者问的最多的问题。既然要深入到 kernel 搞 network,skb 数据结构一定要熟悉,code 可以可劲儿 hack。
回复 3# szlzzyli
你换了种方式解决了问题,值的高兴。但你知道为什么你之前的方式不行,而现在这种方式行的原因吗?
回复 5# Godbach
之前不行是不是因为内核还没有处理到传输层的部分呢? 回复 6# szlzzyli
是的。skb->data 还指向三层头部呢。那些包装好的获取各个层 header 的 inline 或者宏,都会依赖于 skb->data,并假设它指向了 caller 希望它所在的位置。
回复 7# Godbach
真是谢谢啊,让我少走了好多弯路呢。 回复 8# szlzzyli
有时候,走了弯路才会记得更清楚。:wink:
版主真是好人:D)
页:
[1]
2