Module Name:    src
Committed By:   rtr
Date:           Mon Feb 15 14:59:03 UTC 2016

Modified Files:
        src/sys/netinet: in_pcb.c tcp_input.c tcp_subr.c tcp_usrreq.c
            udp_usrreq.c
        src/sys/netinet6: in6.c in6.h

Log Message:
Reduce code duplication.

Split creation of IPv4-Mapped IPv6 addresses into its own function
and use it.

No functional change intended.  As posted to tech-net@


To generate a diff of this commit:
cvs rdiff -u -r1.162 -r1.163 src/sys/netinet/in_pcb.c
cvs rdiff -u -r1.344 -r1.345 src/sys/netinet/tcp_input.c
cvs rdiff -u -r1.264 -r1.265 src/sys/netinet/tcp_subr.c
cvs rdiff -u -r1.210 -r1.211 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.223 -r1.224 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.194 -r1.195 src/sys/netinet6/in6.c
cvs rdiff -u -r1.86 -r1.87 src/sys/netinet6/in6.h

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

Modified files:

Index: src/sys/netinet/in_pcb.c
diff -u src/sys/netinet/in_pcb.c:1.162 src/sys/netinet/in_pcb.c:1.163
--- src/sys/netinet/in_pcb.c:1.162	Mon Aug 24 22:21:26 2015
+++ src/sys/netinet/in_pcb.c	Mon Feb 15 14:59:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb.c,v 1.162 2015/08/24 22:21:26 pooka Exp $	*/
+/*	$NetBSD: in_pcb.c,v 1.163 2016/02/15 14:59:03 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.162 2015/08/24 22:21:26 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.163 2016/02/15 14:59:03 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -347,10 +347,7 @@ in_pcbbind_port(struct inpcb *inp, struc
 			return (EACCES);
 
 #ifdef INET6
-		memset(&mapped, 0, sizeof(mapped));
-		mapped.s6_addr16[5] = 0xffff;
-		memcpy(&mapped.s6_addr32[3], &sin->sin_addr,
-		    sizeof(mapped.s6_addr32[3]));
+		in6_in_2_v4mapin6(&sin->sin_addr, &mapped);
 		t6 = in6_pcblookup_port(table, &mapped, sin->sin_port, wild, &vestige);
 		if (t6 && (reuseport & t6->in6p_socket->so_options) == 0)
 			return (EADDRINUSE);

Index: src/sys/netinet/tcp_input.c
diff -u src/sys/netinet/tcp_input.c:1.344 src/sys/netinet/tcp_input.c:1.345
--- src/sys/netinet/tcp_input.c:1.344	Mon Aug 24 22:21:26 2015
+++ src/sys/netinet/tcp_input.c	Mon Feb 15 14:59:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_input.c,v 1.344 2015/08/24 22:21:26 pooka Exp $	*/
+/*	$NetBSD: tcp_input.c,v 1.345 2016/02/15 14:59:03 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.344 2015/08/24 22:21:26 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.345 2016/02/15 14:59:03 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1424,12 +1424,8 @@ findpcb:
 			struct in6_addr s, d;
 
 			/* mapped addr case */
-			memset(&s, 0, sizeof(s));
-			s.s6_addr16[5] = htons(0xffff);
-			bcopy(&ip->ip_src, &s.s6_addr32[3], sizeof(ip->ip_src));
-			memset(&d, 0, sizeof(d));
-			d.s6_addr16[5] = htons(0xffff);
-			bcopy(&ip->ip_dst, &d.s6_addr32[3], sizeof(ip->ip_dst));
+			in6_in_2_v4mapin6(&ip->ip_src, &s);
+			in6_in_2_v4mapin6(&ip->ip_dst, &d);
 			in6p = in6_pcblookup_connect(&tcbtable, &s,
 						     th->th_sport, &d, th->th_dport,
 						     0, &vestige);
