summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/net.c10
-rw-r--r--include/net.h2
-rw-r--r--net/bootp.c14
-rw-r--r--net/net.c2
4 files changed, 21 insertions, 7 deletions
diff --git a/cmd/net.c b/cmd/net.c
index f83839c35ec..eca6dd8918e 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 9c7199aca92..f9984ae86ca 100644
--- a/include/net.h
+++ b/include/net.h
@@ -540,6 +540,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 9d7cb5d30c1..fdcb4374a04 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) {
copy_filename(net_boot_file_name, bp->bp_file,
sizeof(net_boot_file_name));
}
@@ -889,10 +890,13 @@ static void dhcp_process_options(uchar *popt, uchar *end)
case 66: /* Ignore TFTP server name */
break;
case 67: /* Bootfile option */
- size = truncate_sz("Bootfile",
- sizeof(net_boot_file_name), oplen);
- memcpy(&net_boot_file_name, popt + 2, size);
- net_boot_file_name[size] = 0;
+ if (!net_boot_file_name_explicit) {
+ size = truncate_sz("Bootfile",
+ sizeof(net_boot_file_name),
+ oplen);
+ memcpy(&net_boot_file_name, popt + 2, size);
+ net_boot_file_name[size] = 0;
+ }
break;
default:
#if defined(CONFIG_BOOTP_VENDOREX)
diff --git a/net/net.c b/net/net.c
index 084269e31ec..f35695b4fc9 100644
--- a/net/net.c
+++ b/net/net.c
@@ -174,6 +174,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 */