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

Ramon Fried rfried.dev at gmail.com
Tue Nov 9 09:07:52 CET 2021


On Thu, Oct 14, 2021 at 9:51 PM Simon Glass <sjg at 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 at 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 at gmail.com>


More information about the U-Boot mailing list