This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM3352:Windows recv () 未接收 TCP FIN 数据包–MAC 填充行为确认

Guru**** 2416110 points
Other Parts Discussed in Thread: AM3352

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1532824/am3352-tcp-fin-packet-not-received-by-windows-recv-mac-padding-behavior-confirmation

器件型号:AM3352

工具/软件:

您好、

我们正在使用 AM3352 处理器和 KSZ9131RNX PHY 开发千兆位以太网系统。 我们面临这样一个问题:从 AM3352 发送的 FIN 数据包在 Wireshark 中作为[FIN, ACK] Len=0帧被观察到recv()、但 Windows 应用程序无法使用标准函数接收到该数据包。

经过进一步调查、我们注意到、当传输的帧长度低于 60 字节时、除非手动填充 0x00 字节以满足最小 60 字节的要求、否则会丢弃该长度。 如果我们手动添加填充并更新 IP 报头总长度字段以包括填充, PC 会正确接收 FIN 数据包(尽管 recv () 返回 0 字节,这是预期的)。
但是、如果我们仅在尾部填充帧而不更新 IP 标头长度字段、PC 将无法识别 FIN 数据包。

根据 IEEE 802.3 标准、我们知道以太网 MAC 应自动填充小于 64 字节的帧。 我们也明白 PHY (KSZ9131RNX) 不会执行此填充。

为了确认我们的理解、请验证以下几点:

  1. 当不存在有效载荷(例如 FIN 数据包)时、AM3352 中的 CPSW(以太网 MAC)是否会自动填充以太网帧以满足 64 字节的最小值?

  2. 如果不是、AM335x 以太网驱动程序中是否有支持自动 MAC 电平填充的配置?

此致、
Conor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    还进行了其他研究。

    我们面临一个问题、即在从评估板到 PC 的 TCP 通信期间、当总帧大小小于最小以太网帧大小(60 字节)时、PC 应用无法正确接收 FIN 数据包。 尽管[FIN、ACK]数据包在 Wireshark 中可见、但recv() PC 端的功能不会返回并仍然被阻止。 为了解决该问题、我们当前将在应用程序端添加虚拟填充数据、以满足 60 字节的最小大小。 但是、这需要手动调整 IP 报头的总长度字段、这会使实现变得复杂。

    我们已经查看了 NDK 文档 、并找到一个名为“Minimum Send Size“的配置选项、但它似乎主要适用于 UDP 流量。 我们想澄清以下关于支持自动填充的要点:

    【问题】

    1. NDK 的最小发送大小设置是否也适用于 TCP 流量(包括 FIN 等控制数据包)?

    2. AM3352 + TI-RTOS 上的 CPSW 驱动程序或 NDK 协议栈中是否有任何机制可以自动填充传出以太网帧以满足 60 字节的最小长度?

    我知道不再支持 TI-RTOS、但如果您能尽快进行调查以解决问题、我将不胜感激。

    Conor