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