From: Tony Breeds Date: Thu, 22 Oct 2009 04:53:00 +0000 (+1100) Subject: Handle ipv6 boot parameters for POWER architecture. X-Git-Tag: yaboot-1.3.17-rc1~28^2 X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=commitdiff_plain;h=d8ea971a7f1c29e384c813773331c7148e5a18aa Handle ipv6 boot parameters for POWER architecture. This is implementation derived. This follows the semantics defined in section 4.3.1 of http://www.power.org/apps/org/workgroup/parch/download.php/2380/latest (It is under the Members area of TSC - Platform Architecture committee). [ Fixed merge conflicts in second/file.c and second/fs_of.c ] Signed-off-by: Chandra Seetharaman Signed-off-by: Tony Breeds --- diff --git a/include/file.h b/include/file.h index cff6cbb..b2d9c63 100644 --- a/include/file.h +++ b/include/file.h @@ -47,6 +47,11 @@ struct boot_fspec_t { char* tftp_retries; /* TFTP retries */ char* subnetmask; /* Subnet mask */ char* addl_params; /* copy all additional parameters */ + + /* Following fields are used only in ipv6 format */ + int is_ipv6; /* is ipv6 specified ? */ + char* dhcpv6; /* dhcpv6 string */ + char* blksize; /* blksize string */ }; struct boot_file_t { diff --git a/include/prom.h b/include/prom.h index e0397ec..a512f2b 100644 --- a/include/prom.h +++ b/include/prom.h @@ -37,6 +37,7 @@ typedef void *phandle; #define PROM_INVALID_HANDLE ((prom_handle)-1UL) #define BOOTDEVSZ (2048) /* iscsi args can be in excess of 1040 bytes */ #define TOK_ISCSI "iscsi" +#define TOK_IPV6 "ipv6" #define PROM_CLAIM_MAX_ADDR 0x8000000 #define BOOTLASTSZ 1024 #define FW_NBR_REBOOTSZ 4 diff --git a/second/file.c b/second/file.c index aad1ba4..81d91a9 100644 --- a/second/file.c +++ b/second/file.c @@ -308,6 +308,50 @@ extract_netinfo_args(struct boot_fspec_t *result) return 1; } +/* + * Extract all the ipv6 arguments from the bootpath provided and fill result + * Syntax: ipv6,[dhcpv6[=diaddr,]]ciaddr=c_iaddr,giaddr=g_iaddr,siaddr=s_iaddr, + * filename=file_name,tftp-retries=tftp_retries,blksize=block_size + * Returns 1 on success, 0 on failure. + */ +static int +extract_ipv6_args(char *imagepath, struct boot_fspec_t *result) +{ + char *str, *tmp; + int total_len; + + result->is_ipv6 = 1; + + /* Just allocate the max required size */ + total_len = strlen(imagepath) + 1; + str = malloc(total_len); + if (!str) + return 0; + + if ((tmp = strstr(imagepath, "dhcpv6=")) != NULL) + result->dhcpv6 = scopy(&str, &tmp); + + if ((tmp = strstr(imagepath, "ciaddr=")) != NULL) + result->ciaddr = scopy(&str, &tmp); + + if ((tmp = strstr(imagepath, "giaddr=")) != NULL) + result->giaddr = scopy(&str, &tmp); + + if ((tmp = strstr(imagepath, "siaddr=")) != NULL) + result->siaddr = scopy(&str, &tmp); + + if ((tmp = strstr(imagepath, "filename=")) != NULL) + result->file = scopy(&str, &tmp); + + if ((tmp = strstr(imagepath, "tftp-retries=")) != NULL) + result->tftp_retries = scopy(&str, &tmp); + + if ((tmp = strstr(imagepath, "blksize=")) != NULL) + result->blksize = scopy(&str, &tmp); + + return 1; +} + /* * Extract all the arguments provided in the imagepath and fill it in result. * Returns 1 on success, 0 on failure. @@ -322,9 +366,13 @@ extract_netboot_args(char *imagepath, struct boot_fspec_t *result) if (!imagepath) return 1; - ret = extract_ipv4_args(imagepath, result); + if (strstr(imagepath, TOK_IPV6)) + ret = extract_ipv6_args(imagepath, result); + else + ret = extract_ipv4_args(imagepath, result); ret |= extract_netinfo_args(result); + DEBUG_F("ipv6 = <%d>\n", result->is_ipv6); DEBUG_F("siaddr = <%s>\n", result->siaddr); DEBUG_F("file = <%s>\n", result->file); DEBUG_F("ciaddr = <%s>\n", result->ciaddr); @@ -332,7 +380,9 @@ extract_netboot_args(char *imagepath, struct boot_fspec_t *result) DEBUG_F("bootp_retries = <%s>\n", result->bootp_retries); DEBUG_F("tftp_retries = <%s>\n", result->tftp_retries); DEBUG_F("addl_params = <%s>\n", result->addl_params); - + DEBUG_F("dhcpv6 = <%s>\n", result->dhcpv6); + DEBUG_F("blksize = <%s>\n", result->blksize); + return ret; } diff --git a/second/fs_of.c b/second/fs_of.c index 17a4df3..bd481e4 100644 --- a/second/fs_of.c +++ b/second/fs_of.c @@ -149,8 +149,11 @@ of_net_open(struct boot_file_t* file, *p = '\\'; } - DEBUG_F("siaddr <%s>; filename <%s>; ciaddr <%s>; giaddr <%s>;\n", - fspec->siaddr, filename, fspec->ciaddr, fspec->giaddr); + DEBUG_F("siaddr <%s>; filename <%s>; ciaddr <%s>; giaddr <%s>;" + " ipv6 <%d>\n", + fspec->siaddr, filename, fspec->ciaddr, fspec->giaddr, + fspec->is_ipv6); + strncpy(buffer, fspec->dev, 768); /* If we didn't get a ':' include one */ if (fspec->dev[strlen(fspec->dev)-1] != ':') @@ -166,6 +169,10 @@ of_net_open(struct boot_file_t* file, if (new_tftp) { strcat(buffer, fspec->siaddr); strcat(buffer, ","); + + if (fspec->is_ipv6 && (strstr(filename, "filename=") == NULL)) + strcat(buffer, "filename="); + strcat(buffer, filename); strcat(buffer, ","); strcat(buffer, fspec->ciaddr);