Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Jan 2013 11:17:51 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r245785 - user/ae/inet6/sys/netinet6
Message-ID:  <201301221117.r0MBHpGP027525@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 
 /*



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