static void netdev_rx(struct net_device *dev) { struct w740_priv * priv = netdev_priv(dev); RXBD *rxbd; unsigned long length; rxbd = (RXBD *)priv->rx_ptr ;
do { ... length = rxbd->SL & 0xFFFF; status = (rxbd->SL & 0xFFFF0000) & ((unsigned long)~0 >>2); data = (unsigned char *) rxbd->buffer; skb = dev_alloc_skb(length+2); //Get Skb Buffer; skb->dev = dev; skb_reserve(skb, 2); //For IP Align 4-byte skb_put(skb, length); ... }while(1); }
|
今天看linux网卡驱动的接收代码的时候,对rxbd->buffer中的数据很感迷惑,不知道里边有没有包含以太网头,于是在驱动里边把rxbd->buffer中的值,打印出来,并把length的值也打印出来。随机找了一个包,整理并分析如下:
length=98 //这个包长为98个字节
0 d0 c9 22 1 12 //以太网头部 14个字节
0 1 6c 46 21 b9
8 0
45 0 0 54 //IP包头,20个字节,54表明整个ip包为84个字节
0 0 40 0 //所以,包头之后跟着64个字节的数据
40 1 4f b7
ac 15 49 65
ac 15 49 62
8 0 2d 96
86 19 0 d
6b 42 6 4c
df b1 8 0
8 9 a b
c d e f
10 11 12 13
14 15 16 17
18 19 1a 1b
1c 1d 1e 1f
20 21 22 23
24 25 26 27
28 29 2a 2b
2c 2d 2e 2f
30 31 32 33
34 35 36 37
end
可见rxbd->buffer中包含的是完整的协议包,但是这里边的数据是从哪里来的呢?看代码,发现rxbd->buffer其实取自w740_priv,但整个驱动里边,我都没有看到有给 w740_priv赋值的语句,那么,w740_priv结构是怎么拿到数据包的呢?这还是一个疑问!!!
阅读(1201) | 评论(0) | 转发(0) |