为什么skb_transport_header无法正确计算?

时间:2012-04-15 13:42:22

标签: c++ c linux-kernel netfilter

我用netfilter hooks编写了一个应用程序。

似乎skb_transport_header函数无法正确计算(有时但并非总是如此):

struct tcphdr* tcp_header = NULL;
tcp_header = (struct tcphdr*)skb_transport_header(skb); // somtimes incorrect address.
tcp_header = (struct tcphdr*)((char*)ip_header + (ip_header->ihl * 4));// always correct address.

我哪里错了?

2 个答案:

答案 0 :(得分:4)

你可以在这里查看: http://www.roman10.net/how-to-filter-network-packets-using-netfilterpart-2-implement-the-hook-function/ 问题是netfilter在网络层实现,当数据包从物理层上传时,你在到达tcp层之前捕获数据包,有些功能没有处理。

答案 1 :(得分:0)

内核版本是非常重要的信息。在Linux网络内核中,SKB的transport_header(以及许多其他属性)在首次创建时(由驱动程序)未设置,SKB被逐层处理,而SKB的数据指针被移动。因此,如果您的钩子较低,也就是BRIDGE级别,则在您访问它时可能尚未设置。