diff mbox series

[v3,18/18] pxe: Allow calling the pxe_get logic directly

Message ID 20211014124803.v3.18.Ie921ec7581f232b07cda0e740bf65d66fb93f230@changeid
State Accepted
Commit d50244e9d8583378770392fb429a0283b2b47885
Delegated to: Tom Rini
Headers show
Series pxe: Refactoring to tidy up and prepare for bootflow | expand

Commit Message

Simon Glass Oct. 14, 2021, 6:48 p.m. UTC
Refactor this code so that we can call the 'pxe get' command without going
through the command-line interpreter. This makes it easier to get the
information we need, without going through environment variables.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v3:
- Rebase to -master

Changes in v2:
- Rebase to -next
- Split out from the bootmethod patches

 cmd/pxe.c           | 92 +++++++++++++++++++++++++++++----------------
 include/pxe_utils.h | 14 +++++++
 2 files changed, 73 insertions(+), 33 deletions(-)

Comments

Art Nikpal Oct. 18, 2021, 8:56 a.m. UTC | #1
OK nice its will be usefull

Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST
Reviewed-by: Artem Lapkin <email2tema@gmail.com>
Tested-by:  Artem Lapkin <email2tema@gmail.com>
Ramon Fried Nov. 9, 2021, 8:07 a.m. UTC | #2
On Thu, Oct 14, 2021 at 9:51 PM Simon Glass <sjg@chromium.org> wrote:
>
> Refactor this code so that we can call the 'pxe get' command without going
> through the command-line interpreter. This makes it easier to get the
> information we need, without going through environment variables.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v3:
> - Rebase to -master
>
> Changes in v2:
> - Rebase to -next
> - Split out from the bootmethod patches
>
>  cmd/pxe.c           | 92 +++++++++++++++++++++++++++++----------------
>  include/pxe_utils.h | 14 +++++++
>  2 files changed, 73 insertions(+), 33 deletions(-)
>
> diff --git a/cmd/pxe.c b/cmd/pxe.c
> index 81703386c42..db8e4697f24 100644
> --- a/cmd/pxe.c
> +++ b/cmd/pxe.c
> @@ -104,6 +104,49 @@ static int pxe_ipaddr_paths(struct pxe_context *ctx, unsigned long pxefile_addr_
>
>         return -ENOENT;
>  }
> +
> +int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep)
> +{
> +       struct cmd_tbl cmdtp[] = {};    /* dummy */
> +       struct pxe_context ctx;
> +       int i;
> +
> +       if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
> +                         env_get("bootfile")))
> +               return -ENOMEM;
> +       /*
> +        * Keep trying paths until we successfully get a file we're looking
> +        * for.
> +        */
> +       if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 ||
> +           pxe_mac_path(&ctx, pxefile_addr_r) > 0 ||
> +           pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0)
> +               goto done;
> +
> +       i = 0;
> +       while (pxe_default_paths[i]) {
> +               if (get_pxelinux_path(&ctx, pxe_default_paths[i],
> +                                     pxefile_addr_r) > 0)
> +                       goto done;
> +               i++;
> +       }
> +
> +       pxe_destroy_ctx(&ctx);
> +
> +       return -ENOENT;
> +done:
> +       *bootdirp = env_get("bootfile");
> +
> +       /*
> +        * The PXE file size is returned but not the name. It is probably not
> +        * that useful.
> +        */
> +       *sizep = ctx.pxe_file_size;
> +       pxe_destroy_ctx(&ctx);
> +
> +       return 0;
> +}
> +
>  /*
>   * Entry point for the 'pxe get' command.
>   * This Follows pxelinux's rules to download a config file from a tftp server.
> @@ -122,9 +165,10 @@ static int
>  do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>  {
>         char *pxefile_addr_str;
> -       unsigned long pxefile_addr_r;
> -       struct pxe_context ctx;
> -       int err, i = 0;
> +       ulong pxefile_addr_r;
> +       char *fname;
> +       ulong size;
> +       int ret;
>
>         if (argc != 1)
>                 return CMD_RET_USAGE;
> @@ -134,43 +178,25 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>         if (!pxefile_addr_str)
>                 return 1;
>
> -       err = strict_strtoul(pxefile_addr_str, 16,
> +       ret = strict_strtoul(pxefile_addr_str, 16,
>                              (unsigned long *)&pxefile_addr_r);
> -       if (err < 0)
> +       if (ret < 0)
>                 return 1;
>
> -       if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
> -                         env_get("bootfile"))) {
> +       ret = pxe_get(pxefile_addr_r, &fname, &size);
> +       switch (ret) {
> +       case 0:
> +               printf("Config file '%s' found\n", fname);
> +               break;
> +       case -ENOMEM:
>                 printf("Out of memory\n");
>                 return CMD_RET_FAILURE;
> +       default:
> +               printf("Config file not found\n");
> +               return CMD_RET_FAILURE;
>         }
> -       /*
> -        * Keep trying paths until we successfully get a file we're looking
> -        * for.
> -        */
> -       if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 ||
> -           pxe_mac_path(&ctx, pxefile_addr_r) > 0 ||
> -           pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) {
> -               printf("Config file found\n");
> -               pxe_destroy_ctx(&ctx);
> -
> -               return 0;
> -       }
> -
> -       while (pxe_default_paths[i]) {
> -               if (get_pxelinux_path(&ctx, pxe_default_paths[i],
> -                                     pxefile_addr_r) > 0) {
> -                       printf("Config file found\n");
> -                       pxe_destroy_ctx(&ctx);
> -                       return 0;
> -               }
> -               i++;
> -       }
> -
> -       printf("Config file not found\n");
> -       pxe_destroy_ctx(&ctx);
>
> -       return 1;
> +       return 0;
>  }
>
>  /*
> diff --git a/include/pxe_utils.h b/include/pxe_utils.h
> index 194a5ed8cc7..b7037f841a6 100644
> --- a/include/pxe_utils.h
> +++ b/include/pxe_utils.h
> @@ -236,4 +236,18 @@ int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt);
>   */
>  int pxe_get_file_size(ulong *sizep);
>
> +/**
> + * pxe_get() - Get the PXE file from the server
> + *
> + * This tries various filenames to obtain a PXE file
> + *
> + * @pxefile_addr_r: Address to put file
> + * @bootdirp: Returns the boot filename, or NULL if none. This is the 'bootfile'
> + *     option provided by the DHCP server. If none, returns NULL. For example,
> + *     "rpi/info", which indicates that all files should be fetched from the
> + *     "rpi/" subdirectory
> + * @sizep: Size of the PXE file (not bootfile)
> + */
> +int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep);
> +
>  #endif /* __PXE_UTILS_H */
> --
> 2.33.0.1079.g6e70778dc9-goog
>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Tom Rini Nov. 12, 2021, 3:40 p.m. UTC | #3
On Thu, Oct 14, 2021 at 12:48:11PM -0600, Simon Glass wrote:

