net: Implement random ethaddr fallback in eth.c

Implement the random ethaddr fallback in eth.c so it is in a common
place and not reimplemented in each board or driver that wants this
behavior.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Joe Hershberger 2015-05-04 14:55:13 -05:00
parent abbfcbe58e
commit bef1014b31
4 changed files with 24 additions and 1 deletions

3
README
View File

@ -5623,7 +5623,8 @@ o If both the SROM and the environment contain a MAC address, and the
warning is printed. warning is printed.
o If neither SROM nor the environment contain a MAC address, an error o If neither SROM nor the environment contain a MAC address, an error
is raised. is raised. If CONFIG_NET_RANDOM_ETHADDR is defined, then in this case
a random, locally-assigned MAC is used.
If Ethernet drivers implement the 'write_hwaddr' function, valid MAC addresses If Ethernet drivers implement the 'write_hwaddr' function, valid MAC addresses
will be programmed into hardware as part of the initialization process. This will be programmed into hardware as part of the initialization process. This

View File

@ -37,6 +37,8 @@ Correct flow of setting up the MAC address (summarized):
environment variable will be used unchanged. environment variable will be used unchanged.
If the environment variable is not set, it will be initialized from If the environment variable is not set, it will be initialized from
eth_device->enetaddr, and a warning will be printed. eth_device->enetaddr, and a warning will be printed.
If both are invalid and CONFIG_NET_RANDOM_ETHADDR is defined, a random,
locally-assigned MAC is written to eth_device->enetaddr.
4. Program the address into hardware if the following conditions are met: 4. Program the address into hardware if the following conditions are met:
a) The relevant driver has a 'write_addr' function a) The relevant driver has a 'write_addr' function
b) The user hasn't set an 'ethmacskip' environment variable b) The user hasn't set an 'ethmacskip' environment variable

View File

@ -7,4 +7,12 @@ menuconfig NET
if NET if NET
config NET_RANDOM_ETHADDR
bool "Random ethaddr if unset"
help
Selecting this will allow the Ethernet interface to function
even when the ethaddr variable for that interface is unset.
A new MAC address will be generated on every boot and it will
not be added to the environment.
endif # if NET endif # if NET

View File

@ -538,9 +538,15 @@ static int eth_post_probe(struct udevice *dev)
printf("\nWarning: %s using MAC address from ROM\n", printf("\nWarning: %s using MAC address from ROM\n",
dev->name); dev->name);
} else if (is_zero_ethaddr(pdata->enetaddr)) { } else if (is_zero_ethaddr(pdata->enetaddr)) {
#ifdef CONFIG_NET_RANDOM_ETHADDR
net_random_ethaddr(pdata->enetaddr);
printf("\nWarning: %s (eth%d) using random MAC address - %pM\n",
dev->name, dev->seq, pdata->enetaddr);
#else
printf("\nError: %s address not set.\n", printf("\nError: %s address not set.\n",
dev->name); dev->name);
return -EINVAL; return -EINVAL;
#endif
} }
return 0; return 0;
@ -666,9 +672,15 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
printf("\nWarning: %s using MAC address from net device\n", printf("\nWarning: %s using MAC address from net device\n",
dev->name); dev->name);
} else if (is_zero_ethaddr(dev->enetaddr)) { } else if (is_zero_ethaddr(dev->enetaddr)) {
#ifdef CONFIG_NET_RANDOM_ETHADDR
net_random_ethaddr(dev->enetaddr);
printf("\nWarning: %s (eth%d) using random MAC address - %pM\n",
dev->name, eth_number, dev->enetaddr);
#else
printf("\nError: %s address not set.\n", printf("\nError: %s address not set.\n",
dev->name); dev->name);
return -EINVAL; return -EINVAL;
#endif
} }
if (dev->write_hwaddr && !eth_mac_skip(eth_number)) { if (dev->write_hwaddr && !eth_mac_skip(eth_number)) {