Chinaunix

标题: 关于linux skb缓冲区 UDP首部位置的问题 [打印本页]

作者: ykai229    时间: 2014-04-10 13:19
标题: 关于linux skb缓冲区 UDP首部位置的问题
本帖最后由 ykai229 于 2014-04-13 22:03 编辑

按照书上的说法,skb的缓冲结构中,data到tail指向实际数据的开端和尾端,head到end指向已经分配的缓冲区空间和尾端,协议栈各层首部在缓冲区中连续存放(先不考虑对齐)。

1.jpg (93.1 KB, 下载次数: 41)

1.jpg

2.jpg (43.78 KB, 下载次数: 82)

2.jpg

3.jpg (27.09 KB, 下载次数: 44)

3.jpg

4.jpg (55.69 KB, 下载次数: 44)

4.jpg

作者: Godbach    时间: 2014-04-10 16:26
回复 1# ykai229

通过 skb 取到 network header,然后header 加上通过 header 中头部的长度,即可取到四层的 header 指针。如果是 UDP 协议的话,就是 UDP header 了。头部就那 8 个 bytes


   
作者: ykai229    时间: 2014-04-10 20:39
谢谢斑竹的回答,之前写模块都是这样做的,也都没有问题,但是这一次使用的是无线网卡,不知道这个是不是有什么不同,data到tail的大小是20个字节,按理说data+20(IP首部的长度,这里就是20个字节)就是UDP的首部了,但是打印出来的内容和抓包的结果完全对不上啊回复 2# Godbach


   
作者: oscarvei    时间: 2014-04-11 10:21
回复 1# ykai229

skb非线性化引起的,
pskb_may_pull可以搞定。
作者: ykai229    时间: 2014-04-11 10:43
为什么会非线性化啊,接受到的数据包大小又不可能分片。。。
回复 4# oscarvei


   
作者: oscarvei    时间: 2014-04-11 15:28
收包方向上: 是否线性化跟网卡驱动有关系.跟报文大小没关系
作者: ykai229    时间: 2014-04-11 18:20
谢谢大神的回复,现在我也是这么猜想的,有没有什么资料有讲这块的知识点呢,网络内幕里面没瞧见呢(看里面的说法感觉都是线性空间)
回复 6# oscarvei


   
作者: oscarvei    时间: 2014-04-16 19:09
回复 7# ykai229

skbuff.c




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2