designware 网卡问题解决 iperf ping 回环模式

记一次 designware 网卡网络故障问题的解决过程

问题现象

在给客户ddr3板卡适配SylixOS时,会出现ftp连接困难,telnet连接不正常,板卡作为iperf服务器测试正常,作为iperf客户端测试无法连接。

问题测试分析

  1. ddr3板卡问题可以稳定复现,在多个板卡上现象相同。
  2. 同样代码在ddr4的板卡可以正常运行。
  3. ddr3板卡跑原厂的Linux测试,网络状态良好。

初步可以判断是SylixOS系统上对网络的配置有某些不正确的地方

  1. 写c代码对板卡进行udp测试,tcp客户端和tcp服务端。测试时发现一切正常。(这个结果有些误导我,因为我写程序进行测试时,发送的每个数据包都是1000B以上的,所以网络问题没有暴露,导致我以为是这些ftp telnet某些处理有问题)

  2. 对ftp抓包测试分析,板卡跑SylixOS,做ftp的服务端,pc作为客户端去连接。对于ftp连接,可以正常抓取到tcp建立连接的握手包,而且每次都能正常抓到。但是ddr3板卡接下发送的136B的欢迎包PC很难收到。这个欢迎包会重发,只要PC接收到了,ftp服务就可以正常进行,传输文件过程中一切正常。telnet 和 iperf 测试也是类似,tcp建立连接的握手和断开连接的挥手通讯都正常。但是正常跑数据时就有些异常。

  3. 在做iperf测试时,将ddr3板卡作为服务器,使用PC做客户端进行速度测试,发现速度一切正常,网络带宽并无降低。(原因是这样的测试方法,是PC主动发数据到板卡上,板卡接收数据正常所以带宽并无影响)

  4. 误打误撞在测试时,将网络数据包的长度作为观测因素考量。有了惊天发现,板卡在发送某些长度的数据包时,PC接收有些异常。(真正的思路是模拟ftp的过程,当我发送 136B 的欢迎包时出现了问题)然后我将数据编号发送,在wireshark里抓包发现有些包丢失,没有抓到。

  5. 为了了解丢包的真实情况。我使用了另一个网络正常的板卡,两个板卡使用网线直连。在正常的板卡网络驱动层去打印接收到的数据包大小和数据。发现每个数据包都能收到,但是当数据包的长度在77-199(119-241)之内时,另一个板卡只接收到了部分数据。进一步分析是:总是丢失尾部的数据,已经接收到的数据完全正常。而且接收到的数据包大小好像呈现出某种规律。(接收到的数据包大小都是这些值:77 93 109 125 141)这些数据好像都是呈现16B的间隔。

经过上面的现象分析,进一步缩小范围测试

  1. 把GMAC配置为loopback mode,自发自收进行测试。发现问题现象完全相同。(后面介绍网卡环回测试的方法)

  2. 研究dw网卡手册,对比与ddr4板卡的区别,对比linux的寄存器的配置,分析接收到的数据包的规律。(这些都是枯燥的,根据得到的怀疑点,改动代码测试,直到成功。怀疑点:cache没有及时回写,AHB带宽不同,ddr速度不同,DMA工作状态不同)

  3. 最后解决:方法是把 DMA Reg0 的16位 清0。这一位控制如下:

    Fixed Burst
    This bit controls whether the AHB or AXI master interface performs fixed bursttransfers or not. When set, the AHB interface uses only SINGLE, INCR4, INCR8,or INCR16 during start of the normal burst transfers. When reset, the AHB or AXIinterface uses SINGLE and INCR burst transfer operations.For more information, see Bit 0 (UNDEF) of the AXI Bus Mode register in the GMAC-AXI configuration.
    固定突发
    该位控制 AHB 或 AXI 主接口是否执行固定突发传输。设置后,AHB 接口在正常突发传输开始期间仅使用 SINGLE、INCR4、INCR8 或 INCR16。复位时,AHB 或 AXI 接口使用 SINGLE 和 INCR 突发传输操作。有关详细信息,请参阅 GMAC-AXI 配置中 AXI 总线模式寄存器的位 0 (UNDEF)。

    在我们的驱动中,同时配置了 Fixed Burst 和 Mixed Burst。此时应该只有Fixed Burst生效,DMA工作在固定猝发模式,每次搬运的数据应该为INCR16(传输的burst类型),所以导致了收到数据有16B的不同。(但是我没法解释接收到的数据量为啥不是16B对齐的,而只是有16B的差额)

    Mixed Burst
    When this bit is set high and the FB bit is low, the AHB master interface starts all
    bursts of length more than 16 with INCR (undefined burst), whereas it reverts to
    fixed burst transfers (INCRx and SINGLE) for burst length of 16 and less.
    This bit is valid only in the GMAC-AHB configuration and reserved in all other
    configuration.
    混合突发
    当该位设置为高且FB位为低时,AHB主接口以INCR(未定义突发)开始所有长度超过16的突发,而它恢复为固定突发传输(INCRx 和 SINGLE),突发长度不超过 16。该位仅在 GMAC-AHB 配置中有效,在所有其他配置中保留。

后续

  1. 如何开启 designware GMAC 的loopback功能

    只需要正常配置,并设置 MAC Configuration Register bit12 为 1即可。**注意配置需要在接收发送停止的状态。**简单处理可以在初始化配置时将其置1。此时就可以进入loopback模式。不管是否接入网线,都无法收到外面的数据。也需要注意GMAC的接收时钟需要外部提供。

  2. 开启loopback后测试

    分享一个使用ping命令进行测试的方法。只是让本机能接收到包,并不能回复。

    1. 使用arp命令,将ping的对方ip的mac地址设置和本机一样。这样就可以使用ping发送任意长度的数据包了,否则会先发送arp包探测对方的MAC地址,导致本来想发送包无法正常发出。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值