aboutsummaryrefslogtreecommitdiff
path: root/common/cmd_pxe.c
diff options
context:
space:
mode:
authorRob Herring2012-12-02 21:00:29 -0600
committerJoe Hershberger2013-06-24 19:10:14 -0500
commit98f646764d237b1776638cc83efba61bf92d8709 (patch)
tree9af005e2299baa7c71c5adae154c34f19da97fd1 /common/cmd_pxe.c
parent58d9ff936f106d8319a4be8a253a66adc2772736 (diff)
pxe: add ipappend support
Add ipappend support to pass network device information to the kernel. Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Diffstat (limited to 'common/cmd_pxe.c')
-rw-r--r--common/cmd_pxe.c47
1 files changed, 44 insertions, 3 deletions
diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c
index 3958e215d7a..1fb75d8ae9c 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;