如何使用 connman 设置以太网接口 MAC 地址

How to set ethernet interface MAC address with connman

我有一个嵌入式系统,要求我从闪存中提取一个 MAC 地址,并在启动时将其传递到以太网接口。传统上,我在初始化脚本中修改了对 ifconfig 的调用,以仅将从闪存中拉出的 MAC 作为 hw ether 参数传递。

我正在使用的系统使用 connman 来处理网络连接。嵌入式系统将始终具有单个以太网连接,并在闪存中以自定义格式具有单个匹配的 MAC 地址。 connman 在接口可用更改时使用,因此拥有一个动态系统来处理接口的启动和关闭以及配置它是有帮助的。

是否可以将 MAC 传递给 connman 以类似于我之前使用 ifconfig 所做的方式使用,如果可以,如何?

或者是否可以将 MAC 作为引导参数传递给内核,以便 connman 永远不必知道这一点?我可以在 U-Boot 中将 MAC 从闪存中拉出,但以太网设备对 U-Boot 不可用。

Alternatively is it possible to pass the MAC as a boot parameter to the kernel so that connman never has to know about this?

是的,您可以使用 U-Boot 的 ethaddr 环境变量来做到这一点。

查看 U-Boot Environment Variables 变量文档。

相关文档片段:

ethaddr: Ethernet MAC address for first/only ethernet interface (= eth0 in Linux). This variable can be set only once (usually during manufacturing of the board). U-Boot refuses to delete or overwrite this variable once it has been set.

可能很简单运行下面的命令来设置环境变量并保存(当然是用你的MAC地址代替):

setenv ethaddr 11:22:33:44:55:66
saveenv

如果 ethaddr 尚未在您的 U-Boot 引导行中使用,那么您需要做的不仅仅是上述操作。有关如何在系统上进行配置的示例,请查看 How to set a fixed MAC address in a LeopardBoard DM36x.

这是使用 ethaddr 的引导命令,上面的站点以以下结尾:

setenv bootcmd 'setenv bootargs ${bootargs} davinci_emac.ethaddr=${ethaddr}; nboot 0x82000000 0 ${kerneloffset}'