[PATCH v2 1/3] net: Get pxe config file from dhcp option 209
Peter Robinson
pbrobinson at gmail.com
Tue Oct 24 15:52:12 CEST 2023
On Tue, Oct 24, 2023 at 1:30 PM Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 10/24/23 02:21, seanedmond at linux.microsoft.com wrote:
> > From: Sean Edmond <seanedmond at microsoft.com>
> >
> > Allow dhcp server pass pxe config file full path by using option 209
> >
> > Signed-off-by: Sean Edmond <seanedmond at microsoft.com>
> > ---
> > cmd/Kconfig | 4 ++++
> > cmd/pxe.c | 10 ++++++++++
> > net/bootp.c | 21 +++++++++++++++++++++
> > 3 files changed, 35 insertions(+)
> >
> > diff --git a/cmd/Kconfig b/cmd/Kconfig
> > index 5bc0a92d57..adbb1a6187 100644
> > --- a/cmd/Kconfig
> > +++ b/cmd/Kconfig
> > @@ -1826,6 +1826,10 @@ config BOOTP_PXE_CLIENTARCH
> > default 0x15 if ARM
> > default 0x0 if X86
> >
> > +config BOOTP_PXE_DHCP_OPTION
> > + bool "Request & store 'pxe_configfile' from BOOTP/DHCP server"
> > + depends on BOOTP_PXE
>
> Why should this be disabled by default?
>
> Do we really want a separate config variable?
I had similar thoughts, if it's a defined DHCP option I suspect most
users will want to use that for PXE, if it's not defined we'll have
the same process as we have now for the use to fall back to.
> > +
> > config BOOTP_VCI_STRING
> > string
> > depends on CMD_BOOTP
> > diff --git a/cmd/pxe.c b/cmd/pxe.c
> > index 704589702f..9404f44518 100644
> > --- a/cmd/pxe.c
> > +++ b/cmd/pxe.c
> > @@ -65,6 +65,8 @@ static int pxe_dhcp_option_path(struct pxe_context *ctx, unsigned long pxefile_a
> > int ret = get_pxe_file(ctx, pxelinux_configfile, pxefile_addr_r);
> >
> > free(pxelinux_configfile);
> > + /* set to NULL to avoid double-free if DHCP is tried again */
> > + pxelinux_configfile = NULL;
> >
> > return ret;
> > }
> > @@ -141,6 +143,14 @@ int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep, bool use_ipv6)
> > env_get("bootfile"), use_ipv6))
> > return -ENOMEM;
> >
> > + if (IS_ENABLED(CONFIG_BOOTP_PXE_DHCP_OPTION) &&
> > + pxelinux_configfile && !use_ipv6) {
> > + if (pxe_dhcp_option_path(&ctx, pxefile_addr_r) > 0)
> > + goto done;
> > +
> > + goto error_exit;
> > + }
> > +
> > if (IS_ENABLED(CONFIG_DHCP6_PXE_DHCP_OPTION) &&
> > pxelinux_configfile && use_ipv6) {
> > if (pxe_dhcp_option_path(&ctx, pxefile_addr_r) > 0)
> > diff --git a/net/bootp.c b/net/bootp.c
> > index 7b0f45e18a..6800290963 100644
> > --- a/net/bootp.c
> > +++ b/net/bootp.c
> > @@ -26,6 +26,7 @@
> > #ifdef CONFIG_BOOTP_RANDOM_DELAY
> > #include "net_rand.h"
> > #endif
> > +#include <malloc.h>
> >
> > #define BOOTP_VENDOR_MAGIC 0x63825363 /* RFC1048 Magic Cookie */
> >
> > @@ -601,6 +602,10 @@ static int dhcp_extended(u8 *e, int message_type, struct in_addr server_ip,
> > *e++ = 42;
> > *cnt += 1;
> > #endif
> > + if (IS_ENABLED(CONFIG_BOOTP_PXE_DHCP_OPTION)) {
> > + *e++ = 209; /* PXELINUX Config File */
> > + *cnt += 1;
> > + }
> > /* no options, so back up to avoid sending an empty request list */
> > if (*cnt == 0)
> > e -= 2;
> > @@ -909,6 +914,22 @@ static void dhcp_process_options(uchar *popt, uchar *end)
> > net_boot_file_name[size] = 0;
> > }
> > break;
> > + case 209: /* PXELINUX Config File */
>
> This 209 appears in multiple places. Please, define a constant, e.g.
> DHCP_OPTION_CONFIG_FILE, in bootp.h and use the symbolic name. Please,
> document the constant referring to RFC 5071.
>
> > + if (IS_ENABLED(CONFIG_BOOTP_PXE_DHCP_OPTION)) {
> > + /* In case it has already been allocated when get DHCP Offer packet,
> > + * free first to avoid memory leak.
> > + */
> > + if (pxelinux_configfile)
> > + free(pxelinux_configfile);
> > +
> > + pxelinux_configfile = (char *)malloc((oplen + 1) * sizeof(char));
> > +
> > + if (pxelinux_configfile)
> > + strlcpy(pxelinux_configfile, popt + 2, oplen + 1);
> > + else
> > + printf("Error: Failed to allocate pxelinux_configfile\n");
>
> We do the same in dhcp6_parse_options(). Please, factor out a common
> function to avoid code duplication.
>
> Best regards
>
> Heinrich
>
> > + }
> > + break;
> > default:
> > #if defined(CONFIG_BOOTP_VENDOREX)
> > if (dhcp_vendorex_proc(popt))
>
More information about the U-Boot
mailing list