diff options
author | Michael Brown | 2013-11-14 13:34:35 +0100 |
---|---|---|
committer | Michael Brown | 2013-11-14 13:35:43 +0100 |
commit | c1570d3dfb24c08377cc6cf5a335892e39bd9bd2 (patch) | |
tree | c3f25ae6bc637d431e4e5fb76459331ee36f2c13 /src/net/ipv6.c | |
parent | [ipv6] Use given source address only if it is not the unspecified address (diff) | |
download | ipxe-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.c | 53 |
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 |