Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/netinet6 add routines to print in6_addr and sockaddr_in6...



details:   https://anonhg.NetBSD.org/src/rev/a280517e46ec
branches:  trunk
changeset: 334702:a280517e46ec
user:      christos <christos%NetBSD.org@localhost>
date:      Tue Dec 02 19:36:58 2014 +0000

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

diffstat:

 sys/netinet6/files.netinet6 |    3 +-
 sys/netinet6/in6.c          |   66 ++-------------------
 sys/netinet6/in6.h          |    7 ++-
 sys/netinet6/in6_print.c    |  132 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 147 insertions(+), 61 deletions(-)

diffs (263 lines):

diff -r fbe5b4814b52 -r a280517e46ec sys/netinet6/files.netinet6
--- a/sys/netinet6/files.netinet6       Tue Dec 02 19:35:27 2014 +0000
+++ b/sys/netinet6/files.netinet6       Tue Dec 02 19:36:58 2014 +0000
@@ -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_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
diff -r fbe5b4814b52 -r a280517e46ec sys/netinet6/in6.c
--- a/sys/netinet6/in6.c        Tue Dec 02 19:35:27 2014 +0000
+++ b/sys/netinet6/in6.c        Tue Dec 02 19:36:58 2014 +0000
@@ -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 @@
 /*
  * 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;
-       }
+       static int ip6round = 0;
+       static char ip6buf[8][INET6_ADDRSTRLEN];
+       char *cp = ip6buf[ip6round++ & 7];
 
-       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];
+       in6_print(cp, INET6_ADDRSTRLEN, addr);
+       return cp;
 }
 
 /*
diff -r fbe5b4814b52 -r a280517e46ec sys/netinet6/in6.h
--- a/sys/netinet6/in6.h        Tue Dec 02 19:35:27 2014 +0000
+++ b/sys/netinet6/in6.h        Tue Dec 02 19:36:58 2014 +0000
@@ -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 @@
 __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_ */
diff -r fbe5b4814b52 -r a280517e46ec sys/netinet6/in6_print.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/netinet6/in6_print.c  Tue Dec 02 19:36:58 2014 +0000
@@ -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));
+}



Home | Main Index | Thread Index | Old Index