LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1812|回复: 2

sk_buff结构问题(gentoo-2.6.23-r6内核)

[复制链接]
发表于 2008-2-6 03:38:27 | 显示全部楼层 |阅读模式
为什么使用 tcp_hdr(skb) 返回的tcphdr结构总是和真实的位置相差20个字节?

使用这一句可以获取正确的tcp头结构
iph = ip_hdr(sb);
tcph = (struct tcphdr *)(sbk->data + iph->ilh * 4);  // 数据首部 + ip头

如果用这一句, 返回的是和上面那个方法相差(少)20字节的
tcph = tcp_hdr(sbk);
那意味着这个tcph是指向ip数据部分了?
为什么会这样呢
如果这样,取得的数据是正常的
tcph = tcp_hdr(sbk) + 1;

看内核源码的时候,
ip_hdr是 return (struct iphdr *) (skb->head + skb->network_header);
tcp_hdr是return (struct tcphdr *)(skb->head + skb->transport_header);


tcp_hdr不是直接用的?
请指教。
发表于 2008-2-6 12:57:02 | 显示全部楼层
这说明在你处理这个skb时,内核还没有处理到传输层,所以transport_header的值与network_header相同。

你可以printk看一下,32位平台就输出skb->transport_header - skb->head;64位平台输出skb->transport_header。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-6 19:10:50 | 显示全部楼层
非常感谢。

凑字数。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表