@@ -4086,14 +4082,7 @@ syn_cache_get(struct sockaddr *src, stru
 		memcpy(&sin6, src, src->sa_len);
 		if (src->sa_family == AF_INET) {
 			/* IPv4 packet to AF_INET6 socket */
-			memset(&sin6, 0, sizeof(sin6));
-			sin6.sin6_family = AF_INET6;
-			sin6.sin6_len = sizeof(sin6);
-			sin6.sin6_port = ((struct sockaddr_in *)src)->sin_port;
-			sin6.sin6_addr.s6_addr16[5] = htons(0xffff);
-			bcopy(&((struct sockaddr_in *)src)->sin_addr,
-				&sin6.sin6_addr.s6_addr32[3],
-				sizeof(sin6.sin6_addr.s6_addr32[3]));
+			in6_sin_2_v4mapsin6((struct sockaddr_in *)src, &sin6);
 		}
 		if (in6_pcbconnect(in6p, &sin6, NULL)) {
 			goto resetandabort;

Index: src/sys/netinet/tcp_subr.c
diff -u src/sys/netinet/tcp_subr.c:1.264 src/sys/netinet/tcp_subr.c:1.265
--- src/sys/netinet/tcp_subr.c:1.264	Mon Sep  7 01:56:50 2015
+++ src/sys/netinet/tcp_subr.c	Mon Feb 15 14:59:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_subr.c,v 1.264 2015/09/07 01:56:50 ozaki-r Exp $	*/
+/*	$NetBSD: tcp_subr.c,v 1.265 2016/02/15 14:59:03 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_subr.c,v 1.264 2015/09/07 01:56:50 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_subr.c,v 1.265 2016/02/15 14:59:03 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1603,11 +1603,8 @@ tcp_ctlinput(int cmd, const struct socka
 		 */
 		th = (struct tcphdr *)((char *)ip + (ip->ip_hl << 2));
 #ifdef INET6
-		memset(&src6, 0, sizeof(src6));
-		memset(&dst6, 0, sizeof(dst6));
-		src6.s6_addr16[5] = dst6.s6_addr16[5] = 0xffff;
-		memcpy(&src6.s6_addr32[3], &ip->ip_src, sizeof(struct in_addr));
-		memcpy(&dst6.s6_addr32[3], &ip->ip_dst, sizeof(struct in_addr));
+		in6_in_2_v4mapin6(&ip->ip_src, &src6);
+		in6_in_2_v4mapin6(&ip->ip_dst, &dst6);
 #endif
 		if ((inp = in_pcblookup_connect(&tcbtable, ip->ip_dst,
 						th->th_dport, ip->ip_src, th->th_sport, 0)) != NULL)
@@ -1752,9 +1749,7 @@ tcp_mtudisc_callback(struct in_addr fadd
 
 	in_pcbnotifyall(&tcbtable, faddr, EMSGSIZE, tcp_mtudisc);
 #ifdef INET6
-	memset(&in6, 0, sizeof(in6));
-	in6.s6_addr16[5] = 0xffff;
-	memcpy(&in6.s6_addr32[3], &faddr, sizeof(struct in_addr));
+	in6_in_2_v4mapin6(&faddr, &in6);
 	tcp6_mtudisc_callback(&in6);
 #endif
 }

Index: src/sys/netinet/tcp_usrreq.c
diff -u src/sys/netinet/tcp_usrreq.c:1.210 src/sys/netinet/tcp_usrreq.c:1.211
--- src/sys/netinet/tcp_usrreq.c:1.210	Sun Feb 14 23:47:57 2016
+++ src/sys/netinet/tcp_usrreq.c	Mon Feb 15 14:59:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_usrreq.c,v 1.210 2016/02/14 23:47:57 rtr Exp $	*/
+/*	$NetBSD: tcp_usrreq.c,v 1.211 2016/02/15 14:59:03 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -99,7 +99,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.210 2016/02/14 23:47:57 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.211 2016/02/15 14:59:03 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -136,6 +136,9 @@ __KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c
 #include <netinet/in_offload.h>
 
 #ifdef INET6
+#ifndef INET
+#include <netinet/in.h>
+#endif
 #include <netinet/ip6.h>
 #include <netinet6/in6_pcb.h>
 #include <netinet6/ip6_var.h>

Index: src/sys/netinet/udp_usrreq.c
diff -u src/sys/netinet/udp_usrreq.c:1.223 src/sys/netinet/udp_usrreq.c:1.224
--- src/sys/netinet/udp_usrreq.c:1.223	Wed Jan 20 22:01:18 2016
+++ src/sys/netinet/udp_usrreq.c	Mon Feb 15 14:59:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp_usrreq.c,v 1.223 2016/01/20 22:01:18 riastradh Exp $	*/
+/*	$NetBSD: udp_usrreq.c,v 1.224 2016/02/15 14:59:03 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.223 2016/01/20 22:01:18 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.224 2016/02/15 14:59:03 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -405,16 +405,12 @@ udp_input(struct mbuf *m, ...)
 		memset(&src6, 0, sizeof(src6));
 		src6.sin6_family = AF_INET6;
 		src6.sin6_len = sizeof(struct sockaddr_in6);
-		src6.sin6_addr.s6_addr[10] = src6.sin6_addr.s6_addr[11] = 0xff;
-		memcpy(&src6.sin6_addr.s6_addr[12], &ip->ip_src,
-			sizeof(ip->ip_src));
+		in6_in_2_v4mapin6(&ip->ip_src, &src6.sin6_addr);
 		src6.sin6_port = uh->uh_sport;
 		memset(&dst6, 0, sizeof(dst6));
 		dst6.sin6_family = AF_INET6;
 		dst6.sin6_len = sizeof(struct sockaddr_in6);
-		dst6.sin6_addr.s6_addr[10] = dst6.sin6_addr.s6_addr[11] = 0xff;
-		memcpy(&dst6.sin6_addr.s6_addr[12], &ip->ip_dst,
-			sizeof(ip->ip_dst));
+		in6_in_2_v4mapin6(&ip->ip_dst, &dst6.sin6_addr);
 		dst6.sin6_port = uh->uh_dport;
 
 		n += udp6_realinput(AF_INET, &src6, &dst6, m, iphlen);

Index: src/sys/netinet6/in6.c
diff -u src/sys/netinet6/in6.c:1.194 src/sys/netinet6/in6.c:1.195
--- src/sys/netinet6/in6.c:1.194	Sat Dec 12 23:34:25 2015
+++ src/sys/netinet6/in6.c	Mon Feb 15 14:59:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6.c,v 1.194 2015/12/12 23:34:25 christos Exp $	*/
+/*	$NetBSD: in6.c,v 1.195 2016/02/15 14:59:03 rtr 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.194 2015/12/12 23:34:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.195 2016/02/15 14:59:03 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -2553,6 +2553,19 @@ in6_domifdetach(struct ifnet *ifp, void 
 }
 
 /*
+ * Convert IPv4 address stored in struct in_addr to IPv4-Mapped IPv6 address
+ * stored in struct in6_addr as defined in RFC 4921 section 2.5.5.2.
+ */
+void
+in6_in_2_v4mapin6(const struct in_addr *in, struct in6_addr *in6)
+{
+	in6->s6_addr32[0] = 0;
+	in6->s6_addr32[1] = 0;
+	in6->s6_addr32[2] = IPV6_ADDR_INT32_SMP;
+	in6->s6_addr32[3] = in->s_addr;
+}
+
+/*
  * Convert sockaddr_in6 to sockaddr_in.  Original sockaddr_in6 must be
  * v4 mapped addr or v4 compat addr
  */
@@ -2574,10 +2587,7 @@ in6_sin_2_v4mapsin6(const struct sockadd
 	sin6->sin6_len = sizeof(struct sockaddr_in6);
 	sin6->sin6_family = AF_INET6;
 	sin6->sin6_port = sin->sin_port;
-	sin6->sin6_addr.s6_addr32[0] = 0;
-	sin6->sin6_addr.s6_addr32[1] = 0;
-	sin6->sin6_addr.s6_addr32[2] = IPV6_ADDR_INT32_SMP;
-	sin6->sin6_addr.s6_addr32[3] = sin->sin_addr.s_addr;
+	in6_in_2_v4mapin6(&sin->sin_addr, &sin6->sin6_addr);
 }
 
 /* Convert sockaddr_in6 into sockaddr_in. */

Index: src/sys/netinet6/in6.h
diff -u src/sys/netinet6/in6.h:1.86 src/sys/netinet6/in6.h:1.87
--- src/sys/netinet6/in6.h:1.86	Sat Dec 12 23:34:25 2015
+++ src/sys/netinet6/in6.h	Mon Feb 15 14:59:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6.h,v 1.86 2015/12/12 23:34:25 christos Exp $	*/
+/*	$NetBSD: in6.h,v 1.87 2016/02/15 14:59:03 rtr Exp $	*/
 /*	$KAME: in6.h,v 1.83 2001/03/29 02:55:07 jinmei Exp $	*/
 
 /*
@@ -768,6 +768,7 @@ typedef	_BSD_SIZE_T_		size_t;
 __BEGIN_DECLS
 struct cmsghdr;
 
+void	in6_in_2_v4mapin6(const struct in_addr *, struct in6_addr *);
 void	in6_sin6_2_sin(struct sockaddr_in *, struct sockaddr_in6 *);
 void	in6_sin_2_v4mapsin6(const struct sockaddr_in *, struct sockaddr_in6 *);
 void	in6_sin6_2_sin_in_sock(struct sockaddr *);

Reply via email to