Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Oct 2013 00:48:31 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r257031 - user/ae/inet6/sys/netinet6
Message-ID:  <201310240048.r9O0mVN5023369@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Thu Oct 24 00:48:31 2013
New Revision: 257031
URL: http://svnweb.freebsd.org/changeset/base/257031

Log:
  Scope related cleanup in rip6_bind():
  * remove sa6_embedscope() call, use sa6_checkzone() instead;
  * use in6ifa_ifwithaddr() to determine interface where address
  is configured.
  * initialize inp->in6p_zoneid.

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

Modified: user/ae/inet6/sys/netinet6/raw_ip6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/raw_ip6.c	Thu Oct 24 00:39:27 2013	(r257030)
+++ user/ae/inet6/sys/netinet6/raw_ip6.c	Thu Oct 24 00:48:31 2013	(r257031)
@@ -721,7 +721,7 @@ rip6_bind(struct socket *so, struct sock
 {
 	struct inpcb *inp;
 	struct sockaddr_in6 *addr = (struct sockaddr_in6 *)nam;
-	struct ifaddr *ifa = NULL;
+	struct in6_ifaddr *ifa = NULL;
 	int error = 0;
 
 	inp = sotoinpcb(so);
@@ -733,24 +733,24 @@ rip6_bind(struct socket *so, struct sock
 		return (error);
 	if (TAILQ_EMPTY(&V_ifnet) || addr->sin6_family != AF_INET6)
 		return (EADDRNOTAVAIL);
-	if ((error = sa6_embedscope(addr, V_ip6_use_defzone)) != 0)
+	if ((error = sa6_checkzone(addr)) != 0)
 		return (error);
-
-	if (!IN6_IS_ADDR_UNSPECIFIED(&addr->sin6_addr) &&
-	    (ifa = ifa_ifwithaddr((struct sockaddr *)addr)) == NULL)
-		return (EADDRNOTAVAIL);
-	if (ifa != NULL &&
-	    ((struct in6_ifaddr *)ifa)->ia6_flags &
-	    (IN6_IFF_ANYCAST|IN6_IFF_NOTREADY|
-	     IN6_IFF_DETACHED|IN6_IFF_DEPRECATED)) {
-		ifa_free(ifa);
+	if (!IN6_IS_ADDR_UNSPECIFIED(&addr->sin6_addr)) {
+		ifa = in6ifa_ifwithaddr(&addr->sin6_addr, addr->sin6_scope_id);
+		if (ifa == NULL)
+			return (EADDRNOTAVAIL);
+	}
+	if (ifa != NULL && ifa->ia6_flags & (IN6_IFF_ANYCAST |
+	    IN6_IFF_NOTREADY | IN6_IFF_DETACHED | IN6_IFF_DEPRECATED)) {
+		ifa_free(&ifa->ia_ifa);
 		return (EADDRNOTAVAIL);
 	}
 	if (ifa != NULL)
-		ifa_free(ifa);
+		ifa_free(&ifa->ia_ifa);
 	INP_INFO_WLOCK(&V_ripcbinfo);
 	INP_WLOCK(inp);
 	inp->in6p_laddr = addr->sin6_addr;
+	inp->in6p_zoneid = addr->sin6_scope_id;
 	INP_WUNLOCK(inp);
 	INP_INFO_WUNLOCK(&V_ripcbinfo);
 	return (0);



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