- 论坛徽章:
- 8
|
本帖最后由 firocu 于 2013-10-11 12:15 编辑
原来如此。
我搜了下2.6.37的代码是在- static int ip_local_deliver_finish(struct sk_buff *skb)
- {
- __skb_pull(skb , ip_hdrlen(skb)) ;
- skb_reset_transport_header(skb) ;
- }
复制代码 ip层结束是更新下tcp header 的指针。
我看了下最新的代码3.11,死活也找不到skb_reset_transport_header(skb) ;这句了。。。而且其他地方也没有更新tcp header的函数。
在接下来的tcp_v4_rcv就直接用tcp_hdr(skb)调用skb_transport_header(skb)了。。。。这个慢慢找。
有一个问题。就是关于skb中存储的数据包的内容。
组长每次访问头部都会小心翼翼地先调用:- iph = skb_header_pointer(skb, skb_network_offset(skb), sizeof(iph_buff), &iph_buff)
复制代码 我觉得没必要。。。直接用不就完了吗? 会有什么问题?
===================SOLVED====================
因为可能skb中由分散聚合的数据, 直接指针访问有问题:
1 读取超过1 byte数据,比如short,可能是上一个page尾部一个byte,下一个page的开始的那一个byte,你是不能通过头部指针找到的。
2 或者访问的数据就在第二个page 上头部指针加成员偏移就是非法的。
|
|