changeset 4684:4f1df4b90500 HEAD

Added net_ipv6_mapped_ipv4_convert().
author Timo Sirainen <tss@iki.fi>
date Sun, 15 Oct 2006 19:19:17 +0300
parents b60a8aec99ed
children dc5875c28aac
files src/lib/network.c src/lib/network.h
diffstat 2 files changed, 23 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/network.c	Sun Oct 15 18:55:00 2006 +0300
+++ b/src/lib/network.c	Sun Oct 15 19:19:17 2006 +0300
@@ -570,6 +570,25 @@
 	return 0;
 }
 
+int net_ipv6_mapped_ipv4_convert(const struct ip_addr *src,
+				 struct ip_addr *dest)
+{
+#ifdef HAVE_IPV6
+	if (!IPADDR_IS_V6(src))
+		return -1;
+	if (src->ip.in6_u.u6_addr32[0] != 0 ||
+	    src->ip.in6_u.u6_addr32[1] != 0 ||
+	    src->ip.in6_u.u6_addr32[2] != 0xffff0000)
+		return -1;
+
+	dest->family = AF_INET;
+	memcpy(&dest->ip, &src->ip.in6_u.u6_addr32[3], 4);
+	return 0;
+#else
+	return -1;
+#endif
+}
+
 /* Get socket error */
 int net_geterror(int fd)
 {
--- a/src/lib/network.h	Sun Oct 15 18:55:00 2006 +0300
+++ b/src/lib/network.h	Sun Oct 15 19:19:17 2006 +0300
@@ -93,6 +93,10 @@
 const char *net_ip2addr(const struct ip_addr *ip);
 /* char* -> struct ip_addr translation. */
 int net_addr2ip(const char *addr, struct ip_addr *ip);
+/* Convert IPv6 mapped IPv4 address to an actual IPv4 address. Returns 0 if
+   successful, -1 if the source address isn't IPv6 mapped IPv4 address. */
+int net_ipv6_mapped_ipv4_convert(const struct ip_addr *src,
+				 struct ip_addr *dest);
 
 /* Get socket error */
 int net_geterror(int fd);