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.

[参考译文] TM4C1294NCPDT:绕过或选择性地禁用 ICMP 校验和卸载引擎

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1260676/tm4c1294ncpdt-bypass-or-selectively-disable-the-icmp-checksum-offload-engine

器件型号:TM4C1294NCPDT

我正在使用一台带有上述 MCU 的设备、该 MCU 使用 lwIP 实现网络功能。  该器件的一个函数 、用于响应 ping (ICMP ECHO 请求)并打印关于它们的数据(思考长度、 源等) 对于正常大小的 ping 数据包,它可以正常工作,但如果出现超大(>1500)数据包,ping 实用程序将看不到响应。 窥探 Wireshark 可发现响应到达并且看起来不错(整齐地分为2个帧)、但校验和是错误的。 通过探究 tm4c-lwip 代码、可以发现生成 ICMP 校验和的工作会降级至 MCU 的校验和卸载引擎。 根据数据表、"... TCP、UDP 或 ICMP 的校验和是在一个完整的帧中计算的、然后插入到其相应的标头字段中。" (第1452页)。 我猜是、lwIP 已经处理了碎片、错误的校验和是仅根据其中一个帧计算得出的。 是否有方法可以临时禁用校验和引擎、以便在该特定数据包变得杂乱之前在软件中计算校验和?  

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

    您好、Janis、

     很抱歉最近两天 e2e 因维护被关闭而延迟回复。  

    Unknown 说:
    我猜是因为 lwIP 已经处理了分段、并且错误的校验和只根据其中一个帧计算出来。 是否有方法可以临时禁用校验和引擎、以便在该特定数据包变得杂乱之前在软件中计算校验和?  [/报价]

    lwIP 具有以下校验和选项、您可以在 lwipopts.h 文件中启用/禁用这些选项。 如果您已经尝试禁用校验和、但我认为这是禁用校验和的永久方法。 我不知道是否有选项可以临时禁用校验和、因为我们不是第三方 lwIP 的专家。 请在 https://savannah.nongnu.org/projects/lwip/上咨询 lwIP 、希望专家能够指导您确定哪些可行、哪些不可行。  

    //*****
    //
    //------- 校验和选项-------------------------------------------------------
    //
    //*****
    //#define CHECKSUM_GEN_IP 1
    //#define CHECKSUM_GEN_UDP 1
    //#define CHECKSUM_GEN_TCP 1
    //#define CHECK_IP 1
    //#define CHECK_UDP 1
    //#define CHECK_TCP 1

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="573819" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1260676/tm4c1294ncpdt-bypass-or-selectively-disable-the-icmp-checksum-offload-engine 通过探究 tm4c-lwip 代码、发现生成 ICMP 校验和的工作会降级至 MCU 的校验和卸载引擎。 根据数据表、"... TCP、UDP 或 ICMP 的校验和是在一个完整的帧中计算的、然后插入到其相应的标头字段中。" (第1452页)。 [/报价]

    这 听起来与 MSP432E401Y 中报告的问题类似:simplelink_msp432e4_SDK_4_20_00_12中的 NDK 无法发送碎片化的 UDP 数据包、但可以接收它们、尽管在 MSP432E (使用与 TM4C129相同的以太网控制器)和 TI NDK 而非 LwIP 上是如此。

    不确定 Add modified EMACMSP432E4.c 驱动程序(仅为 IP 头启用硬件校验和卸载)中所述的修改是否 有助于了解如何 对 LwIP 驱动程序进行等效的更改。  

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

    它们全部被禁用(您列出的定义设置为0)-校验和生成不由 lwIP 处理、而是由控制器的内置校验和卸载引擎处理。  LWIP 的校验和函数在执行期间不会被调用。

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

    看起来确实存在同样的问题。 "MSP432E EMAC 校验和卸载因此无法生成或检查 被分成多个以太网帧的数据包的有效负载"-听起来和我正在处理的完全一样。 我将查看这些链接、它们看起来很有趣。 顺便说一下、我发现在 EMACCFG 寄存器中有一个位称为 IPC、据称它会启用/禁用校验和引擎、但据我所知、它仅适用于接收到的数据包、并且始终在传输时保持开启状态。

     顺便说一下、我们还尝试对器件执行 Ping 命令、其中有一个2048 B 的数据包、其有效负载全为0、即使数据包被截断、校验和也应该有效。 有人做出了响应、校验和确实有效、Wireshark 认识到了这一点、但 ping 实用程序仍然没有回答、因此这个问题可能也没有实际意义。 目前、我们想不响应过大的 Ping 数据包。  

    我想,如果这是一个生死问题,校验和引擎可能被欺骗提供正确的校验和。 如果您传送了一个数据包 、其中的校验和字段没有归零、该数据包将提供无效的校验和-我想它会在计算中使用它们。 我想在将值交给卸载引擎之前、计算出您可以放在校验和字段中的值所需的数学运算就不会太困难、这样最终结果就会与整个校验和中的正确校验和相匹配、 没有分割的数据包-但这是在哪个可怜的灵魂下一个来到这个话题,没有宣布它不是他的工作的选择。  

    编辑:好的,我不能让这个走了。 我怀疑仅计算第二帧中绑定的部分数据的(ICMP)校验和就足够了、并将其放入第一帧中的 ICMP 校验和字段中。 但是、没有足够的时间或动机来测试它。