
Hi Heinrich,
On Tue, 26 Nov 2024 at 00:42, Heinrich Schuchardt heinrich.schuchardt@canonical.com wrote:
On 11/26/24 01:32, Simon Glass wrote:
Hi Heinrich,
On Sat, 23 Nov 2024 at 14:46, Heinrich Schuchardt heinrich.schuchardt@canonical.com wrote:
eth_bootdev_hunt() should not execute dhcp_run() as this itself would load a file and boot it if autostart=yes.
Instead just check that there is a network device.
If you look at dhcp_run() you will see an 'autoload' parameter. This is 'false' in this code, so it never loads a file.
This is not the complete truth.
If $autostart=true and CONFIG_NET=y, dhcp_run(false) still tries to load a file.
Here is the code:
int dhcp_run(ulong addr, const char *fname, bool autoload) { char *dhcp_argv[] = {"dhcp", NULL, (char *)fname, NULL}; struct cmd_tbl cmdtp = {}; /* dummy */ char file_addr[17]; int old_autoload; int ret, result;
log_debug("addr=%lx, fname=%s, autoload=%d\n", addr, fname, autoload); old_autoload = env_get_yesno("autoload"); ret = env_set("autoload", autoload ? "y" : "n"); if (ret) return log_msg_ret("en1", -EINVAL);
It respects the autoload parameter. If there is a bug in that, we should fix it, but it seems to work OK to me. Please fix your commit message.
In all cases dhcp_run() wastes boot time.
Yes, it uses time. With bootstd the hunters are only called as needed. In your case you are calling all of them at once.
Is there a way to just call hunters which relate to block devices, perhaps?
CONFIG_NET=y => dhcp_run BOOTP broadcast 1 BOOTP broadcast 2 BOOTP broadcast 3 DHCP client bound to address 10.0.2.15 (1004 ms)
=> setenv autostart true => dhcp run BOOTP broadcast 1 BOOTP broadcast 2 BOOTP broadcast 3 DHCP client bound to address 10.0.2.15 (1002 ms) Using e1000#0 device TFTP from server 10.0.2.2; our IP address is 10.0.2.15 Filename 'run'. Load address: 0x40200000 Loading: * TFTP error: 'File not found' (1) Not retrying...
CONFIG_NET_LWIP=y => dhcp_run DHCP client bound to address 10.0.2.15 (1007 ms)
Where command dhcp_run is provided by:
#include <command.h> #include <env.h> #include <net-common.h> #include <vsprintf.h>
static int do_dhcp_run(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { ulong addr = hextoul(env_get("loadaddr"), NULL);
dhcp_run(addr, NULL, false); return 0;
}
U_BOOT_CMD( dhcp_run, CONFIG_SYS_MAXARGS, 1, do_dhcp_run, "dhcp_run", NULL );
See above
[..]
Regards, Simon