工具/软件:
您好 TI、
我正在使用 CPSW 的 AM64x。
CPWS 硬件中是否存在 MAC 过滤? 如果是、因为何时? (哪个 SDK)
通过查看用户手册+内核代码、内核中似乎有一个配置 ALE 的驱动程序可以处理 CPSW 内部的 MAC 滤波。 我的理解正确吗?
-天一
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.
工具/软件:
您好 TI、
我正在使用 CPSW 的 AM64x。
CPWS 硬件中是否存在 MAC 过滤? 如果是、因为何时? (哪个 SDK)
通过查看用户手册+内核代码、内核中似乎有一个配置 ALE 的驱动程序可以处理 CPSW 内部的 MAC 滤波。 我的理解正确吗?
-天一
你好 Ashwani Goel 和 Tian Liu
主要问题与 AM64x 器件内的 CPWS 有关? CPWS 是否支持 MAC 过滤?
在 TRM 文档中、我会说是的...
12.2.1.1.1 CPSW0特性
地址查找引擎(ALE)
MAC 地址阻塞
稍后、我们可以讨论在前一点响应 为正的情况下 Linux 和 MCU SDK (如果可用)中是否有驱动程序。
12.2.1.1.1 CPSW0特性
地址查找引擎(ALE)
[/报价]
您可以参考-
https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/enet_ioctl_interface.html#using_enet_ioctl
和
https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/group__CPSW__ALE__MOD.html#gabed7e8ccaf9e220220ce26e85697cb98 、了解 有关如何使用 ALE 和其他 CPSW IOCTL 的更多详细信息
下面是为 BC 帧创建添加条目的示例
EnetApp_addMCastEntry(enetType, instId, EnetSoc_getCoreId(), BROADCAST_MAC_ADDRESS, CPSW_ALE_ALL_PORTS_MASK);
或
void EnetApp_addMCastEntry(Enet_Type enetType, uint32_t instId, uint32_t coreId, const uint8_t *testMCastAddr, uint32_t portMask) { Enet_IoctlPrms prms; int32_t status; CpswAle_SetMcastEntryInArgs setMcastInArgs; uint32_t setMcastOutArgs; if (Enet_isCpswFamily(enetType)) { Enet_Handle hEnet = Enet_getHandle(enetType, instId); EnetAppUtils_assert(hEnet != NULL); memset(&setMcastInArgs, 0, sizeof(setMcastInArgs)); memcpy(&setMcastInArgs.addr.addr[0U], testMCastAddr, sizeof(setMcastInArgs.addr.addr)); setMcastInArgs.addr.vlanId = 0; setMcastInArgs.info.super = false; setMcastInArgs.info.numIgnBits = 0; setMcastInArgs.info.fwdState = CPSW_ALE_FWDSTLVL_FWD; setMcastInArgs.info.portMask = portMask; ENET_IOCTL_SET_INOUT_ARGS(&prms, &setMcastInArgs, &setMcastOutArgs); ENET_IOCTL(hEnet, coreId, CPSW_ALE_IOCTL_ADD_MCAST, &prms, status); if (status != ENET_SOK) { EnetAppUtils_print("EnetTestBcastMcastLimit_AddAleEntry() failed CPSW_ALE_IOCTL_ADD_MCAST: %d\n", status); } } }
此致
Ashwani
尊敬的 Milan Stevanovic:
您能否帮助了解您的使用案例以获得更好的进一步帮助?
您是否在寻找:
此致
Ashwani
问题是我们是否可以 在 CPSW 中执行此操作、而不是在软件栈中执行此操作。
应该可以...只需要有关您正在查找的筛选器的更多具体信息?
我们需要阻止不需要的以太网帧来干扰 CPU
这些帧的哪种类型(特定的 EtherType)?
MC 或 UC 目标地址?
根据 MAC 地址、将接收或丢弃数据包
假设基于源地址?
此致
Ashwani
它是用于鹅和 MC 的特定 EtherType
https://en.wikipedia.org/wiki/Multicast_address
您好 Milan/Tian、
我正在内部与 Ashwani 核实他在 RTOS 方面的当前进度。
同时、我可以从 TRM 中找到以下内容:对于 ALE 表中的单播地址条目、可以通过设置块位丢弃特定单播数据包。 单播地址位表示48位数据包 MAC 地址。
在 Linux 方面、在 am65-cpsw-nuss.c 驱动程序中、我看到下面一行似乎与单播数据包中的块位相对应。
我不确定多播数据包是否具有类似的阻塞功能、以及下面的"阻止/转发/学习"状态是否意味着多播数据包可以被阻止。 在内部对其进行双重检查。
-道林
我们需要阻止不需要的以太网帧来干扰 CPU。 根据 MAC 地址接收或丢弃数据包。 问题是我们是否可以 在 CPSW 而不是软件栈中执行此操作。
在内部进行检查后、仅根据硬件方面进行检查、CPSW 可以根据地址而不是 EtherType 阻止多播数据包。
请参阅 AM64x TRM 中的12.2.1.4.6.1.16数据包转发过程和12.2.1.4.6.1.16.1入口过滤过程、以查看丢弃数据包所需满足的条件列表。
具体而言、以下情况可能与丢弃多播数据包最为相关。
"IF ((ENABLE_RATE_LIMIT)和(超出速率限制) AND (不是 BCAST_MCAST_CTL)
然后是((找到多播/广播目标地址)和(非超级地址)或(未找到多播/广播目标地址))
然后丢弃数据包"
-道林
您好、天一:
筛选数据包因为 Ethertype 无法用于以 CPSW
我只是想补充一点、因为大家知道、尽管在硬件中 CPSW 无法按 EtherType 进行滤波、但通过实施一些 eBPF 程序来实现这一点(假设您正在使用 Linux)。 我们没有任何 EtherType 通过 eBPF 进行滤波的示例、但由于 Milan 提到、 大家 可以研究软件实现、使用 eBFP 来实现这一点可能是一种选择。
您是否知道可以阻止多少个多播地址 CPSW?
以下是我们 CPSW 硬件设计专家的反馈:
可通过将多播数据包添加到 ALE 表来阻止这些数据包。 我们支持多播范围。
-道林