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.

[参考译文] MCU-PLUS-SDK-AM243X:ENET (ICSS)-如何更改已使用的 MAC 地址

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1099797/mcu-plus-sdk-am243x-enet-icss---how-to-change-used-mac-address

器件型号:MCU-PLUS-SDK-AM243X

尊敬的 TI 专家:

我正在寻找一个选项来更改使用的 MAC 地址。

我们使用的 LWIP 和 Enet (ICSS)与 SDK 08.02.00.12提供的"enet_lwip_icssg"示例类似、我们希望我们的器件使用制造商特定的 MAC-ID、而不是任何预编程的 TI MAC-ID (例如、在启动期间从非易失性存储器读取它)。

这可以通过使用特定的 Enet-API 调用来实现吗?

此致

Alexander Goehrig

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

    您好、Alexander、

    当前示例应用程序使用由 Resource Manger 提供的 MAC ID。 如果您不想使用此 MAC、您仍然可以随时使用配置您自己的 Mac ID  

    "ICSSG_MACPORT_IOCTL_SET_MACADDR" ioctl 提供输入参数作为您自己的 Mac 地址和 Mac 端口号。

    请参阅此处的文档: software-dl.ti.com/.../group__DRV__ENET__ICSSG.html

    如果您在使用时发现任何问题、请告诉我。
    此致、
    Mohan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Mohan、

    感谢您的回复。 我已经详细了解了"ICSSG_MACPORT_IOCTL_SET_MACADDR"命令和 enet_ioctl()函数在通过 SDK 提供的某些实现中的用法。

    我无法使 enet_handle 传递到 enet_ioctl()函数。

    在我们的应用程序中,我们实现了 enetCb_getFwPoolMem()、EnetApp_initLinkArgs ()和 EnetApp_getEnetInstInfo(),这与我在第一个帖子中提到的示例类似,我希望传递一个句柄,以便我可以使用它来更改 MAC 地址。 不幸的是,我没有找到一个

    我是否可以使用任何类型的 getEntHandle() Mehtod 来获取这样的 enet_handle?

    此致

    Alex

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

    尊敬的 Alex:

    我理解您的问题、并尝试在测试应用程序中添加 ioctl、并将在基本验证后的某个时间内提供其他详细信息。

    此致、

    Mohan。

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

    尊敬的 Alex:

    我已经验证有一个"enet_getHandle" API 可用于获取所需的 Enet 外设句柄。

    您必须通过添加所需的头文件将适当的输入传递给该 API。

    我们需要为 API 提供2个输入。例如、请参阅以下内容:

    包含所需的头文件(必须包含" sources\networking\enet\core\include\enet.h")

    /*声明类型为 enet_handle*/的变量
    enet_handle henet_new;


    /*调用 API 以获得具有正确选项的所需句柄*/
    henet_new = enet_getHandle (ENET_ICSSG_DUALMAC、2);

    将此句柄传递给所需的 ioctl。

    如果您在获取该信息时遇到困难、请告知我们。

    此致、

    Mohan。

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

    尊敬的 Alex:

    我已经验证有一个"enet_getHandle" API 可用于获取所需的 Enet 外设句柄。

    您必须通过添加所需的头文件将适当的输入传递给该 API。

    我们需要为 API 提供2个输入。例如、请参阅以下内容:

    包含所需的头文件(必须包含" sources\networking\enet\core\include\enet.h")

    /*声明类型为 enet_handle*/的变量
    enet_handle henet_new;


    /*调用 API 以获得具有正确选项的所需句柄*/
    henet_new = enet_getHandle (ENET_ICSSG_DUALMAC、2);

    将此句柄传递给所需的 ioctl。

    请注意 ,enet_getHandle() API 只能在 enet_open() API 成功后调用,否则它将返回 NULL。

    如果您在获取该信息时遇到困难、请告知我们。

    此致、

    Mohan。

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

    大家好、Mohan、

    感谢您的回答。 我尝试通过执行一个小函数来集成更改 MAC 地址的可能性:

    void changeMacAddress()
    {
      int32_t status;
      Enet_IoctlPrms prms;
      IcssgMacPort_SetMacAddressInArgs inArgs;
    
      inArgs.macAddr[0] = 0x12;
      inArgs.macAddr[1] = 0x34;
      inArgs.macAddr[2] = 0x56;
      inArgs.macAddr[3] = 0x78;
      inArgs.macAddr[4] = 0x9A;
      inArgs.macAddr[5] = 0xBC;
    
      inArgs.macPort = ENET_MAC_PORT_1;
      uint32_t coreId = EnetSoc_getCoreId();
    
      Enet_Handle enethandle = NULL;
    
      enethandle = Enet_getHandle(ENET_ICSSG_DUALMAC, 2);
    
      EnetAppUtils_print("enethandle achieved: 0x%x\r\n", enethandle);
    
      ENET_IOCTL_SET_IN_ARGS(&prms, &inArgs);
      status = Enet_ioctl(enethandle, coreId, ICSSG_MACPORT_IOCTL_SET_MACADDR, &prms);
      if (status != ENET_SOK)
      {
         EnetAppUtils_print("SET_MACADDR failed: %d\r\n",
                            status);
      }
      else
      {
        EnetAppUtils_print("SET_MACADDR succeeded: %0x:%0x:%0x:%0x:%0x:%0x\r\n",
                           inArgs.macAddr[0], inArgs.macAddr[1], inArgs.macAddr[2] = 0xFF,
                             inArgs.macAddr[3], inArgs.macAddr[4], inArgs.macAddr[5]);
      }
    }

    起初,我在 enetApp_initLinkArgs()函数的末尾放置了一个函数调用,但没有效果。

    之后,我在应用程序中添加了另一个 changeMacAddress()调用,在检测到链接后,使用的 MAC 地址也没有变化。

    您可以在打印的日志中看到以下内容:

    ICSSG Dual MAC Test
    enethandle achieved: 0x805b44bc
    SET_MACADDR succeeded: 12:34:56:78:9A:BC
    EnetPhy_bindDriver: PHY 15: OUI:080028 Model:0f Ver:01 <-> 'dp83869' : OK
    PHY 3 is alive
    PHY 15 is alive
    Host MAC address: 70:ff:76:1d:92:c1
    
    [LWIPIF_LWIP] Enet has been started successfully
    [LWIPIF_LWIP] NETIF INIT SUCCESS
    Icssg_handleLinkUp: icssg1-1: Port 1: Link up: 1-Gbps Full-Duplex
    enethandle achieved: 0x805b44bc
    SET_MACADDR succeeded: SET_MACADDR succeeded: 12:34:56:78:9A:BC

    更改 MAC 地址后是否需要执行某种重新初始化、或者我的实现是否出错?

    一般情况下:是否有任何方法阻止以太网驱动程序使用预配置的 TI MAC 地址?

    此致

    Alex

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

    尊敬的 Alex:

    看起来您正在配置自己的 Mac ID,然后应用程序流将等待链接,在链接后,您将再次使用预定义的 Mac ID 进行配置,然后再配置一次您自己的 MAC ID。

    由于我们没有阻止默认 MAC 地址的选项,因此您可以尝试在 函数末尾的 LwipifEnetAppCb_getHandle() API 中执行 MAC 配置的代码,并在链接后配置您自己的 Mac ID,并尝试使用您自己的 MAC 发送流量 MAC ID 作为目标。


    如果您遇到任何问题、请告诉我。
    此致、
    Mohan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Mohan、

    感谢你的答复。 是的、在我的示例中、当我尝试设置 MAC ID 时有三次、因为我尝试在我们的应用程序中找到正确的位置来设置 MAC ID。

    如果 SET_MACADDR 调用出现问题,我会从 enet_ioctl()-调用返回一个错误。
    如果以太网端口处于错误状态以处理该命令、并且我必须对以太网驱动程序执行一些附加调用(例如、重新初始化或类似的操作)、我希望在接口 API 中提供一些提示/注释。

    不管怎样、我觉得有一点奇怪、那就是我必须更改在 enet-lwip-icssg.lib 中编译的代码才能提供这样一个-在我看来-基本功能。

    我认为如果在启动时网络上出现"未知"的 TI 器件(例如 ARP 或 DHCP)而不是使用过的制造商提供的设备(例如在安全网络分析期间)。

    在以太网上发生任何事情之前、是否无法设置 MAC ID? 使用 Profinet 时、PRU_PN_loadPru ()函数有一个 PRU_PN_TPrLoadParameter.ai8uMacAddr 参数、用于在初始化期间设置 MAC ID。

    您能否尝试使用 SDK 中的 enet_lwip_icssg 来重现该行为、并为我提供一些有关如何以及何时设置 MAC ID 的可靠信息?

    此致

    Alex

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

    尊敬的 Alex:

    我完全同意你所提到的观点。

    我们正在研究此问题、以找到解决此问题的最佳方法。 将尝试尽快修复此问题。

    此致、

    Mohan。

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

    尊敬的 Alex:

    作为问题的快速解决方案、我将 MAC 地址配置引入应用程序、下面的补丁中进行了更改。

    e2e.ti.com/.../interface_5F00_mac_5F00_config_5F00_patch.PATCH.txt

    我已将修补程序文件作为文本文件附加。 请通过删除.txt 重命名文件并应用于 MCU+SDK 08.02.00.12。 您可以在应用程序中自行传递设备 Mac ID。

    如果您发现任何问题、请告知我们。

    此致、

    Mohan。

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

    大家好、Mohan、

    非常感谢您提供该补丁。

    我们已经实施了它,但它仍然不起作用。

    在“成功”设置 MAC-Address 后,我们添加了一个额外的打印输出。

    IP-地址已设置、我们的 MAC-地址也会报告成功。

    主机 MAC 地址:70:ff:76:1D:92:C1

    SET_MACADDR 成功:0:69:ff:12:34:56

    但是、在使用 DHCP 设置 IP 地址后、MAC-Address 仍然是70:FF:76:1D:92:C1。

    请检查您是否可以重现此行为、并提供建议以帮助我们解决此问题。

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

    Sven、您好!

    我已经确认、我错过了一个打印陈述、我没有转到应用程序、这会导致这种混淆。 这只是一条打印消息。 我已经创建了一个新的补丁文件来移动这个文件、并打印了我们要传递给 ioctl 的 Mac 地址。 请尝试使用此补丁并告诉我。


    e2e.ti.com/.../interface_5F00_mac_5F00_config_5F00_patch_5F00_8_5F00_3_5F00_0_5F00_5_5F00_new.PATCH.txt


    我已将修补程序文件作为文本文件附加。 请通过删除.txt 重命名文件并应用于 MCU+SDK 08.03.00.05版本。

    谢谢你。

    此致、

    Mohan

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

    Sven、您好!

    请找到最新的补丁来解决此问题。  

    e2e.ti.com/.../interface_5F00_mac_5F00_config_5F00_patch_5F00_17062022.txt

    我已将修补程序文件作为文本文件附加。 请重命名该文件并应用到新的 MCU+SDK 08.03.00.05版本。

    仅此修补程序就足够了、不需要更改旧修补程序。 请应用此内容、如果您再次遇到任何问题、请告知我。

    此致、

    Mohan。

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

    大家好、Mohan、

    感谢您的回复并努力解决该问题。 我们集成了您的最新补丁、一切都按预期工作。

    为我们解决的问题;)

    此致

    Alex

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

    大家好、Mohan、

    我们最近发现,您建议的解决方案很遗憾将不再适用于 SDK V08.03.00.18版,因为 lwipApp_init()函数中放置了 EnetApp_getcustomInterfaceMacAddrList()-call 的 LwipApp_init()函数在 lwipifcb.c 文件中不再可用。

    您是否计划在未来的 SDK 版本中集成定制 MAC 地址解决方案?

    此致

    Alex