> Refactor this code so that we can call the 'pxe get' command without going
> through the command-line interpreter. This makes it easier to get the
> information we need, without going through environment variables.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> Reviewed-by: Artem Lapkin <email2tema@gmail.com>
> Tested-by:  Artem Lapkin <email2tema@gmail.com>
> Reviewed-by: Ramon Fried <rfried.dev@gmail.com>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/cmd/pxe.c b/cmd/pxe.c
index 81703386c42..db8e4697f24 100644
--- a/cmd/pxe.c
+++ b/cmd/pxe.c
@@ -104,6 +104,49 @@  static int pxe_ipaddr_paths(struct pxe_context *ctx, unsigned long pxefile_addr_
 
 	return -ENOENT;
 }
+
+int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep)
+{
+	struct cmd_tbl cmdtp[] = {};	/* dummy */
+	struct pxe_context ctx;
+	int i;
+
+	if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
+			  env_get("bootfile")))
+		return -ENOMEM;
+	/*
+	 * Keep trying paths until we successfully get a file we're looking
+	 * for.
+	 */
+	if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 ||
+	    pxe_mac_path(&ctx, pxefile_addr_r) > 0 ||
+	    pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0)
+		goto done;
+
+	i = 0;
+	while (pxe_default_paths[i]) {
+		if (get_pxelinux_path(&ctx, pxe_default_paths[i],
+				      pxefile_addr_r) > 0)
+			goto done;
+		i++;
+	}
+
+	pxe_destroy_ctx(&ctx);
+
+	return -ENOENT;
+done:
+	*bootdirp = env_get("bootfile");
+
+	/*
+	 * The PXE file size is returned but not the name. It is probably not
+	 * that useful.
+	 */
+	*sizep = ctx.pxe_file_size;
+	pxe_destroy_ctx(&ctx);
+
+	return 0;
+}
+
 /*
  * Entry point for the 'pxe get' command.
  * This Follows pxelinux's rules to download a config file from a tftp server.
@@ -122,9 +165,10 @@  static int
 do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
 	char *pxefile_addr_str;
-	unsigned long pxefile_addr_r;
-	struct pxe_context ctx;
-	int err, i = 0;
+	ulong pxefile_addr_r;
+	char *fname;
+	ulong size;
+	int ret;
 
 	if (argc != 1)
 		return CMD_RET_USAGE;
@@ -134,43 +178,25 @@  do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 	if (!pxefile_addr_str)
 		return 1;
 
-	err = strict_strtoul(pxefile_addr_str, 16,
+	ret = strict_strtoul(pxefile_addr_str, 16,
 			     (unsigned long *)&pxefile_addr_r);
-	if (err < 0)
+	if (ret < 0)
 		return 1;
 
-	if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
-			  env_get("bootfile"))) {
+	ret = pxe_get(pxefile_addr_r, &fname, &size);
+	switch (ret) {
+	case 0:
+		printf("Config file '%s' found\n", fname);
+		break;
+	case -ENOMEM:
 		printf("Out of memory\n");
 		return CMD_RET_FAILURE;
+	default:
+		printf("Config file not found\n");
+		return CMD_RET_FAILURE;
 	}
-	/*
-	 * Keep trying paths until we successfully get a file we're looking
-	 * for.
-	 */
-	if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 ||
-	    pxe_mac_path(&ctx, pxefile_addr_r) > 0 ||
-	    pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) {
-		printf("Config file found\n");
-		pxe_destroy_ctx(&ctx);
-
-		return 0;
-	}
-
-	while (pxe_default_paths[i]) {
-		if (get_pxelinux_path(&ctx, pxe_default_paths[i],
-				      pxefile_addr_r) > 0) {
-			printf("Config file found\n");
-			pxe_destroy_ctx(&ctx);
-			return 0;
-		}
-		i++;
-	}
-
-	printf("Config file not found\n");
-	pxe_destroy_ctx(&ctx);
 
-	return 1;
+	return 0;
 }
 
 /*
diff --git a/include/pxe_utils.h b/include/pxe_utils.h
index 194a5ed8cc7..b7037f841a6 100644
--- a/include/pxe_utils.h
+++ b/include/pxe_utils.h
@@ -236,4 +236,18 @@  int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt);
  */
 int pxe_get_file_size(ulong *sizep);
 
+/**
+ * pxe_get() - Get the PXE file from the server
+ *
+ * This tries various filenames to obtain a PXE file
+ *
+ * @pxefile_addr_r: Address to put file
+ * @bootdirp: Returns the boot filename, or NULL if none. This is the 'bootfile'
+ *	option provided by the DHCP server. If none, returns NULL. For example,
+ *	"rpi/info", which indicates that all files should be fetched from the
+ *	"rpi/" subdirectory
+ * @sizep: Size of the PXE file (not bootfile)
+ */
+int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep);
+
 #endif /* __PXE_UTILS_H */