我在需要高数据速率的应用程序中使用 LWIP。 因此,我分配了 4 个 pbuf 一次并存储它们的地址,并使用一些硬件魔法,一个接一个地填充它们,然后告诉程序缓冲区已准备好,软件将其作为 UDP 数据包发送,但是一段时间后,当我嗅探数据包时,我我的数据包中有大约 60 个额外字节,它们看起来像是额外的 UDP 标头,但在有效负载中。 有什么解决方法/建议吗?
在我的工作项目中,我们遇到了 pbuf 损坏,导致了类似的问题。 我们使用来自 xilinx 的多个不同类型的 MAC,pbuf 部门对此感到不满。 我建议您为 IP 层和可能的 UDP 层打开完整的 lwip 调试。 然后手动将打印修剪为可重现问题的可管理的内容(lwip 有最低打印级别 - 您可以使用它来帮助修剪诸如警告与严重打印之类的内容)。 在我们的例子中,我们会收到 UDP 或 IP 层校验和错误,这是坏东西的迹象。 此外,一次仅在一个方向进行测试也很有帮助,可以限制一个方向出现不良情况的可能性。 我们使用了 xilinx 的 iperf 示例并对其进行了扩展。 这些对于解决问题很有帮助。 BTW 4 pbufs 没什么...当我查看以太网流量时 - 有大量的事情发生,开销等...存在大量潜在问题,因为 ARP 表条目太少等等...四个 pbufs低得离谱,如果你被记忆所困,我为你尝试使用 lwIP 感到遗憾。 这听起来就像一场噩梦。 另外,请注意打印通常会阻塞......这会扰乱性能。 明智的做法是用非阻塞例程替换 lwip 调试打印,您知道它不会影响实时性能。
我遇到了同样的问题,我认为在 udp_ send 函数中,标头将被添加到您的 pbuf 中,并且它会增加 pbif 的 len 元素。所以你有两个选择,首先你应该释放pbuf并在下一个周期分配它。其次,您可以使用 pbuf_free_header 函数截断添加的标头,在这种情况下不需要释放 pbuf 和重新分配。