[PATCH 3/3] net: add generic MAC address derivation from machine ID

Ahmad Fatoum a.fatoum at pengutronix.de
Tue Sep 12 05:34:28 PDT 2023

Hi Sascha,

On 12.09.23 12:49, Sascha Hauer wrote:
> On Mon, Sep 11, 2023 at 05:59:27PM +0200, Ahmad Fatoum wrote:
>> From: Ahmad Fatoum <ahmad at a3f.at>
>> Especially during development, devices often lack a MAC address. While a
>> MAC address can be easily added to the environment:
>>   nv dev.eth0.ethaddr="aa:bb:cc:dd:ee:ff"
>> It's easily lost when flashing complete new images, e.g. from CI.
>> Make the development experience neater by deriving a stable MAC address
>> if possible.
> I like this, because my Fritzbox network overview is full of duplicate
> entries coming from boards with random MAC addresses.

Glad you like it. If you are ok with the first two patches, can you take
those until I respin this?

>> @@ -558,6 +559,7 @@ static int of_populate_ethaddr(void)
> This function should be renamed. When reviewing this patch I asked
> myself why you limit generating a fixed MAC address to the DT case until
> I realized that you actually don't. I was just confused by the function
> name.

Ah, didn't notice that. Will rename.

>>  {
>>  	char str[sizeof("xx:xx:xx:xx:xx:xx")];
>>  	struct eth_device *edev;
>> +	bool generated = false;
>>  	int ret;
>>  	list_for_each_entry(edev, &netdev_list, list) {
>> @@ -566,11 +568,18 @@ static int of_populate_ethaddr(void)
>>  		ret = of_get_mac_addr_nvmem(edev->parent->of_node,
>>  					    edev->ethaddr);
> This check doesn't seem to be needed, generate_ether_addr() already
> returns -ENOSYS when this option is not enabled.

Until we have LTO, I'd like to keep this in, so the function need not be called.
In this instance, I find it is a less ugly alternative to have #ifdef and static inline..

>> @@ -381,9 +419,16 @@ static struct net_connection *net_new(struct eth_device *edev, IPaddr_t dest,
>>  	if (!is_valid_ether_addr(edev->ethaddr)) {
>>  		char str[sizeof("xx:xx:xx:xx:xx:xx")];
>> -		random_ether_addr(edev->ethaddr);
>> +
>> +		ret = generate_ether_addr(edev->ethaddr, edev->dev.id);
> For most network devices we won't get here because of_populate_ethaddr()
> will already have done it for us. It's only used for devices that are
> probed after postenvironment_initcall(), namely USB devices.

Or those that don't have CONFIG_NET_ETHADDR_FROM_MACHINE_ID enabled
or don't have a machine ID set.

> I think this deserves a cleanup before we merge this. The original
> reason to introduce a postenvironment_initcall() for getting the MAC
> address from nvmem was:
>> We do this in a very late initcall, because we don't want to enforce a
>> probe a probe order between nvmem providers and network devices. We
>> can't do it at randomization time, because we need to fixup Ethernet mac
>> addresses, even when barebox itself doesn't ifup the netdev.
> I think we should have one centralized function that retrieves the MAC
> address for an ethernet device. That should be called when we actually
> need that MAC address, so once in net_new() and once at of_fixup time.
> Right now the behaviour is inconsistent with regard to random MAC
> addresses. Currently we propagate the random MAC address to the Linux
> device tree when we use ethernet in barebox, but we don't propagate it
> when we do not use ethernet in barebox. We should decide what the
> desired behaviour is and do it consistently regardless if we use
> ethernet in barebox or not. This could be cleaned up along the way.

Randomized MAC addresses are a necessary evil when barebox needs to do
networking and doesn't have a stable address. If we have a stable address,
we shouldn't randomize.

Fixing up a randomized MAC address is a lesser evil than having different
MAC addresses for barebox and Linux. If we don't need a MAC address in barebox,
we shouldn't generate a random one just to fix it up.

If we have a stable address, we should tell Linux about it.

That's the logic of the current code and it's sensible to me. Why change it?


> Sascha

Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

More information about the barebox mailing list