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.

[FAQ] [参考译文] [FAQ] AM2634:AM26x 器件上的多播帧接收/发送问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1361967/faq-am2634-issues-in-receiving-sending-multicast-frames-on-am26x-devices

器件型号:AM2634

尊敬的专家:

  • 我从 AM26x 器件发送多播帧、但在 Wireshark 上不可见
  • 我向 AM26x 器件发送了多播帧、但我的应用程序没有接收到该帧。

CPSW 硬件或以太网驱动器在处理多播帧时是否存在问题? 如何检查跌落并解决发送/接收问题?

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

    您好!

    在 AM26x 器件上接收多播数据包时、问题主要发生在 ALE 表中不存在多播 ALE 条目或该条目具有不正确的端口掩码时。 如果 CPSW ALE 不知道多播地址、则会根据 UnknownMcastMembership 列表处理该数据包、甚至在 将其提交到以太网驱动程序之前、该数据包也可能被丢弃。  如果是这种情况、CPSW 统计数据将显示 ALE 压降计数递增。

    若要检查 CPSW 统计信息、可通过 CCS 使用 GEL 文件

    1. 启动目标配置后连接 R5F 内核
    2. 加载并运行应用。
    3. 当您想要运行 GEL 脚本时停止内核
    4. 转到"Scripts"→CPSW Statistics print→cpsw_3g_statsprint_nonzero

      在此检查 ALE 压降(理想情况下应为零)。  
      要了解有关 CPSW 统计信息的更多信息、请参阅  TRM 部分"CPSW 网络统计信息"

    要查看 ALE 表、您可以通过 CCS 使用 GEL 文件:

    1. 启动目标配置后连接 R5F 内核
    2. 加载并运行应用。
    3. 当您想要运行 GEL 脚本时停止内核
    4. 转至 Scripts→CPSW Statistics print→cpsw_print_ale_table_3g

    出现这些问题的主要原因是 ALE 表中缺少多播条目。 因此数据包将被 CPSW ALE 丢弃。  为了避免此问题、可以按如下方式将多播地址添加到 ALE 表中:

    MCU_PLUS_SDK (Enet-cpsw)

    使用 enet IOCTL 命令将 MAC 地址添加到表中

    CpswAle_SetMcastEntryInArgs setMcastInArgs;
    uint8_t mcastMacAddr[] = {0x01, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
    Enet_IoctlPrms prms;
    uint32_t setMcastOutArgs;
    int32_t status = ENET_SOK;
    memset(&setMcastInArgs, 0, sizeof(setMcastInArgs));
    memcpy(&(setMcastInArgs.addr.addr[0U]), &(mcastMacAddr[0U]), sizeof(setMcastInArgs.addr.addr));
    setMcastInArgs.info.super = false;
    setMcastInArgs.info.numIgnBits = 0U;
    setMcastInArgs.info.fwdState = CPSW_ALE_FWDSTLVL_FWD;
    setMcastInArgs.info.portMask = CPSW_ALE_ALL_PORTS_MASK;
    ENET_IOCTL_SET_INOUT_ARGS(&prms, &setMcastInArgs, &setMcastOutArgs);
    ENET_IOCTL(hEnet, EnetSoc_getCoreId(), CPSW_ALE_IOCTL_ADD_MCAST, &prms, status);
    if (status != ENET_SOK)
    {
       EnetAppUtils_print("failed to add a new mcast entry to ALE table: %d\n", status);
    }

    MCAL SDK (MCAL ETH)

    使用 Eth_Update AddrFilter() API 将 MAC 地址添加到表中。

    Std_ReturnType      retVal    = (Std_ReturnType) E_NOT_OK;
    uint8_t mcastMacAddr[] = {0x01, 0x00, 0x5E, 0xAA, 0xAA, 0xAA};
    retVal = Eth_UpdatePhysAddrFilter(pEthConfigPtr->ctrlIdx,
                                           gTestMacAddr,
                                           ETH_ADD_TO_FILTER);

    添加上述步骤后、重新编译示例并重新加载和运行。 运行 ALE GEL 脚本以获取 ALE 表的转储、并检查表中是否现在存在多播 MAC 地址。

    从 AM26x 器件发送数据包时、如果数据包在线路上不可见:

    1. 确保 MAC 端口和主机端口都是多播地址组的成员。
    2. 可以使用上面共享的相同代码片段将多播地址添加到 ALE 表中。
    3. 检查端口掩码是否设置正确,以将数据包路由到正确的 MAC 端口和主机端口。

    此致、
    Shaunak