[PATCH v2 4/6] net: eth_bootdev_hunt() must not try to boot
Heinrich Schuchardt
heinrich.schuchardt at canonical.com
Tue Nov 26 17:16:44 CET 2024
On 26.11.24 16:38, Simon Glass wrote:
> Hi Heinrich,
>
> On Tue, 26 Nov 2024 at 00:42, Heinrich Schuchardt
> <heinrich.schuchardt at 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 at 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.
The cited code only sets "autoload". It does not adjust "autostart".
As I have shown below this leads to trying to boot via DHCP.
This is exactly what the commit message says: "load a file and boot it
if autostart=yes".
>
>>
>> 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?
We need to probe network to provide the simple network protocol
(lib/efi_loader/efi_net.c) but we don't need to execute DHCP.
We also need the correct device-tree provided by the extension hunter.
Best regards
Heinrich
>
>>
>> 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
More information about the U-Boot
mailing list