Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Oct 2013 12:02:06 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r256526 - user/ae/inet6/sys/netinet6
Message-ID:  <201310151202.r9FC26ZU069615@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Tue Oct 15 12:02:05 2013
New Revision: 256526
URL: http://svnweb.freebsd.org/changeset/base/256526

Log:
  Some cleanups in in6_pcbbind():
  * remove register keyword;
  * sort variables declarations;
  * use sa6_checkzone() to check sockaddr_in6 structure;
  * use in6ifa_ifwithaddr() function;
  * remove sa6_embedscope() call.

Modified:
  user/ae/inet6/sys/netinet6/in6_pcb.c

Modified: user/ae/inet6/sys/netinet6/in6_pcb.c
==============================================================================
--- user/ae/inet6/sys/netinet6/in6_pcb.c	Tue Oct 15 11:37:57 2013	(r256525)
+++ user/ae/inet6/sys/netinet6/in6_pcb.c	Tue Oct 15 12:02:05 2013	(r256526)
@@ -110,21 +110,18 @@ static struct inpcb *in6_pcblookup_hash_
     struct in6_addr *, u_int, struct in6_addr *, u_int, int, struct ifnet *);
 
 int
-in6_pcbbind(register struct inpcb *inp, struct sockaddr *nam,
-    struct ucred *cred)
+in6_pcbbind(struct inpcb *inp, struct sockaddr *nam, struct ucred *cred)
 {
 	struct socket *so = inp->inp_socket;
-	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)NULL;
+	struct sockaddr_in6 *sin6 = NULL;
 	struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
-	u_short	lport = 0;
 	int error, lookupflags = 0;
 	int reuseport = (so->so_options & SO_REUSEPORT);
+	u_short	lport = 0;
 
 	INP_WLOCK_ASSERT(inp);
 	INP_HASH_WLOCK_ASSERT(pcbinfo);
 
-	if (TAILQ_EMPTY(&V_in6_ifaddrhead))	/* XXX broken! */
-		return (EADDRNOTAVAIL);
 	if (inp->inp_lport || !IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr))
 		return (EINVAL);
 	if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0)
@@ -137,14 +134,11 @@ in6_pcbbind(register struct inpcb *inp, 
 		sin6 = (struct sockaddr_in6 *)nam;
 		if (nam->sa_len != sizeof(*sin6))
 			return (EINVAL);
-		/*
-		 * family check.
-		 */
 		if (nam->sa_family != AF_INET6)
 			return (EAFNOSUPPORT);
-
-		if ((error = sa6_embedscope(sin6, V_ip6_use_defzone)) != 0)
-			return(error);
+		/* Check sin6_scope_id. The caller must set it properly. */
+		if ((error = sa6_checkzone(sin6)) != 0)
+			return (error);
 
 		if ((error = prison_local_ip6(cred, &sin6->sin6_addr,
 		    ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0))) != 0)
@@ -162,11 +156,11 @@ in6_pcbbind(register struct inpcb *inp, 
 			if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) != 0)
 				reuseport = SO_REUSEADDR|SO_REUSEPORT;
 		} else if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
-			struct ifaddr *ifa;
+			struct in6_ifaddr *ifa;
 
-			sin6->sin6_port = 0;		/* yech... */
-			if ((ifa = ifa_ifwithaddr((struct sockaddr *)sin6)) ==
-			    NULL &&
+			ifa = in6ifa_ifwithaddr(&sin6->sin6_addr,
+			    sin6->sin6_scope_id);
+			if (ifa != NULL &&
 			    (inp->inp_flags & INP_BINDANY) == 0) {
 				return (EADDRNOTAVAIL);
 			}
@@ -177,14 +171,13 @@ in6_pcbbind(register struct inpcb *inp, 
 			 * We should allow to bind to a deprecated address, since
 			 * the application dares to use it.
 			 */
-			if (ifa != NULL &&
-			    ((struct in6_ifaddr *)ifa)->ia6_flags &
-			    (IN6_IFF_ANYCAST|IN6_IFF_NOTREADY|IN6_IFF_DETACHED)) {
-				ifa_free(ifa);
+			if (ifa != NULL && (ifa->ia6_flags & (IN6_IFF_ANYCAST |
+			    IN6_IFF_NOTREADY | IN6_IFF_DETACHED))) {
+				ifa_free(&ifa->ia_ifa);
 				return (EADDRNOTAVAIL);
 			}
 			if (ifa != NULL)
-				ifa_free(ifa);
+				ifa_free(&ifa->ia_ifa);
 		}
 		if (lport) {
 			struct inpcb *t;



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