Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Oct 2013 23:56:31 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r256569 - in user/ae/inet6/sys: netinet netinet6
Message-ID:  <201310152356.r9FNuVCl004136@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Tue Oct 15 23:56:31 2013
New Revision: 256569
URL: http://svnweb.freebsd.org/changeset/base/256569

Log:
  Add scope zone id argument to in6_pcblookup_local function.

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

Modified: user/ae/inet6/sys/netinet/in_pcb.c
==============================================================================
--- user/ae/inet6/sys/netinet/in_pcb.c	Tue Oct 15 23:31:08 2013	(r256568)
+++ user/ae/inet6/sys/netinet/in_pcb.c	Tue Oct 15 23:56:31 2013	(r256569)
@@ -448,7 +448,8 @@ in_pcb_lport(struct inpcb *inp, struct i
 #ifdef INET6
 		if ((inp->inp_vflag & INP_IPV6) != 0)
 			tmpinp = in6_pcblookup_local(pcbinfo,
-			    &inp->in6p_laddr, lport, lookupflags, cred);
+			    &inp->in6p_laddr, inp->in6p_zoneid, lport,
+			    lookupflags, cred);
 #endif
 #if defined(INET) && defined(INET6)
 		else

Modified: user/ae/inet6/sys/netinet6/in6_pcb.c
==============================================================================
--- user/ae/inet6/sys/netinet6/in6_pcb.c	Tue Oct 15 23:31:08 2013	(r256568)
+++ user/ae/inet6/sys/netinet6/in6_pcb.c	Tue Oct 15 23:56:31 2013	(r256569)
@@ -193,8 +193,8 @@ in6_pcbbind(struct inpcb *inp, struct so
 			    priv_check_cred(inp->inp_cred,
 			    PRIV_NETINET_REUSEPORT, 0) != 0) {
 				t = in6_pcblookup_local(pcbinfo,
-				    &sin6->sin6_addr, lport,
-				    INPLOOKUP_WILDCARD, cred);
+				    &sin6->sin6_addr, sin6->sin6_scope_id,
+				    lport, INPLOOKUP_WILDCARD, cred);
 				if (t &&
 				    ((t->inp_flags & INP_TIMEWAIT) == 0) &&
 				    (so->so_type != SOCK_STREAM ||
@@ -227,7 +227,7 @@ in6_pcbbind(struct inpcb *inp, struct so
 #endif
 			}
 			t = in6_pcblookup_local(pcbinfo, &sin6->sin6_addr,
-			    lport, lookupflags, cred);
+			    sin6->sin6_scope_id, lport, lookupflags, cred);
 			if (t && (t->inp_flags & INP_TIMEWAIT)) {
 				/*
 				 * XXXRW: If an incpb has had its timewait
@@ -269,6 +269,7 @@ in6_pcbbind(struct inpcb *inp, struct so
 #endif
 		}
 		inp->in6p_laddr = sin6->sin6_addr;
+		inp->in6p_zoneid = sin6->sin6_scope_id;
 	}
 	if (lport == 0) {
 		if ((error = in6_pcbsetport(&inp->in6p_laddr, inp, cred)) != 0) {
@@ -676,7 +677,7 @@ in6_pcbnotify(struct inpcbinfo *pcbinfo,
  */
 struct inpcb *
 in6_pcblookup_local(struct inpcbinfo *pcbinfo, struct in6_addr *laddr,
-    u_short lport, int lookupflags, struct ucred *cred)
+    uint32_t zoneid, u_short lport, int lookupflags, struct ucred *cred)
 {
 	register struct inpcb *inp;
 	int matchwild = 3, wildcard;
@@ -700,6 +701,7 @@ in6_pcblookup_local(struct inpcbinfo *pc
 				continue;
 			if (IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr) &&
 			    IN6_ARE_ADDR_EQUAL(&inp->in6p_laddr, laddr) &&
+			    inp->in6p_zoneid == zoneid &&
 			    inp->inp_lport == lport) {
 				/* Found. */
 				if (cred == NULL ||
@@ -734,7 +736,6 @@ in6_pcblookup_local(struct inpcbinfo *pc
 			 * fit.
 			 */
 			LIST_FOREACH(inp, &phd->phd_pcblist, inp_portlist) {
-				wildcard = 0;
 				if (cred != NULL &&
 				    !prison_equal_ip6(cred->cr_prison,
 					inp->inp_cred->cr_prison))
@@ -742,6 +743,7 @@ in6_pcblookup_local(struct inpcbinfo *pc
 				/* XXX inp locking */
 				if ((inp->inp_vflag & INP_IPV6) == 0)
 					continue;
+				wildcard = 0;
 				if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr))
 					wildcard++;
 				if (!IN6_IS_ADDR_UNSPECIFIED(
@@ -751,6 +753,8 @@ in6_pcblookup_local(struct inpcbinfo *pc
 					else if (!IN6_ARE_ADDR_EQUAL(
 					    &inp->in6p_laddr, laddr))
 						continue;
+					else if (inp->in6p_zoneid != zoneid)
+						continue;
 				} else {
 					if (!IN6_IS_ADDR_UNSPECIFIED(laddr))
 						wildcard++;

Modified: user/ae/inet6/sys/netinet6/in6_pcb.h
==============================================================================
--- user/ae/inet6/sys/netinet6/in6_pcb.h	Tue Oct 15 23:31:08 2013	(r256568)
+++ user/ae/inet6/sys/netinet6/in6_pcb.h	Tue Oct 15 23:56:31 2013	(r256569)
@@ -87,9 +87,8 @@ int	in6_pcbconnect_mbuf(struct inpcb *, 
 	    struct ucred *, struct mbuf *);
 void	in6_pcbdisconnect(struct inpcb *);
 struct	inpcb *
-	in6_pcblookup_local(struct inpcbinfo *,
-				 struct in6_addr *, u_short, int,
-				 struct ucred *);
+	in6_pcblookup_local(struct inpcbinfo *, struct in6_addr *, uint32_t,
+	    u_short, int, struct ucred *);
 struct	inpcb *
 	in6_pcblookup(struct inpcbinfo *, struct in6_addr *,
 			   u_int, struct in6_addr *, u_int, int,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310152356.r9FNuVCl004136>