summaryrefslogtreecommitdiffstats
path: root/src/net/ipv6.c
diff options
context:
space:
mode:
authorMichael Brown2013-11-14 13:34:35 +0100
committerMichael Brown2013-11-14 13:35:43 +0100
commitc1570d3dfb24c08377cc6cf5a335892e39bd9bd2 (patch)
treec3f25ae6bc637d431e4e5fb76459331ee36f2c13 /src/net/ipv6.c
parent[ipv6] Use given source address only if it is not the unspecified address (diff)
downloadipxe-c1570d3dfb24c08377cc6cf5a335892e39bd9bd2.tar.gz
ipxe-c1570d3dfb24c08377cc6cf5a335892e39bd9bd2.tar.xz
ipxe-c1570d3dfb24c08377cc6cf5a335892e39bd9bd2.zip
[ipv6] Add "ipv6" setting type
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/ipv6.c')
-rw-r--r--src/net/ipv6.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/net/ipv6.c b/src/net/ipv6.c
index abe993d0..b9619a1a 100644
--- a/src/net/ipv6.c
+++ b/src/net/ipv6.c
@@ -867,6 +867,59 @@ struct sockaddr_converter ipv6_sockaddr_converter __sockaddr_converter = {
};
/**
+ * Parse IPv6 address setting value
+ *
+ * @v type Setting type
+ * @v value Formatted setting value
+ * @v buf Buffer to contain raw value
+ * @v len Length of buffer
+ * @ret len Length of raw value, or negative error
+ */
+static int parse_ipv6_setting ( struct setting_type *type __unused,
+ const char *value, void *buf, size_t len ) {
+ struct in6_addr ipv6;
+ int rc;
+
+ /* Parse IPv6 address */
+ if ( ( rc = inet6_aton ( value, &ipv6 ) ) != 0 )
+ return rc;
+
+ /* Copy to buffer */
+ if ( len > sizeof ( ipv6 ) )
+ len = sizeof ( ipv6 );
+ memcpy ( buf, &ipv6, len );
+
+ return ( sizeof ( ipv6 ) );
+}
+
+/**
+ * Format IPv6 address setting value
+ *
+ * @v type Setting type
+ * @v raw Raw setting value
+ * @v raw_len Length of raw setting value
+ * @v buf Buffer to contain formatted value
+ * @v len Length of buffer
+ * @ret len Length of formatted value, or negative error
+ */
+static int format_ipv6_setting ( struct setting_type *type __unused,
+ const void *raw, size_t raw_len, char *buf,
+ size_t len ) {
+ const struct in6_addr *ipv6 = raw;
+
+ if ( raw_len < sizeof ( *ipv6 ) )
+ return -EINVAL;
+ return snprintf ( buf, len, "%s", inet6_ntoa ( ipv6 ) );
+}
+
+/** An IPv6 address setting type */
+struct setting_type setting_type_ipv6 __setting_type = {
+ .name = "ipv6",
+ .parse = parse_ipv6_setting,
+ .format = format_ipv6_setting,
+};
+
+/**
* Perform IPv6 stateless address autoconfiguration (SLAAC)
*
* @v netdev Network device