尊敬的专家:
- 我从 AM26x 器件发送多播帧、但在 Wireshark 上不可见
- 我向 AM26x 器件发送了多播帧、但我的应用程序没有接收到该帧。
CPSW 硬件或以太网驱动器在处理多播帧时是否存在问题? 如何检查跌落并解决发送/接收问题?
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.
尊敬的专家:
CPSW 硬件或以太网驱动器在处理多播帧时是否存在问题? 如何检查跌落并解决发送/接收问题?
您好!
在 AM26x 器件上接收多播数据包时、问题主要发生在 ALE 表中不存在多播 ALE 条目或该条目具有不正确的端口掩码时。 如果 CPSW ALE 不知道多播地址、则会根据 UnknownMcastMembership 列表处理该数据包、甚至在 将其提交到以太网驱动程序之前、该数据包也可能被丢弃。 如果是这种情况、CPSW 统计数据将显示 ALE 压降计数递增。
若要检查 CPSW 统计信息、可通过 CCS 使用 GEL 文件:
要查看 ALE 表、您可以通过 CCS 使用 GEL 文件:
出现这些问题的主要原因是 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 器件发送数据包时、如果数据包在线路上不可见:
此致、
Shaunak