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.

[参考译文] AM6421:MCU+ SDK V8/ENET:即使未超过2048个条目的最大数量、有时向 FDB 添加多播 MAC 地址会失败

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1509987/am6421-mcu-sdk-v8-enet-adding-multicast-mac-addresses-to-the-fdb-is-sometimes-unsuccessful-even-though-the-maximum-number-of-2048-entries-has-not-been-exceeded

器件型号:AM6421

工具/软件:

在我们的测试中、我们尝试通过 IOCTL 将2047个 MAC 地址添加到 FDB 中。 这对大量条目有效。 但是、某些 MAC 地址会被拒绝。
即 Icssg_Ioctl CmdResp.status = 0x10 (错误)。 有没有这方面的解释?

随附测试算法。
"AddHwAddr()"通过 IOCTL 执行加法并评估响应结构。

//循环通过次数
Uword LOOP_cnt = 2047;
//已成功添加多播 MAC 地址的数量
uword mac_addr_cnt = 0;
//结果
结果 res[4000];
for (uword idx = 1;idx <(loop_cnt+ 1);++idx){
 ubyte high_byte = static_cast (IDX>> 8);
 ubyte low_byte = static_cast (IDX);
 IN::ETHAddr mac_addr (0x01、0x22、0x22、HIGH_BYTE、LOW_BYTE、 0x11);
 DWORD res_idx= gEth1Dev.AddHwAddr (mac_addr);
  
 RES[idx- 1].nr = idx;
 RES[idx- 1].mac[0]= mac_addr.mUs .mA ddr[0];
 RES[idx- 1].mac[1]= mac_addr.mUs .mA ddr[1];
 RES[idx- 1].mac[2]= mac_addr.mUs .mA ddr[2];
 RES[idx- 1].mac[3]= mac_addr.mUs .mA ddr[3];
 RES[idx- 1].mac[4]= mac_addr.mUs .mA ddr[4];
 RES[idx- 1].mac[5]= mac_addr.mUs .mA ddr[5];
  
 if (res_idx == ENET_Sok){
  RES[idx- 1].res = true;
  ++mac_addr_cnt;
 }其他{
  RES[idx - 1].res = false;
  ++LOOP_cnt;
 }
}

在以上示例中、前2030个 MAC 地址([0x01、0x22、0x22、0x00、0x01、 0x11]-[0x01、0x22、0x22、0x07、0xEE 0x11])已成功添加。

MAC 地址编号 2031 [0x01、0x22、0x22、0x07、0xEF、 0x11]被拒绝。

之后、有16个 MAC 地址([0x01、0x22、0x22、0x07、0xF0、 0x11]-[0x01、0x22、0x22、0x07、0xFF、 0x11])已成功添加。

IDx = 2048...2216的 MAC 地址([0x01、0x22、0x22、0x08、0x00、 0x11]-[0x01、0x22、0x22、0x08、0xA8、 0x11])被拒绝。

IDx = 2217的 MAC 地址[0x01、0x22、0x22、0x08、0xA9、 0x11]已成功添加。
这也是最后一个。

如果 MAC 地址被拒绝(例如[0x01、0x22、0x22、0x07、0xEF、 0x11])首先添加、这也起作用。
程序行为不依赖于特定的 MAC 地址本身、而是取决于之前添加的 MAC 地址。

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

    尊敬的 Gerd:

    是的、如果多个 MAC 地址被散列到同一个 FDB 插槽、则可以这样做。

    进一步阐述、
    ICSSG_SIZE_OF_FDB  = 2048  
    ICSSG_NUM_FDB_bucket_entries  = 4
    ICSSG_NUM_OF_SLOTS = 512

    这意味着有512个 哈希值(插槽)、每个插槽可以包含4个 FDB 条目(存储桶)。 因此、支持的最大 FDB 条目为512 * 4 = 2048。

    因此、当发生冲突时、最多可以将4个唯一的 FDB 条目散列为相同的散列值。 如果有超过4个 具有相同哈希值(或插槽索引)的 FDB 条   目、则 如果该条目是非静态条目(可编程/已读条目)、则将替换最后一个 FDB 条目。 但是、如果已经存在的 FDB 条目是静态的(如果是多播地址)、则不会替换它、也不会添加新条目。

    您可以通过监视    Icssg_ioctlFdbAddEntry   ()中 Icssg MAC.Helper ()为每个 Utils_Fdb 地址返回的 BroadSideSlot 值来验证这一点。 如果任何插槽 出现 4、则无法再容纳任何其他条目。
    宽边插槽 值范围为0-511。

    Unknown 说:
    如果 MAC 地址被拒绝(例如[0x01、0x22、0x22、0x07、0xEF、 0x11])首先添加、这也起作用。
    程序行为不依赖于特定的 MAC 地址本身、而是取决于之前添加的 MAC 地址。

    是的、没错、根据 上述设计、这是预期行为。  


    谢谢。此致、
    Miriam

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

    非常感谢!