svn commit: r245785 - user/ae/inet6/sys/netinet6

Andrey V. Elsukov ae at FreeBSD.org
Tue Jan 22 11:17:51 UTC 2013


Author: ae
Date: Tue Jan 22 11:17:50 2013
New Revision: 245785
URL: http://svnweb.freebsd.org/changeset/base/245785

Log:
  Simplify in6_addrscope function.

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

Modified: user/ae/inet6/sys/netinet6/scope6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/scope6.c	Tue Jan 22 10:22:12 2013	(r245784)
+++ user/ae/inet6/sys/netinet6/scope6.c	Tue Jan 22 11:17:50 2013	(r245785)
@@ -202,60 +202,20 @@ scope6_get(struct ifnet *ifp, struct sco
 int
 in6_addrscope(struct in6_addr *addr)
 {
-	int scope;
-
-	if (addr->s6_addr[0] == 0xfe) {
-		scope = addr->s6_addr[1] & 0xc0;
-
-		switch (scope) {
-		case 0x80:
-			return IPV6_ADDR_SCOPE_LINKLOCAL;
-			break;
-		case 0xc0:
-			return IPV6_ADDR_SCOPE_SITELOCAL;
-			break;
-		default:
-			return IPV6_ADDR_SCOPE_GLOBAL; /* just in case */
-			break;
-		}
-	}
 
-
-	if (addr->s6_addr[0] == 0xff) {
-		scope = addr->s6_addr[1] & 0x0f;
-
-		/*
-		 * due to other scope such as reserved,
-		 * return scope doesn't work.
-		 */
-		switch (scope) {
-		case IPV6_ADDR_SCOPE_INTFACELOCAL:
-			return IPV6_ADDR_SCOPE_INTFACELOCAL;
-			break;
-		case IPV6_ADDR_SCOPE_LINKLOCAL:
-			return IPV6_ADDR_SCOPE_LINKLOCAL;
-			break;
-		case IPV6_ADDR_SCOPE_SITELOCAL:
-			return IPV6_ADDR_SCOPE_SITELOCAL;
-			break;
-		default:
-			return IPV6_ADDR_SCOPE_GLOBAL;
-			break;
-		}
-	}
-
-	/*
-	 * Regard loopback and unspecified addresses as global, since
-	 * they have no ambiguity.
-	 */
+	if (IN6_IS_ADDR_MULTICAST(addr))
+		return (IPV6_ADDR_MC_SCOPE(addr));
+	if (IN6_IS_ADDR_LINKLOCAL(addr))
+		return (IPV6_ADDR_SCOPE_LINKLOCAL);
 	if (bcmp(&in6addr_loopback, addr, sizeof(*addr) - 1) == 0) {
 		if (addr->s6_addr[15] == 1) /* loopback */
-			return IPV6_ADDR_SCOPE_LINKLOCAL;
-		if (addr->s6_addr[15] == 0) /* unspecified */
-			return IPV6_ADDR_SCOPE_GLOBAL; /* XXX: correct? */
+			return (IPV6_ADDR_SCOPE_LINKLOCAL);
+		/*
+		 * Regard unspecified address as global, since
+		 * it has no ambiguity.
+		 */
 	}
-
-	return IPV6_ADDR_SCOPE_GLOBAL;
+	return (IPV6_ADDR_SCOPE_GLOBAL);
 }
 
 /*


More information about the svn-src-user mailing list