e.g. ipv6=2001:aaaa::1/48
Related: rhbz#679108
---
loader/loader.c | 24 ++++++++++++------------
loader/net.c | 16 ++++++++++++++++
loader/net.h | 1 +
3 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/loader/loader.c b/loader/loader.c
index 0c1aeb4..177d8a3 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -748,19 +748,14 @@ static void readNetInfo(struct loaderData_s ** ld) {
loaderData->gateway = strdup(val);
#ifdef ENABLE_IPV6
} else if (!g_strcmp0(pair[0], "IPV6ADDR")) {
- gchar **elements = g_strsplit(val, "/", 2);
-
- if (elements[0]) {
- loaderData->ipv6 = strdup(elements[0]);
+ if (split_ipv6addr_prefix_length(val,
+ &(loaderData->ipv6),
+ &(loaderData->ipv6prefix))) {
loaderData->ipv6info_set = 1;
flags |= LOADER_FLAGS_IPV6_PARAM;
- if (elements[1]) {
- loaderData->ipv6prefix = strdup(elements[1]);
- }
} else {
logMessage(WARNING, "readNetInfo could not parse IPV6ADDR: %s", val);
}
- g_strfreev(elements);
} else if (!g_strcmp0(pair[0], "IPV6_DEFAULTGW")) {
loaderData->gateway6 = strdup(val);
#endif
@@ -866,13 +861,18 @@ static void parseCmdLineIp(struct loaderData_s * loaderData, char *argv)
#ifdef ENABLE_IPV6
/*
- * parse anaconda ipv6= arguments
+ * parse anaconda ipv6= arguments - split prefix length if found
*/
static void parseCmdLineIpv6(struct loaderData_s * loaderData, char *argv)
{
- loaderData->ipv6 = strdup(argv+5);
- loaderData->ipv6info_set = 1;
- flags |= LOADER_FLAGS_IPV6_PARAM;
+ if (split_ipv6addr_prefix_length(argv+5,
+ &(loaderData->ipv6),
+ &(loaderData->ipv6prefix))) {
+ loaderData->ipv6info_set = 1;
+ flags |= LOADER_FLAGS_IPV6_PARAM;
+ } else {
+ logMessage(WARNING, "parseCmdLineIpv6 could not parse %s", argv);
+ }
}
#endif
diff --git a/loader/net.c b/loader/net.c
index 92bfe27..fc4e271 100644
--- a/loader/net.c
+++ b/loader/net.c
@@ -243,6 +243,22 @@ static void parseEthtoolSettings(struct loaderData_s * loaderData) {
free(buf);
}
+int split_ipv6addr_prefix_length(char *str, char **address, char **prefix) {
+ gchar **elements = g_strsplit(str, "/", 2);
+ int rc = 0;
+
+ if (elements[0]) {
+ *address = strdup(elements[0]);
+ if (elements[1]) {
+ *prefix = strdup(elements[1]);
+ }
+ rc = 1;
+ }
+ g_strfreev(elements);
+ return rc;
+}
+
+
/* given loader data from kickstart, populate network configuration struct */
void setupIfaceStruct(iface_t * iface, struct loaderData_s * loaderData) {
struct in_addr addr;
diff --git a/loader/net.h b/loader/net.h
index a737e0c..e23582a 100644
--- a/loader/net.h
+++ b/loader/net.h
@@ -83,5 +83,6 @@ void splitHostname (char *str, char **host, char **port);
int wait_for_iface_activation(char * ifname);
int wait_for_iface_disconnection(char *ifname);
int isURLRemote(char *url);
+int split_ipv6addr_prefix_length(char *str, char **address, char **prefix);
#endif
--
1.7.4