From ef034c9d7069f19f9424c98beb9ca2ec027fb18b Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Sun, 2 Dec 2012 21:00:20 -0600 Subject: pxe: Use ethact setting for pxe Get the MAC address using eth_getenv_enetaddr_by_index so that the MAC address of ethact is used. This enables using the a NIC other than the first one for PXE boot. Signed-off-by: Rob Herring --- common/cmd_pxe.c | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 2dbd49cbd..f785c0e99 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -55,37 +55,21 @@ static char *from_env(char *envvar) */ static int format_mac_pxe(char *outbuf, size_t outbuf_len) { - size_t ethaddr_len; - char *p, *ethaddr; + uchar ethaddr[6]; - ethaddr = from_env("ethaddr"); - - if (!ethaddr) - return -ENOENT; - - ethaddr_len = strlen(ethaddr); - - /* - * ethaddr_len + 4 gives room for "01-", ethaddr, and a NUL byte at - * the end. - */ - if (outbuf_len < ethaddr_len + 4) { - printf("outbuf is too small (%d < %d)\n", - outbuf_len, ethaddr_len + 4); + if (outbuf_len < 21) { + printf("outbuf is too small (%d < 21)\n", outbuf_len); return -EINVAL; } - strcpy(outbuf, "01-"); - - for (p = outbuf + 3; *ethaddr; ethaddr++, p++) { - if (*ethaddr == ':') - *p = '-'; - else - *p = tolower(*ethaddr); - } + if (!eth_getenv_enetaddr_by_index("eth", eth_get_dev_index(), + ethaddr)) + return -ENOENT; - *p = '\0'; + sprintf(outbuf, "01-%02x-%02x-%02x-%02x-%02x-%02x", + ethaddr[0], ethaddr[1], ethaddr[2], + ethaddr[3], ethaddr[4], ethaddr[5]); return 1; } -- cgit v1.2.3-70-g09d2 From 23b7194e61997910854f6566c9cad9ea75191f60 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Sun, 2 Dec 2012 21:00:21 -0600 Subject: pxe: make string parameters const Convert a bunch of string parameters to be const. Signed-off-by: Rob Herring --- common/cmd_pxe.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index f785c0e99..817114515 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -31,7 +31,7 @@ * environment. It always returns what getenv does, so it can be used in * place of getenv without changing error handling otherwise. */ -static char *from_env(char *envvar) +static char *from_env(const char *envvar) { char *ret; @@ -115,14 +115,14 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, return 1; } -static int (*do_getfile)(char *file_path, char *file_addr); +static int (*do_getfile)(const char *file_path, char *file_addr); -static int do_get_tftp(char *file_path, char *file_addr) +static int do_get_tftp(const char *file_path, char *file_addr) { char *tftp_argv[] = {"tftp", NULL, NULL, NULL}; tftp_argv[1] = file_addr; - tftp_argv[2] = file_path; + tftp_argv[2] = (void *)file_path; if (do_tftpb(NULL, 0, 3, tftp_argv)) return -ENOENT; @@ -132,12 +132,12 @@ static int do_get_tftp(char *file_path, char *file_addr) static char *fs_argv[5]; -static int do_get_ext2(char *file_path, char *file_addr) +static int do_get_ext2(const char *file_path, char *file_addr) { #ifdef CONFIG_CMD_EXT2 fs_argv[0] = "ext2load"; fs_argv[3] = file_addr; - fs_argv[4] = file_path; + fs_argv[4] = (void *)file_path; if (!do_ext2load(NULL, 0, 5, fs_argv)) return 1; @@ -145,12 +145,12 @@ static int do_get_ext2(char *file_path, char *file_addr) return -ENOENT; } -static int do_get_fat(char *file_path, char *file_addr) +static int do_get_fat(const char *file_path, char *file_addr) { #ifdef CONFIG_CMD_FAT fs_argv[0] = "fatload"; fs_argv[3] = file_addr; - fs_argv[4] = file_path; + fs_argv[4] = (void *)file_path; if (!do_fat_fsload(NULL, 0, 5, fs_argv)) return 1; @@ -166,7 +166,7 @@ static int do_get_fat(char *file_path, char *file_addr) * * Returns 1 for success, or < 0 on error. */ -static int get_relfile(char *file_path, void *file_addr) +static int get_relfile(const char *file_path, void *file_addr) { size_t path_len; char relfile[MAX_TFTP_PATH_LEN+1]; @@ -205,7 +205,7 @@ static int get_relfile(char *file_path, void *file_addr) * * Returns 1 on success, or < 0 for error. */ -static int get_pxe_file(char *file_path, void *file_addr) +static int get_pxe_file(const char *file_path, void *file_addr) { unsigned long config_file_size; char *tftp_filesize; @@ -242,7 +242,7 @@ static int get_pxe_file(char *file_path, void *file_addr) * * Returns 1 on success or < 0 on error. */ -static int get_pxelinux_path(char *file, void *pxefile_addr_r) +static int get_pxelinux_path(const char *file, void *pxefile_addr_r) { size_t base_len = strlen(PXELINUX_DIR); char path[MAX_TFTP_PATH_LEN+1]; @@ -382,7 +382,7 @@ do_pxe_get(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * * Returns 1 on success or < 0 on error. */ -static int get_relfile_envaddr(char *file_path, char *envaddr_name) +static int get_relfile_envaddr(const char *file_path, const char *envaddr_name) { unsigned long file_addr; char *envaddr; -- cgit v1.2.3-70-g09d2 From 500f304b6bb8eeb369087a91da2f58a28bf04941 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Sun, 2 Dec 2012 21:00:22 -0600 Subject: pxe: fix handling of different localboot values Add support for value of -1 For localboot. A value of -1 means return to u-boot prompt. The localboot value is often 0, so we need to distinguish the value from localboot being selected. A value of greater than or equal to 0 means attempt local boot command. If localboot is selected, we don't want to try other entries. Signed-off-by: Rob Herring --- common/cmd_pxe.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 817114515..5e3505c24 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -437,6 +437,7 @@ struct pxe_label { char *fdt; int attempted; int localboot; + int localboot_val; struct list_head list; }; @@ -575,7 +576,7 @@ static int label_localboot(struct pxe_label *label) * If the label specifies an 'append' line, its contents will overwrite that * of the 'bootargs' environment variable. */ -static void label_boot(struct pxe_label *label) +static int label_boot(struct pxe_label *label) { char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL }; int bootm_argc = 3; @@ -585,21 +586,22 @@ static void label_boot(struct pxe_label *label) label->attempted = 1; if (label->localboot) { - label_localboot(label); - return; + if (label->localboot_val >= 0) + label_localboot(label); + return 0; } if (label->kernel == NULL) { printf("No kernel given, skipping %s\n", label->name); - return; + return 1; } if (label->initrd) { if (get_relfile_envaddr(label->initrd, "ramdisk_addr_r") < 0) { printf("Skipping %s for failure retrieving initrd\n", label->name); - return; + return 1; } bootm_argv[2] = getenv("ramdisk_addr_r"); @@ -610,7 +612,7 @@ static void label_boot(struct pxe_label *label) if (get_relfile_envaddr(label->kernel, "kernel_addr_r") < 0) { printf("Skipping %s for failure retrieving kernel\n", label->name); - return; + return 1; } if (label->append) @@ -638,7 +640,7 @@ static void label_boot(struct pxe_label *label) if (get_relfile_envaddr(label->fdt, "fdt_addr_r") < 0) { printf("Skipping %s for failure retrieving fdt\n", label->name); - return; + return 1; } } else bootm_argv[3] = getenv("fdt_addr"); @@ -647,6 +649,7 @@ static void label_boot(struct pxe_label *label) bootm_argc = 4; do_bootm(NULL, 0, bootm_argc, bootm_argv); + return 1; } /* @@ -887,7 +890,6 @@ static int parse_integer(char **c, int *dst) { struct token t; char *s = *c; - unsigned long temp; get_token(c, &t, L_SLITERAL); @@ -896,12 +898,7 @@ static int parse_integer(char **c, int *dst) return -EINVAL; } - if (strict_strtoul(t.val, 10, &temp) < 0) { - printf("Expected unsigned integer: %s\n", t.val); - return -EINVAL; - } - - *dst = (int)temp; + *dst = simple_strtol(t.val, NULL, 10); free(t.val); @@ -1092,7 +1089,8 @@ static int parse_label(char **c, struct pxe_menu *cfg) break; case T_LOCALBOOT: - err = parse_integer(c, &label->localboot); + label->localboot = 1; + err = parse_integer(c, &label->localboot_val); break; case T_EOL: @@ -1351,10 +1349,13 @@ static void handle_pxe_menu(struct pxe_menu *cfg) * we give up. */ - if (err == 1) - label_boot(choice); - else if (err != -ENOENT) + if (err == 1) { + err = label_boot(choice); + if (!err) + return; + } else if (err != -ENOENT) { return; + } boot_unattempted_labels(cfg); } -- cgit v1.2.3-70-g09d2 From e6b6ccf203922059a07c6dde1d3198d8abf0ab27 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Mon, 3 Dec 2012 13:17:21 -0600 Subject: pxe: try bootz if bootm fails to find a valid image Standard pxelinux servers will typically use a zImage rather than u-boot image format, so fallback to bootz if bootm fails. Signed-off-by: Rob Herring --- common/cmd_pxe.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 5e3505c24..4e2811e15 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -579,6 +579,7 @@ static int label_localboot(struct pxe_label *label) static int label_boot(struct pxe_label *label) { char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL }; + char initrd_str[22]; int bootm_argc = 3; label_print(label); @@ -604,7 +605,10 @@ static int label_boot(struct pxe_label *label) return 1; } - bootm_argv[2] = getenv("ramdisk_addr_r"); + bootm_argv[2] = initrd_str; + strcpy(bootm_argv[2], getenv("ramdisk_addr_r")); + strcat(bootm_argv[2], ":"); + strcat(bootm_argv[2], getenv("filesize")); } else { bootm_argv[2] = "-"; } @@ -649,6 +653,11 @@ static int label_boot(struct pxe_label *label) bootm_argc = 4; do_bootm(NULL, 0, bootm_argc, bootm_argv); + +#ifdef CONFIG_CMD_BOOTZ + /* Try booting a zImage if do_bootm returns */ + do_bootz(NULL, 0, bootm_argc, bootm_argv); +#endif return 1; } -- cgit v1.2.3-70-g09d2 From e82eeb57091ea5ed9a25ece50e911cb8e3dd623d Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Sun, 2 Dec 2012 21:00:25 -0600 Subject: pxe: always display a menu when present The prompt flag is for displaying a "boot:" prompt in pxelinux. This doesn't make sense for u-boot as we don't support the pxelinux command interface. So we should just ignore prompt statements and always show the menu if a menu is present. Signed-off-by: Rob Herring --- common/cmd_pxe.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 4e2811e15..6e3fcb240 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -1155,6 +1155,7 @@ static int parse_pxefile_top(char *p, struct pxe_menu *cfg, int nest_level) err = 0; switch (t.type) { case T_MENU: + cfg->prompt = 1; err = parse_menu(&p, cfg, b, nest_level); break; @@ -1184,7 +1185,7 @@ static int parse_pxefile_top(char *p, struct pxe_menu *cfg, int nest_level) break; case T_PROMPT: - err = parse_integer(&p, &cfg->prompt); + eol_or_eof(&p); break; case T_EOL: -- cgit v1.2.3-70-g09d2 From 32d2ffe7316b39fbeb38525e9445601cb39276fd Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Sun, 2 Dec 2012 21:00:26 -0600 Subject: pxe: simplify menu display and selection Menus with lots of entries and long append lines are hard to read. Just show a numbered list using the label or name and make the choice by entering the number. Signed-off-by: Rob Herring --- common/cmd_pxe.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 6e3fcb240..079d22658 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -429,6 +429,7 @@ static int get_relfile_envaddr(const char *file_path, const char *envaddr_name) * list - lets these form a list, which a pxe_menu struct will hold. */ struct pxe_label { + char num[4]; char *name; char *menu; char *kernel; @@ -518,21 +519,9 @@ static void label_destroy(struct pxe_label *label) static void label_print(void *data) { struct pxe_label *label = data; - const char *c = label->menu ? label->menu : label->kernel; + const char *c = label->menu ? label->menu : label->name; - printf("%s:\t%s\n", label->name, c); - - if (label->kernel) - printf("\t\tkernel: %s\n", label->kernel); - - if (label->append) - printf("\t\tappend: %s\n", label->append); - - if (label->initrd) - printf("\t\tinitrd: %s\n", label->initrd); - - if (label->fdt) - printf("\tfdt: %s\n", label->fdt); + printf("%s:\t%s\n", label->num, c); } /* @@ -619,8 +608,10 @@ static int label_boot(struct pxe_label *label) return 1; } - if (label->append) + if (label->append) { setenv("bootargs", label->append); + printf("append: %s\n", label->append); + } bootm_argv[1] = getenv("kernel_addr_r"); @@ -1268,6 +1259,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) struct list_head *pos; struct menu *m; int err; + int i = 1; + char *default_num = NULL; /* * Create a menu and add items for all the labels. @@ -1281,18 +1274,23 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) list_for_each(pos, &cfg->labels) { label = list_entry(pos, struct pxe_label, list); - if (menu_item_add(m, label->name, label) != 1) { + sprintf(label->num, "%d", i++); + if (menu_item_add(m, label->num, label) != 1) { menu_destroy(m); return NULL; } + if (cfg->default_label && + (strcmp(label->name, cfg->default_label) == 0)) + default_num = label->num; + } /* * After we've created items for each label in the menu, set the * menu's default label if one was specified. */ - if (cfg->default_label) { - err = menu_default_set(m, cfg->default_label); + if (default_num) { + err = menu_default_set(m, default_num); if (err != 1) { if (err != -ENOENT) { menu_destroy(m); -- cgit v1.2.3-70-g09d2 From 8577fec976c58a0bd1c2c767f9dba058043624f4 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Sun, 2 Dec 2012 21:00:27 -0600 Subject: pxe: add support for ontimeout token ontimeout is similar to default, but is the selection on menu timeout. This is how cobbler sets a default. The label default is supposed to be the default selection when is pressed. If both default and ontimeout are set, last one parsed wins. Signed-off-by: Rob Herring --- common/cmd_pxe.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 079d22658..5a239edeb 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -672,6 +672,7 @@ enum token_type { T_PROMPT, T_INCLUDE, T_FDT, + T_ONTIMEOUT, T_INVALID }; @@ -700,6 +701,7 @@ static const struct token keywords[] = { {"initrd", T_INITRD}, {"include", T_INCLUDE}, {"fdt", T_FDT}, + {"ontimeout", T_ONTIMEOUT,}, {NULL, T_INVALID} }; @@ -997,10 +999,8 @@ static int parse_label_menu(char **c, struct pxe_menu *cfg, switch (t.type) { case T_DEFAULT: - if (cfg->default_label) - free(cfg->default_label); - - cfg->default_label = strdup(label->name); + if (!cfg->default_label) + cfg->default_label = strdup(label->name); if (!cfg->default_label) return -ENOMEM; @@ -1159,6 +1159,7 @@ static int parse_pxefile_top(char *p, struct pxe_menu *cfg, int nest_level) break; case T_DEFAULT: + case T_ONTIMEOUT: err = parse_sliteral(&p, &label_name); if (label_name) { @@ -1280,7 +1281,7 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) return NULL; } if (cfg->default_label && - (strcmp(label->name, cfg->default_label) == 0)) + (strcmp(label->name, cfg->default_label) == 0)) default_num = label->num; } -- cgit v1.2.3-70-g09d2 From 39f985536d3f0df5dba32c15b64ba2b5d32dd296 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Sun, 2 Dec 2012 21:00:28 -0600 Subject: pxe: add support for per arch and SoC default paths A pxelinux server setup for "default" menu is typically an x86 binary. This does not work well with a mixed architecture setup. Extend the default search to look for default-- and then default- before falling back to just "default". Signed-off-by: Rob Herring --- common/cmd_pxe.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 5a239edeb..59483a75c 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -26,6 +26,13 @@ #define MAX_TFTP_PATH_LEN 127 +const char *pxe_default_paths[] = { + "default-" CONFIG_SYS_ARCH "-" CONFIG_SYS_SOC, + "default-" CONFIG_SYS_ARCH, + "default", + NULL +}; + /* * Like getenv, but prints an error if envvar isn't defined in the * environment. It always returns what getenv does, so it can be used in @@ -339,7 +346,7 @@ do_pxe_get(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *pxefile_addr_str; unsigned long pxefile_addr_r; - int err; + int err, i = 0; do_getfile = do_get_tftp; @@ -360,16 +367,23 @@ do_pxe_get(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * Keep trying paths until we successfully get a file we're looking * for. */ - if (pxe_uuid_path((void *)pxefile_addr_r) > 0 - || pxe_mac_path((void *)pxefile_addr_r) > 0 - || pxe_ipaddr_paths((void *)pxefile_addr_r) > 0 - || get_pxelinux_path("default", (void *)pxefile_addr_r) > 0) { - + if (pxe_uuid_path((void *)pxefile_addr_r) > 0 || + pxe_mac_path((void *)pxefile_addr_r) > 0 || + pxe_ipaddr_paths((void *)pxefile_addr_r) > 0) { printf("Config file found\n"); return 0; } + while (pxe_default_paths[i]) { + if (get_pxelinux_path(pxe_default_paths[i], + (void *)pxefile_addr_r) > 0) { + printf("Config file found\n"); + return 0; + } + i++; + } + printf("Config file not found\n"); return 1; -- cgit v1.2.3-70-g09d2 From 58d9ff936f106d8319a4be8a253a66adc2772736 Mon Sep 17 00:00:00 2001 From: Joe Hershberger Date: Mon, 24 Jun 2013 17:21:04 -0500 Subject: net: Fix build regression in cmd_pxe.c Not all boards define an SOC. As a result, we can't depend on that. This was introduced in 39f985536d3f0df5dba32c15b64ba2b5d32dd296 Signed-off-by: Joe Hershberger --- common/cmd_pxe.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 59483a75c..3958e215d 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -27,7 +27,9 @@ #define MAX_TFTP_PATH_LEN 127 const char *pxe_default_paths[] = { +#ifdef CONFIG_SYS_SOC "default-" CONFIG_SYS_ARCH "-" CONFIG_SYS_SOC, +#endif "default-" CONFIG_SYS_ARCH, "default", NULL -- cgit v1.2.3-70-g09d2 From 98f646764d237b1776638cc83efba61bf92d8709 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Sun, 2 Dec 2012 21:00:29 -0600 Subject: pxe: add ipappend support Add ipappend support to pass network device information to the kernel. Signed-off-by: Rob Herring --- common/cmd_pxe.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) (limited to 'common/cmd_pxe.c') diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 3958e215d..1fb75d8ae 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -452,6 +452,7 @@ struct pxe_label { char *append; char *initrd; char *fdt; + int ipappend; int attempted; int localboot; int localboot_val; @@ -585,7 +586,11 @@ static int label_boot(struct pxe_label *label) { char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL }; char initrd_str[22]; + char mac_str[29] = ""; + char ip_str[68] = ""; + char *bootargs; int bootm_argc = 3; + int len = 0; label_print(label); @@ -624,9 +629,39 @@ static int label_boot(struct pxe_label *label) return 1; } - if (label->append) { - setenv("bootargs", label->append); - printf("append: %s\n", label->append); + if (label->ipappend & 0x1) { + sprintf(ip_str, " ip=%s:%s:%s:%s", + getenv("ipaddr"), getenv("serverip"), + getenv("gatewayip"), getenv("netmask")); + len += strlen(ip_str); + } + + if (label->ipappend & 0x2) { + int err; + strcpy(mac_str, " BOOTIF="); + err = format_mac_pxe(mac_str + 8, sizeof(mac_str) - 8); + if (err < 0) + mac_str[0] = '\0'; + len += strlen(mac_str); + } + + if (label->append) + len += strlen(label->append); + + if (len) { + bootargs = malloc(len + 1); + if (!bootargs) + return 1; + bootargs[0] = '\0'; + if (label->append) + strcpy(bootargs, label->append); + strcat(bootargs, ip_str); + strcat(bootargs, mac_str); + + setenv("bootargs", bootargs); + printf("append: %s\n", bootargs); + + free(bootargs); } bootm_argv[1] = getenv("kernel_addr_r"); @@ -689,6 +724,7 @@ enum token_type { T_INCLUDE, T_FDT, T_ONTIMEOUT, + T_IPAPPEND, T_INVALID }; @@ -718,6 +754,7 @@ static const struct token keywords[] = { {"include", T_INCLUDE}, {"fdt", T_FDT}, {"ontimeout", T_ONTIMEOUT,}, + {"ipappend", T_IPAPPEND,}, {NULL, T_INVALID} }; @@ -1109,6 +1146,10 @@ static int parse_label(char **c, struct pxe_menu *cfg) err = parse_integer(c, &label->localboot_val); break; + case T_IPAPPEND: + err = parse_integer(c, &label->ipappend); + break; + case T_EOL: break; -- cgit v1.2.3-70-g09d2