Date: Tue, 15 Oct 2013 10:37:50 +0000 (UTC) From: "Andrey V. Elsukov" <ae@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r256520 - in user/ae/inet6/sys: netinet netinet6 Message-ID: <201310151037.r9FAboTS010471@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310151037.r9FAboTS010471>