Chinaunix首页 | 论坛 | 博客
  • 博客访问: 582146
  • 博文数量: 70
  • 博客积分: 3736
  • 博客等级: 中校
  • 技术积分: 1728
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-08 09:15
文章分类
文章存档

2014年(1)

2012年(21)

2011年(7)

2010年(28)

2009年(13)

分类: LINUX

2010-06-02 19:53:00

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) |
给主人留下些什么吧!~~