xiaoyanfei
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2010-07-21
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望77点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
阅读:2940回复:3

uboot网卡驱动接收总是丢掉第一个数据包(ping PC)

楼主#
更多 发布于:2010-06-24 22:14
uboot网卡驱动在做PING PC的操作时,首先板子发arp broadcast包给PC,PC回MAC地址给板子时,板子无法收到
此数据包,而是收到PC发出的下一个数据包(wireshark抓包).所以导致板子无法PING通PC(主机)。有谁知道怎么
回事,麻烦指点一下.Marvell arm cpu.
swallow_xyf
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2010-06-24 22:58
怎么知道板子没有收到? 最好把数据包往返过程描述清楚。

1 板子发出arp broadcast.

2 pc 是正常,所以应该可以正确回arp reply

3 所以可能出现在板子这边,可能板子丢弃了数据包

以上仅是我猜测,具体还要看lz具体流程描述
走走看看开源好 Solaris vs Linux
xiaoyanfei
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2010-07-21
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望77点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-06-24 23:30
怎么知道板子没有收到?

谢谢版主。我的驱动的开头部分,此函数被轮询调用的

eth_receive(struct eth_dev_s *p)
{
    int eth_len=0;
    char *eth_data;

    eth0_rx_desc_single *rx = &p->eth_rx_desc[(p->rdn)];

    INVALIDATE_DCACHE((unsigned int)rx,(unsigned int)(rx+1));

    if (rx->command_status & 0x80000000) {
        return 0; /* No packet received */  
    }
              此处返回了。
          等到运行此后的程序开始接收数据包时,收到的是PC发出的第2个数据包。
wireshark抓到的数据包(1号数据包:板子发给pc的broadcast数据包
                      2号数据包:PC回给板子的数据包
                      3号数据包:PC发出的数据包(broadcast)
                      )


    eth_len = (unsigned int)
        (rx->buff_size_byte_count) & 0x0000ffff;
    eth_data = (char *) p->eth_rx_buffer[p->rdn];

    /*
     * packet is now in:
     * eth0_rx_buffer[RDN_ETH0];
     */

    /* let the upper layer handle the packet */
    NetReceive ((uchar *)eth_data, eth_len);

     程序中printf打印出的数据和上面wireshark抓到的第3号数据包内容一样。所以看样子根本没有去接收到PC回给板子的数据。
swallow_xyf
xiaoyanfei
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2010-07-21
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望77点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-06-25 20:16
谢谢版主,问题解决了。果然是板子丢弃了数据包。hashtable的问题。
swallow_xyf
游客

返回顶部