diff options
Diffstat (limited to 'cmd/net.c')
-rw-r--r-- | cmd/net.c | 95 |
1 files changed, 44 insertions, 51 deletions
diff --git a/cmd/net.c b/cmd/net.c index 8f33c9f55d5..eaa1de5295f 100644 --- a/cmd/net.c +++ b/cmd/net.c @@ -297,15 +297,13 @@ static void netboot_update_env(void) /** * parse_addr_size() - parse address and size arguments for tftpput * - * @argv: command line arguments (argv[1] and argv[2] must be valid) - * @addrp: returns the address, on success - * @sizep: returns the size, on success + * @argv: command line arguments * Return: 0 on success */ -static int parse_addr_size(char * const argv[], ulong *addrp, ulong *sizep) +static int parse_addr_size(char * const argv[]) { - if (strict_strtoul(argv[1], 16, addrp) < 0 || - strict_strtoul(argv[2], 16, sizep) < 0) { + if (strict_strtoul(argv[1], 16, &image_save_addr) < 0 || + strict_strtoul(argv[2], 16, &image_save_size) < 0) { printf("Invalid address/size\n"); return CMD_RET_USAGE; } @@ -315,31 +313,24 @@ static int parse_addr_size(char * const argv[], ulong *addrp, ulong *sizep) /** * parse_args() - parse command line arguments * - * Sets: - * - image_save_addr and image_save_size, if proto == TFTPPUT - * * @proto: command prototype - * @argc: number of arguments, include the command, which has already been - * parsed - * @argv: command line arguments, with argv[0] being the command - * @fnamep: set to the filename, if provided, else NULL - * @addrp: returns the load/save address, if any is provided, else it is - * left unchanged - * @sizep: returns the save size, if any is provided, else it is left - * unchanged + * @argc: number of arguments + * @argv: command line arguments * Return: 0 on success */ -static int parse_args(enum proto_t proto, int argc, char *const argv[], - const char **fnamep, ulong *addrp, ulong *sizep) +static int parse_args(enum proto_t proto, int argc, char *const argv[]) { ulong addr; char *end; - *fnamep = NULL; switch (argc) { case 1: if (IS_ENABLED(CONFIG_CMD_TFTPPUT) && proto == TFTPPUT) return 1; + + /* refresh bootfile name from env */ + copy_filename(net_boot_file_name, env_get("bootfile"), + sizeof(net_boot_file_name)); break; case 2: @@ -352,42 +343,48 @@ static int parse_args(enum proto_t proto, int argc, char *const argv[], * mis-interpreted as a valid number. */ addr = hextoul(argv[1], &end); - if (end == (argv[1] + strlen(argv[1]))) - *addrp = addr; - else - *fnamep = argv[1]; + if (end == (argv[1] + strlen(argv[1]))) { + image_load_addr = addr; + /* refresh bootfile name from env */ + copy_filename(net_boot_file_name, env_get("bootfile"), + sizeof(net_boot_file_name)); + } else { + net_boot_file_name_explicit = true; + copy_filename(net_boot_file_name, argv[1], + sizeof(net_boot_file_name)); + } break; case 3: if (IS_ENABLED(CONFIG_CMD_TFTPPUT) && proto == TFTPPUT) { - if (parse_addr_size(argv, addrp, sizep)) + if (parse_addr_size(argv)) return 1; } else { - *addrp = hextoul(argv[1], NULL); - *fnamep = argv[2]; + image_load_addr = hextoul(argv[1], NULL); + net_boot_file_name_explicit = true; + copy_filename(net_boot_file_name, argv[2], + sizeof(net_boot_file_name)); } break; +#ifdef CONFIG_CMD_TFTPPUT case 4: - if (IS_ENABLED(CONFIG_CMD_TFTPPUT)) { - if (parse_addr_size(argv, addrp, sizep)) - return 1; - *fnamep = argv[3]; - break; - } + if (parse_addr_size(argv)) + return 1; + net_boot_file_name_explicit = true; + copy_filename(net_boot_file_name, argv[3], + sizeof(net_boot_file_name)); + break; +#endif default: return 1; } - return 0; } static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc, char *const argv[]) { - ulong addr, save_size; - bool fname_explicit; - const char *fname; char *s; int rcode = 0; int size; @@ -395,10 +392,10 @@ static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc, net_boot_file_name_explicit = false; *net_boot_file_name = '\0'; - /* pre-set addr */ + /* pre-set image_load_addr */ s = env_get("loadaddr"); if (s != NULL) - addr = hextoul(s, NULL); + image_load_addr = hextoul(s, NULL); if (IS_ENABLED(CONFIG_IPV6)) { use_ip6 = false; @@ -411,17 +408,12 @@ static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc, } } - if (parse_args(proto, argc, argv, &fname, &addr, &save_size)) { + if (parse_args(proto, argc, argv)) { bootstage_error(BOOTSTAGE_ID_NET_START); return CMD_RET_USAGE; } - if (fname) { - fname_explicit = true; - } else { - fname_explicit = false; - fname = env_get("bootfile"); - } + bootstage_mark(BOOTSTAGE_ID_NET_START); if (IS_ENABLED(CONFIG_IPV6) && !use_ip6) { char *s, *e; @@ -436,10 +428,12 @@ static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc, } } - size = netboot_run_(proto, addr, fname, save_size, fname_explicit, - IS_ENABLED(CONFIG_IPV6) && use_ip6); - if (size < 0) + size = net_loop(proto); + if (size < 0) { + bootstage_error(BOOTSTAGE_ID_NET_NETLOOP_OK); return CMD_RET_FAILURE; + } + bootstage_mark(BOOTSTAGE_ID_NET_NETLOOP_OK); /* net_loop ok, update environment */ netboot_update_env(); @@ -462,8 +456,7 @@ static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc, } #if defined(CONFIG_CMD_PING) -static int do_ping(struct cmd_tbl *cmdtp, int flag, int argc, - char *const argv[]) +int do_ping(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { if (argc < 2) return CMD_RET_USAGE; |