svn commit: r256520 - in user/ae/inet6/sys: netinet netinet6

Andrey V. Elsukov ae at FreeBSD.org
Tue Oct 15 10:37:51 UTC 2013


Author: ae
Date: Tue Oct 15 10:37:50 2013
New Revision: 256520
URL: http://svnweb.freebsd.org/changeset/base/256520

Log:
  Add zoneid argument to the in6_sockaddr() function.

Modified:
  user/ae/inet6/sys/netinet/tcp_usrreq.c
  user/ae/inet6/sys/netinet6/in6_pcb.c
  user/ae/inet6/sys/netinet6/in6_pcb.h

Modified: user/ae/inet6/sys/netinet/tcp_usrreq.c
==============================================================================
--- user/ae/inet6/sys/netinet/tcp_usrreq.c	Tue Oct 15 10:31:42 2013	(r256519)
+++ user/ae/inet6/sys/netinet/tcp_usrreq.c	Tue Oct 15 10:37:50 2013	(r256520)
@@ -663,12 +663,13 @@ out:
 static int
 tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
 {
+	struct in6_addr addr6;
+	struct in_addr addr;
 	struct inpcb *inp = NULL;
-	int error = 0;
 	struct tcpcb *tp = NULL;
-	struct in_addr addr;
-	struct in6_addr addr6;
+	uint32_t zoneid = 0;
 	in_port_t port = 0;
+	int error = 0;
 	int v4 = 0;
 	TCPDEBUG0;
 
@@ -698,6 +699,7 @@ tcp6_usr_accept(struct socket *so, struc
 	} else {
 		port = inp->inp_fport;
 		addr6 = inp->in6p_faddr;
+		zoneid = inp->in6p_zoneid;
 	}
 
 out:
@@ -708,9 +710,9 @@ out:
 		if (v4)
 			*nam = in6_v4mapsin6_sockaddr(port, &addr);
 		else
-			*nam = in6_sockaddr(port, &addr6);
+			*nam = in6_sockaddr(port, &addr6, zoneid);
 	}
-	return error;
+	return (error);
 }
 #endif /* INET6 */
 

Modified: user/ae/inet6/sys/netinet6/in6_pcb.c
==============================================================================
--- user/ae/inet6/sys/netinet6/in6_pcb.c	Tue Oct 15 10:31:42 2013	(r256519)
+++ user/ae/inet6/sys/netinet6/in6_pcb.c	Tue Oct 15 10:37:50 2013	(r256520)
@@ -445,19 +445,19 @@ in6_pcbdisconnect(struct inpcb *inp)
 }
 
 struct sockaddr *
-in6_sockaddr(in_port_t port, struct in6_addr *addr_p)
+in6_sockaddr(in_port_t port, const struct in6_addr *addr_p, uint32_t zoneid)
 {
 	struct sockaddr_in6 *sin6;
 
-	sin6 = malloc(sizeof *sin6, M_SONAME, M_WAITOK);
-	bzero(sin6, sizeof *sin6);
+	sin6 = malloc(sizeof *sin6, M_SONAME, M_WAITOK | M_ZERO);
 	sin6->sin6_family = AF_INET6;
 	sin6->sin6_len = sizeof(*sin6);
 	sin6->sin6_port = port;
 	sin6->sin6_addr = *addr_p;
-	(void)sa6_recoverscope(sin6); /* XXX: should catch errors */
-
-	return (struct sockaddr *)sin6;
+	if (IN6_IS_ADDR_LINKLOCAL(addr_p) ||
+	    IN6_IS_ADDR_MULTICAST(addr_p))
+		sin6->sin6_scope_id = zoneid;
+	return ((struct sockaddr *)sin6);
 }
 
 struct sockaddr *
@@ -482,8 +482,9 @@ in6_v4mapsin6_sockaddr(in_port_t port, s
 int
 in6_getsockaddr(struct socket *so, struct sockaddr **nam)
 {
-	register struct inpcb *inp;
 	struct in6_addr addr;
+	struct inpcb *inp;
+	uint32_t zoneid;
 	in_port_t port;
 
 	inp = sotoinpcb(so);
@@ -492,17 +493,19 @@ in6_getsockaddr(struct socket *so, struc
 	INP_RLOCK(inp);
 	port = inp->inp_lport;
 	addr = inp->in6p_laddr;
+	zoneid = inp->in6p_zoneid;
 	INP_RUNLOCK(inp);
 
-	*nam = in6_sockaddr(port, &addr);
-	return 0;
+	*nam = in6_sockaddr(port, &addr, zoneid);
+	return (0);
 }
 
 int
 in6_getpeeraddr(struct socket *so, struct sockaddr **nam)
 {
-	struct inpcb *inp;
 	struct in6_addr addr;
+	struct inpcb *inp;
+	uint32_t zoneid;
 	in_port_t port;
 
 	inp = sotoinpcb(so);
@@ -511,10 +514,11 @@ in6_getpeeraddr(struct socket *so, struc
 	INP_RLOCK(inp);
 	port = inp->inp_fport;
 	addr = inp->in6p_faddr;
+	zoneid = inp->in6p_zoneid;
 	INP_RUNLOCK(inp);
 
-	*nam = in6_sockaddr(port, &addr);
-	return 0;
+	*nam = in6_sockaddr(port, &addr, zoneid);
+	return (0);
 }
 
 int

Modified: user/ae/inet6/sys/netinet6/in6_pcb.h
==============================================================================
--- user/ae/inet6/sys/netinet6/in6_pcb.h	Tue Oct 15 10:31:42 2013	(r256519)
+++ user/ae/inet6/sys/netinet6/in6_pcb.h	Tue Oct 15 10:37:50 2013	(r256520)
@@ -104,7 +104,7 @@ void	in6_pcbnotify(struct inpcbinfo *, s
 struct inpcb *
 	in6_rtchange(struct inpcb *, int);
 struct sockaddr *
-	in6_sockaddr(in_port_t port, struct in6_addr *addr_p);
+	in6_sockaddr(in_port_t, const struct in6_addr *, uint32_t);
 struct sockaddr *
 	in6_v4mapsin6_sockaddr(in_port_t port, struct in_addr *addr_p);
 int	in6_getpeeraddr(struct socket *so, struct sockaddr **nam);


More information about the svn-src-user mailing list