Module Name:    src
Committed By:   christos
Date:           Tue Dec  2 19:36:58 UTC 2014

Modified Files:
        src/sys/netinet6: files.netinet6 in6.c in6.h
Added Files:
        src/sys/netinet6: in6_print.c

Log Message:
add routines to print in6_addr and sockaddr_in6 (in6_print, sin6_print)


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/netinet6/files.netinet6
cvs rdiff -u -r1.179 -r1.180 src/sys/netinet6/in6.c
cvs rdiff -u -r1.79 -r1.80 src/sys/netinet6/in6.h
cvs rdiff -u -r0 -r1.1 src/sys/netinet6/in6_print.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet6/files.netinet6
diff -u src/sys/netinet6/files.netinet6:1.8 src/sys/netinet6/files.netinet6:1.9
--- src/sys/netinet6/files.netinet6:1.8	Fri Jan 25 16:12:15 2008
+++ src/sys/netinet6/files.netinet6	Tue Dec  2 14:36:58 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files.netinet6,v 1.8 2008/01/25 21:12:15 joerg Exp $
+#	$NetBSD: files.netinet6,v 1.9 2014/12/02 19:36:58 christos Exp $
 
 defflag	opt_inet6.h	RFC2292	
 
@@ -12,6 +12,7 @@ file	netinet6/in6_cksum.c		inet6
 file	netinet6/in6_ifattach.c		inet6
 file	netinet6/in6_offload.c		inet6
 file	netinet6/in6_pcb.c		inet6
+file	netinet6/in6_print.c
 file	netinet6/in6_proto.c		inet6
 file	netinet6/in6_src.c		inet6
 file	netinet6/ip6_flow.c		inet6

Index: src/sys/netinet6/in6.c
diff -u src/sys/netinet6/in6.c:1.179 src/sys/netinet6/in6.c:1.180
--- src/sys/netinet6/in6.c:1.179	Mon Nov  3 08:04:12 2014
+++ src/sys/netinet6/in6.c	Tue Dec  2 14:36:58 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6.c,v 1.179 2014/11/03 13:04:12 roy Exp $	*/
+/*	$NetBSD: in6.c,v 1.180 2014/12/02 19:36:58 christos Exp $	*/
 /*	$KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.179 2014/11/03 13:04:12 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.180 2014/12/02 19:36:58 christos Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -1873,67 +1873,15 @@ bestia(struct in6_ifaddr *best_ia, struc
 /*
  * Convert IP6 address to printable (loggable) representation.
  */
-static int ip6round = 0;
 char *
 ip6_sprintf(const struct in6_addr *addr)
 {
-	static char ip6buf[8][48];
-	int i;
-	char *bp;
-	char *cp;
-	const u_int16_t *a = (const u_int16_t *)addr;
-	const u_int8_t *d;
-	int dcolon = 0;
-
-	ip6round = (ip6round + 1) & 7;
-	cp = ip6buf[ip6round];
-
-	if (IN6_IS_ADDR_V4MAPPED(addr)) {
-		struct in_addr ia = { .s_addr = addr->s6_addr32[3] };
-		snprintf(cp, 48, "::ffff:%s", inet_ntoa(ia));
-		return cp;
-	}
-
-	for (i = 0; i < 8; i++) {
-		if (dcolon == 1) {
-			if (*a == 0) {
-				if (i == 7)
-					*cp++ = ':';
-				a++;
-				continue;
-			} else
-				dcolon = 2;
-		}
-		if (*a == 0) {
-			if (dcolon == 0 && *(a + 1) == 0) {
-				if (i == 0)
-					*cp++ = ':';
-				*cp++ = ':';
-				dcolon = 1;
-			} else {
-				*cp++ = '0';
-				*cp++ = ':';
-			}
-			a++;
-			continue;
-		}
-		d = (const u_char *)a;
-		bp = cp;
-		*cp = hexdigits[*d >> 4];
-		if (*cp != '0')
-			cp++;
-		*cp = hexdigits[*d++ & 0xf];
-		if (cp != bp || *cp != '0')
-			cp++;
-		*cp = hexdigits[*d >> 4];
-		if (cp != bp || *cp != '0')
-			cp++;
-		*cp++ = hexdigits[*d & 0xf];
-		*cp++ = ':';
-		a++;
-	}
-	*--cp = 0;
-	return ip6buf[ip6round];
+	static int ip6round = 0;
+	static char ip6buf[8][INET6_ADDRSTRLEN];
+	char *cp = ip6buf[ip6round++ & 7];
+
+	in6_print(cp, INET6_ADDRSTRLEN, addr);
+	return cp;
 }
 
 /*

Index: src/sys/netinet6/in6.h
diff -u src/sys/netinet6/in6.h:1.79 src/sys/netinet6/in6.h:1.80
--- src/sys/netinet6/in6.h:1.79	Sun Oct 12 15:02:18 2014
+++ src/sys/netinet6/in6.h	Tue Dec  2 14:36:58 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6.h,v 1.79 2014/10/12 19:02:18 christos Exp $	*/
+/*	$NetBSD: in6.h,v 1.80 2014/12/02 19:36:58 christos Exp $	*/
 /*	$KAME: in6.h,v 1.83 2001/03/29 02:55:07 jinmei Exp $	*/
 
 /*
@@ -818,4 +818,9 @@ extern struct in6_addr *inet6_rth_getadd
 __END_DECLS
 #endif /* _NETBSD_SOURCE */
 
