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.

[参考译文] AM2434:不响应 ping - lwIP 桥接器

Guru**** 2399305 points
Other Parts Discussed in Thread: AM2434

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1323907/am2434-not-responding-to-pings---lwip-bridge

器件型号:AM2434

大家好、Sitara MCU 团队:

我的客户遇到 AM2434的 lwIP 桥的问题。

他们在 CPSW、EMAC 和 R5F 之间实现了一个3端口交换机。

问题是到 CPU 的端口没有响应 ping。

这显然是 ICSS-CPSW+Bridge+DOCUMENTS.pdf 中的文档:

注:

  1.  网桥 NetIF 上的 Ping (ICMP 功能) 不响应。  这是因为

相同的数据包 用于对 交换的源 地址和目标地址执行 Ping 操作、

不由桥 输出 函数 (bridgeif_send_to_port)发送。

  1. 使用目标 地址作为网桥 MAC 地址的单播数据包 将  

消耗 的功耗 、 不会转发。

但是、这会带来问题、因为他们的产品需要能够对 Ping 做出响应、因此他们需要一种方法来使其正常工作。
是否已经有针对此问题的权变措施?

此致
曼努埃 

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

    尊敬的 Manuel Philippin:

    是的、有一个已知的权变措施。 Ping 不起作用的原因是 LwIP 本身的源代码阻止将数据包发送到 Rx 端口。 因此、如果器件的端口1获得 Ping 请求数据包、LwIP 堆栈将阻止响应数据包从端口1流出。  

    文件:  src neif/bridgeif.c

    这是 LwIP 桥接器的开箱即用 lwip-stack 代码。 第行的支票。 257是导致 Ping 功能中断的原因。

    在此处、您将必须删除行号 257.

    进行修改后、请重新编译所有 LwIP 库、然后重新编译您的应用。

    此变通办法已经过测试、应按预期运行

    此致、
    Shaunak

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

    大家好、Shaunak:

    请参阅下面的 客户的回应和建议

    使用建议的解决方案、要注释 bridgeif.c 中的第257行、RX 端口上会重复出现其他几个数据包、导致主以太网交换机检测到网络环路并临时关闭网络。

    问题在于、ICMP Ping 源代码回收了接收到的数据包、但不重置 RX 源端口、尽管它现在是 TX 数据包。 要重置新 TX 数据包的源端口、建议在 src proce/ipv4/icmp.c 中添加第208行:

    ---old src core/ipv4/icmp.c

    ++ new/pnpl core/ipv4/icmp.c src

    @@-205,6+205,7 @@ icmp_input(struct pbuf *p, struct netif *inp)

          /*我们通过切换 Dest 和 src IP 地址来生成一个应答,

           *将 ICMP 类型设置为 ECHO_RESPONSE 并更新校验和。 */

          iecho =(struct icmp_echo_HDR *) p->payload;

    +     p->if_idx = 0;       /*重置 if_idx 以发送回原始端口*/

          if (pbuf_add_header (p、hlen)){

            LWIP_DEBUGF (ICMP_DEBUG | LWIP_DBG_LEVEL_SCARIALE、("无法在数据包中移动标头");

          }其他{

    此致
    曼努埃

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

    您好、Manuel:

    [userid="486414" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1323907/am2434-not-responding-to-pings---lwip-bridge/5070134 #5070134"]要重置新 TX 数据包 src 的源端口,我建议添加行208 in[ene/ipv4/icmp.c: quote/quote]

    1.是的,更改有效。 这样、您可以在线路号 在 bridgeif.c 中为257、并对网桥执行 ping 操作。

    这里需要注意的是、TI 没有 LwIP 协议栈或 LwIP 内部协议的逻辑实现。 开源代码。 LwIP 只需更改源地址和目标地址即可处理对 PING 数据包的 ICMP 响应。 它不会更改数据包缓冲区的 if_idx。 我认为这样做是为了节省创建新数据包的内存和开销、因此它们会重复使用数据包。 这是 LwIP 方面的一些优化。

    使用建议的解决方案,注释 bridgeif.c 中的第257行,RX 端口上会重复多个其他数据包,导致主以太网交换机检测到网络循环并临时关闭网络。

    2.很抱歉我没想到,因为最初我以为它只是用于测试桥接接口。 您可以在 icmp.c 文件实现中添加您的更改、并恢复我在 bridgeif.c 中建议的更改。 这样、您就可以 ping 通桥接接口、而无需对 bridgeif.c 文件进行更改。

    此致、

    Shaunak

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

    您好、如何重新编译 lwIP 库?

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

    尊敬的 Isaac:

    我想您的版本是08.06 MCU_PLUS_SDK (如果我错了、请更正我)。 您可以使用以下命令进行构建。

    make -s -f makefile.am243x lwip-freertos_r5f.ti-arm-clang
    make -s -f makefile.am243x lwip-contrib-freertos_r5f.ti-arm-clang
    make -s -f makefile.am243x lwipif-cpsw-freertos_r5f.ti-arm-clang

    若要清理现有库、可以使用:

    make -s -f makefile.am243x lwip-freertos_r5f.ti-arm-clang_clean
    make -s -f makefile.am243x lwip-contrib-freertos_r5f.ti-arm-clang_clean
    make -s -f makefile.am243x lwipif-cpsw-freertos_r5f.ti-arm-clang_clean

    此外、您可以添加标志以构建该标志以用于调试构建。 (PROFILE=调试)。 默认情况下、它将针对释放模式构建。

    此致、

    Shaunak

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

    尊敬的 Shaunak:

    几乎现在我将使用的是 SDK 的9.01.00.41版。 尝试编译时出现以下错误:

    ```

    PS C:\ti\mcu_plus_sdk_am64x_09_01_00_41> gmake -s 库 PROFILE=release
    编译:board.am64x.a53.gcc-aarch64.release.lib:led/led.c
    process:CreateProcess (NULL、C:/ti/gcc-arm-9.2-2019.12-mingw-w64-i686-aarch64-none-elf/bin/aarch64-none-elf-gcc -c -mcpu=cortex-A53+fp+SIMD -mabi=LP64 -mcmodel=large -mstrict-align -mfix-cortex-A53-835769 -mfix-cortex-A53-843419 -werror -g IC /ti/mcu_plus_sdk_am64x_09_01_00_41/source
    make (e=2):DAS System kann die angegebene Datei nicht finden.
    makefile.am64x.a53.gcc-Aarch64:89:目标'led.obj'的配方失败
    gmak[2]:***[led.obj]错误2
    makefile.am64x:625:目标"board_a53.gcc-Aarch64"的配方失败
    gmake[1]:***[board_a53.gcc-Aarch64]错误2
    Makefile:68:目标'libs'的食谱失败
    gmake:***[libs]错误2

    ```

    我是否可以提出相关问题?

    谢谢你的帮助!

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

    您好 Isaac:

    感谢您的答复。

    您能确认一下、您是否正在使用 AM64x MCU+SDK 而不是 AM243x MCU+SDK

    PS C:\ti\mcu_plus_sdk_am64x_09_01_00_41> gmake -s libs profile=release
    编译:board.am64x.a53.gcc-aarch64.release.lib:led/led.c

    您能否说明您的系统中安装了哪个版本的 GCC Aarch64交叉编译器?

    似乎您不必 GCC Aarch64交叉 编译器工具链  安装在目录  C:\ti\gcc-arm-9.2-2019.12-MinGW-w64-i686-aarch64-none-elf

    请参阅  GCC AARCH64

    若要了解构建 SDK 所需的所有工具、请参阅 安装安装安装 SDK 工具

    此致、

    图沙尔