我有一种情况,数据包没有到达以太网 PHY。我正在使用 DMA 环形缓冲区,数据从物理线复制到环形缓冲区,然后我将其推送到上层堆栈。在 DMA 环形缓冲区中有两个计数器消费者索引和生产者索引以及两个指针读取指针和写入指针。计数器表示有多少数据包来自物理层,而消费者缓冲区用于保存已推送到上层的已消费缓冲区的索引。读写指针用于选择数据。
在我目前的情况下,我的生产者和消费者索引变得相似,这意味着没有数据包进入 DMA 环形缓冲区,而数据包不断地被泵送到连接到 PC 的设备(wireshark 日志确认数据包正在路由。)
我们正在使我们的引导加载程序独立于操作系统,所以在这里我们的实现在一次执行(引入一些计时器)中做很多事情(流管理,解析初始数据包并将其推送到上层),就像它之前的 VxWorks 实现一样,事情发生在不同的线程中,他们正在使用他们的 IP 堆栈。在进一步调试问题后,我观察到数据包由于 RX_BUFFER 溢出而丢失。我发现在硬件级别的过滤器中设置 MAC 多播地址存在一些问题,这可能是相同的原因。我的观察是第一次它工作正常。但是在软重置后,我无法再次放置过滤器。我对另外几个问题有疑问,我也在探讨同样的问题。
1> 初始化以太网驱动程序。
2> LWIP(IP栈)初始化。
3> 注册回调函数。
4> 启动以太网 PHY 驱动程序。
5> 形成DHCP连接。
6> 以太网驱动程序不断轮询,接受 DHCP 提议。
7> 加入 IGMP
8> 轮询组播数据包
9> 解析数据包并加入其他组播组
10> 再次开始轮询组播数据包。在第 4 步之后,我会随机收到 RX_BUFFER 溢出消息。最大 MTU 大小设置为 1500 字节,Buffer 大小为 2K。
有什么建议可以对问题进行分类/缩小范围吗?