+#if defined(_KERNEL) || defined(_TEST)
+int	in6_print(char *, size_t, const struct in6_addr *);
+int	sin6_print(char *, size_t, const void *);
+#endif
+
 #endif /* !_NETINET6_IN6_H_ */

Added files:

Index: src/sys/netinet6/in6_print.c
diff -u /dev/null src/sys/netinet6/in6_print.c:1.1
--- /dev/null	Tue Dec  2 14:36:58 2014
+++ src/sys/netinet6/in6_print.c	Tue Dec  2 14:36:58 2014
@@ -0,0 +1,132 @@
+/*	$NetBSD: in6_print.c,v 1.1 2014/12/02 19:36:58 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+
+#include <sys/types.h>
+#ifdef _KERNEL
+__KERNEL_RCSID(0, "$NetBSD: in6_print.c,v 1.1 2014/12/02 19:36:58 christos Exp $");
+#include <sys/systm.h>
+#else
+__RCSID("$NetBSD: in6_print.c,v 1.1 2014/12/02 19:36:58 christos Exp $");
+#include <stdio.h>
+#define s6_addr32 __u6_addr.__u6_addr32
+static const uint8_t hexdigits[] = "0123456789abcdef";
+#endif
+
+#include <netinet/in.h>
+
+int
+in6_print(char *buf, size_t len, const struct in6_addr *ia6)
+{
+	int i;
+	char *bp;
+	char *cp, *ecp;
+	const uint16_t *a;
+	const uint8_t *d;
+	int dcolon = 0;
+
+	if (IN6_IS_ADDR_V4MAPPED(ia6)) {
+		char buf4[INET_ADDRSTRLEN];
+		struct in_addr ia = { .s_addr = ia6->s6_addr32[3] };
+		in_print(buf4, sizeof(buf4), &ia);
+		return snprintf(buf, len, "::ffff:%s", buf4);
+	}
+
+#define ADDC(c) do { \
+		if (cp >= ecp) {\
+			cp++; \
+		} else \
+			*cp++ = (char)(c); \
+	} while (/*CONSTCOND*/0)
+#define ADDX(v) do { \
+		uint8_t n = hexdigits[(v)]; \
+		ADDC(n); \
+		if (cp == bp && n == '0') \
+			cp--; \
+	} while (/*CONSTCOND*/0)
+
+	cp = buf;
+	ecp = buf + len;
+	a = (const uint16_t *)ia6;
+	for (i = 0; i < 8; i++) {
+		if (dcolon == 1) {
+			if (*a == 0) {
+				if (i == 7)
+					ADDC(':');
+				a++;
+				continue;
+			} else
+				dcolon = 2;
+		}
+		if (*a == 0) {
+			if (dcolon == 0 && *(a + 1) == 0) {
+				if (i == 0)
+					ADDC(':');
+				ADDC(':');
+				dcolon = 1;
+			} else {
+				ADDC('0');
+				ADDC(':');
+			}
+			a++;
+			continue;
+		}
+		d = (const u_char *)a;
+		bp = cp + 1;
+
+		ADDX((u_int)*d >> 4);
+		ADDX(*d & 0xf);
+		d++;
+		ADDX((u_int)*d >> 4);
+		ADDX(*d & 0xf);
+		ADDC(':');
+		a++;
+	}
+	if (cp > buf)
+		--cp;
+	if (ecp > buf) {
+		if (cp < ecp)
+			*cp = '\0';
+		else
+			*--ecp = '\0';
+	}
+	return (int)(cp - buf);
+}
+
+int
+sin6_print(char *buf, size_t len, const void *v)
+{
+	const struct sockaddr_in6 *sin6 = v;
+	const struct in6_addr *ia6 = &sin6->sin6_addr;
+	char abuf[INET6_ADDRSTRLEN];
+
+	if (!sin6->sin6_port)
+		return in6_print(buf, len, ia6);
+	in6_print(abuf, sizeof(abuf), ia6);
+	return snprintf(buf, len, "[%s]:%hu", abuf, ntohs(sin6->sin6_port));
+}

Reply via email to