免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2998 | 回复: 3

对函数tcp_pkt_to_tuple 疑问 [复制链接]

论坛徽章:
0
发表于 2011-11-02 16:23 |显示全部楼层
2.6.12   resolve_normal_ct --》ip_ct_get_tuple --》tcp_pkt_to_tuple

1.在tcp_pkt_to_tuple  中为了取得接收包的tcphdr结构地址,
  调用了hp = skb_header_pointer(skb, dataoff, 8, &_hdr);
为什么不是 hp=skb->h.th ;

2. 在函数resolve_normal_ct 中有   
  if (!ip_ct_get_tuple(skb->nh.iph, skb, skb->nh.iph->ihl*4, &tuple,proto))
                 return NULL;

其中的skb->nh.iph->ihl*4 也就是 1中的dataoff ,问:
skb->nh.iph->ihl*4  为什么 要乘以 4,
skb->nh.iph->ihl 不就是ip 包头的长了吗,
skb->data + skb->nh.iph->ihl 不就是接收包的 tcphdr 结构地址了吗,

求解

论坛徽章:
2
巨蟹座
日期:2014-03-09 21:37:25射手座
日期:2014-04-16 16:23:03
发表于 2011-11-02 18:15 |显示全部楼层
1. 可参考http://blog.chinaunix.net/space. ... blog&id=2919473

2. 看看RFC中对IP协议报文格式定义就知道了。

论坛徽章:
0
发表于 2011-11-02 18:57 |显示全部楼层
回复 2# kwest


    多谢!

论坛徽章:
0
发表于 2011-11-03 08:44 |显示全部楼层
回复 1# kgatheko


解决。
1.在包是分片的时候,无法对数据直接操作,所以不能 hp=skb->h.th 。所以需要skb_header_pointer 进行判断包是否完整。
可以由 kwest 提供的 http://blog.chinaunix.net/space.php?uid=127037&do=blog&id=2919473
找到答案。

2. 报头长度是以32 位 为单位,所以乘以 4 。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP