summaryrefslogtreecommitdiff
path: root/cmd/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/net.c')
-rw-r--r--cmd/net.c95
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;