From 9835576bc1c1f2d8af0d65aa52ec47f61c1e01e6 Mon Sep 17 00:00:00 2001 From: Jiri Benc Date: Thu, 22 Oct 2015 15:28:54 -0200 Subject: [PATCH] lib: add ipv6 helper functions for tnl_config These functions will be used by the next patches. Signed-off-by: Jiri Benc Signed-off-by: Thadeu Lima de Souza Cascardo Signed-off-by: Ben Pfaff --- AUTHORS | 1 + lib/smap.c | 11 +++++++++++ lib/smap.h | 1 + lib/socket-util.c | 9 +++++++++ lib/socket-util.h | 1 + 5 files changed, 23 insertions(+) diff --git a/AUTHORS b/AUTHORS index df185f2a9..c10b19f70 100644 --- a/AUTHORS +++ b/AUTHORS @@ -92,6 +92,7 @@ Jeremy Stribling strib@nicira.com Jeroen van Bemmel jvb127@gmail.com Jesse Gross jesse@nicira.com Jing Ai jinga@google.com +Jiri Benc jbenc@redhat.com Joe Perches joe@perches.com Joe Stringer joestringer@nicira.com Jonathan Vestin jonavest@kau.se diff --git a/lib/smap.c b/lib/smap.c index 1d59f568f..2c410135e 100644 --- a/lib/smap.c +++ b/lib/smap.c @@ -95,6 +95,17 @@ smap_add_format(struct smap *smap, const char *key, const char *format, ...) hash_bytes(key, key_len, 0)); } +/* Adds 'key' paired with a string representation of 'addr'. It is the + * caller's responsibility to avoid duplicate keys if desirable. */ +void +smap_add_ipv6(struct smap *smap, const char *key, struct in6_addr *addr) +{ + char buf[INET6_ADDRSTRLEN]; + + inet_ntop(AF_INET6, addr, buf, sizeof buf); + smap_add(smap, key, buf); +} + /* Searches for 'key' in 'smap'. If it does not already exists, adds it. * Otherwise, changes its value to 'value'. */ void diff --git a/lib/smap.h b/lib/smap.h index 3bfbb713d..489497a0f 100644 --- a/lib/smap.h +++ b/lib/smap.h @@ -66,6 +66,7 @@ struct smap_node *smap_add_nocopy(struct smap *, char *, char *); bool smap_add_once(struct smap *, const char *, const char *); void smap_add_format(struct smap *, const char *key, const char *, ...) OVS_PRINTF_FORMAT(3, 4); +void smap_add_ipv6(struct smap *, const char *, struct in6_addr *); void smap_replace(struct smap *, const char *, const char *); void smap_remove(struct smap *, const char *); diff --git a/lib/socket-util.c b/lib/socket-util.c index 206e17bd2..d053d37a9 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -136,6 +136,15 @@ set_dscp(int fd, int family, uint8_t dscp) return retval ? sock_errno() : 0; } +/* Checks whether 'host_name' is an IPv4 or IPv6 address. It is assumed + * that 'host_name' is valid. Returns false if it is IPv4 address, true if + * it is IPv6 address. */ +bool +addr_is_ipv6(const char *host_name) +{ + return strchr(host_name, ':') != NULL; +} + /* Translates 'host_name', which must be a string representation of an IP * address, into a numeric IP address in '*addr'. Returns 0 if successful, * otherwise a positive errno value. */ diff --git a/lib/socket-util.h b/lib/socket-util.h index 8015c7f30..c3c122415 100644 --- a/lib/socket-util.h +++ b/lib/socket-util.h @@ -32,6 +32,7 @@ void xset_nonblocking(int fd); void setsockopt_tcp_nodelay(int fd); int set_dscp(int fd, int family, uint8_t dscp); +bool addr_is_ipv6(const char *host_name); int lookup_ip(const char *host_name, struct in_addr *address); int lookup_ipv6(const char *host_name, struct in6_addr *address); -- 2.20.1