From owner-svn-src-user@FreeBSD.ORG Fri Oct 25 02:40:56 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id C71D17A6; Fri, 25 Oct 2013 02:40:56 +0000 (UTC) (envelope-from ae@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B582522A7; Fri, 25 Oct 2013 02:40:56 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r9P2euk8051562; Fri, 25 Oct 2013 02:40:56 GMT (envelope-from ae@svn.freebsd.org) Received: (from ae@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r9P2eu8D051560; Fri, 25 Oct 2013 02:40:56 GMT (envelope-from ae@svn.freebsd.org) Message-Id: <201310250240.r9P2eu8D051560@svn.freebsd.org> From: "Andrey V. Elsukov" Date: Fri, 25 Oct 2013 02:40:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r257090 - user/ae/inet6/sys/netinet X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 25 Oct 2013 02:40:56 -0000 Author: ae Date: Fri Oct 25 02:40:56 2013 New Revision: 257090 URL: http://svnweb.freebsd.org/changeset/base/257090 Log: Refactor tcp6_getcred(): * remove sa6_embedscope() calls, use sa6_checkzone() instead; * determine interface by zone id and pass it to in6_pcblookup. Modified: user/ae/inet6/sys/netinet/tcp_subr.c Modified: user/ae/inet6/sys/netinet/tcp_subr.c ============================================================================== --- user/ae/inet6/sys/netinet/tcp_subr.c Fri Oct 25 02:21:00 2013 (r257089) +++ user/ae/inet6/sys/netinet/tcp_subr.c Fri Oct 25 02:40:56 2013 (r257090) @@ -1329,7 +1329,9 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS) { struct xucred xuc; struct sockaddr_in6 addrs[2]; + struct ifnet *ifp; struct inpcb *inp; + uint32_t zoneid; int error; #ifdef INET int mapped = 0; @@ -1341,9 +1343,25 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS) error = SYSCTL_IN(req, addrs, sizeof(addrs)); if (error) return (error); - if ((error = sa6_embedscope(&addrs[0], V_ip6_use_defzone)) != 0 || - (error = sa6_embedscope(&addrs[1], V_ip6_use_defzone)) != 0) { + error = sa6_checkzone(&addrs[0]); + if (error) + return (error); + error = sa6_checkzone(&addrs[1]); + if (error) return (error); + ifp = NULL; + zoneid = 0; + if (addrs[0].sin6_scope_id != 0) + zoneid = addrs[0].sin6_scope_id; + if (addrs[1].sin6_scope_id != 0) { + if (zoneid != 0 && zoneid != addrs[1].sin6_scope_id) + return (EINVAL); + zoneid = addrs[1].sin6_scope_id; + } + if (zoneid != 0) { + ifp = in6_getlinkifnet(zoneid); + if (ifp == NULL) + return (ENOENT); } if (IN6_IS_ADDR_V4MAPPED(&addrs[0].sin6_addr)) { #ifdef INET @@ -1366,7 +1384,7 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS) inp = in6_pcblookup(&V_tcbinfo, &addrs[1].sin6_addr, addrs[1].sin6_port, &addrs[0].sin6_addr, addrs[0].sin6_port, - INPLOOKUP_RLOCKPCB, NULL); + INPLOOKUP_RLOCKPCB, ifp); if (inp != NULL) { if (inp->inp_socket == NULL) error = ENOENT;