On Thu, Jun 14, 2018 at 5:04 AM, Alexander Graf <[email protected]> wrote: > We can call commands like dhcp and bootp without arguments or with > explicit command line arguments that really should tell the code where > to look for files instead. > > Unfortunately, the current code simply overwrites command line arguments > in the dhcp case with dhcp values. > > This patch allows the code to preserve the command line values if they > were set on the command line. That way the semantics are slightly more > intuitive. > > The reason this patch does that by introducing a new variable is that we > can not rely on net_boot_file_name[0] being unset, as today it's > completely legal to call "dhcp" and afterwards run "tftp" and expect the > latter to repeat the same query as before. I would prefer not to break > that behavior in case anyone relies on it. > > Signed-off-by: Alexander Graf <[email protected]> > --- > cmd/net.c | 10 ++++++++-- > include/net.h | 2 ++ > net/bootp.c | 3 ++- > net/net.c | 2 ++ > 4 files changed, 14 insertions(+), 3 deletions(-) > > diff --git a/cmd/net.c b/cmd/net.c > index f83839c35e..eca6dd8918 100644 > --- a/cmd/net.c > +++ b/cmd/net.c > @@ -183,6 +183,8 @@ static int netboot_common(enum proto_t proto, cmd_tbl_t > *cmdtp, int argc, > int size; > ulong addr; > > + net_boot_file_name_explicit = false; > + > /* pre-set load_addr */ > s = env_get("loadaddr"); > if (s != NULL) > @@ -199,15 +201,18 @@ static int netboot_common(enum proto_t proto, cmd_tbl_t > *cmdtp, int argc, > * mis-interpreted as a valid number. > */ > addr = simple_strtoul(argv[1], &end, 16); > - if (end == (argv[1] + strlen(argv[1]))) > + if (end == (argv[1] + strlen(argv[1]))) { > load_addr = addr; > - else > + } else { > + net_boot_file_name_explicit = true; > copy_filename(net_boot_file_name, argv[1], > sizeof(net_boot_file_name)); > + } > break; > > case 3: > load_addr = simple_strtoul(argv[1], NULL, 16); > + net_boot_file_name_explicit = true; > copy_filename(net_boot_file_name, argv[2], > sizeof(net_boot_file_name)); > > @@ -220,6 +225,7 @@ static int netboot_common(enum proto_t proto, cmd_tbl_t > *cmdtp, int argc, > printf("Invalid address/size\n"); > return CMD_RET_USAGE; > } > + net_boot_file_name_explicit = true; > copy_filename(net_boot_file_name, argv[3], > sizeof(net_boot_file_name)); > break; > diff --git a/include/net.h b/include/net.h > index 5760685556..a259b7c530 100644 > --- a/include/net.h > +++ b/include/net.h > @@ -539,6 +539,8 @@ enum proto_t { > }; > > extern char net_boot_file_name[1024];/* Boot File name */ > +/* Indicates whether the file name was specified on the command line */ > +extern bool net_boot_file_name_explicit; > /* The actual transferred size of the bootfile (in bytes) */ > extern u32 net_boot_file_size; > /* Boot file size in blocks as reported by the DHCP server */ > diff --git a/net/bootp.c b/net/bootp.c > index 9d7cb5d30c..f3da8572b7 100644 > --- a/net/bootp.c > +++ b/net/bootp.c > @@ -157,7 +157,8 @@ static void store_net_params(struct bootp_hdr *bp) > #if defined(CONFIG_CMD_DHCP) > !(dhcp_option_overload & OVERLOAD_FILE) && > #endif > - (strlen(bp->bp_file) > 0)) { > + (strlen(bp->bp_file) > 0) && > + !net_boot_file_name_explicit) {
This seems like a reasonable check, but it also needs to happen in the case that the file is passed under option 67. > copy_filename(net_boot_file_name, bp->bp_file, > sizeof(net_boot_file_name)); > } > diff --git a/net/net.c b/net/net.c > index a4932f46d9..510d491271 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -165,6 +165,8 @@ ushort net_native_vlan = 0xFFFF; > > /* Boot File name */ > char net_boot_file_name[1024]; > +/* Indicates whether the file name was specified on the command line */ > +bool net_boot_file_name_explicit; > /* The actual transferred size of the bootfile (in bytes) */ > u32 net_boot_file_size; > /* Boot file size in blocks as reported by the DHCP server */ > -- > 2.12.3 > > _______________________________________________ > U-Boot mailing list > [email protected] > https://lists.denx.de/listinfo/u-boot _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

