diff options
-rw-r--r-- | cmd/net.c | 10 | ||||
-rw-r--r-- | include/net.h | 2 | ||||
-rw-r--r-- | net/bootp.c | 14 | ||||
-rw-r--r-- | net/net.c | 2 |
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 */ |