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

Andrey V. Elsukov ae at FreeBSD.org
Thu Nov 21 02:42:23 UTC 2013


Author: ae
Date: Thu Nov 21 02:42:22 2013
New Revision: 258413
URL: http://svnweb.freebsd.org/changeset/base/258413

Log:
  Add sa6_checkzone_ifp() function.
  It is similar to sa6_checkzone, but has additional argument - ifnet.
  It is used for scope zone index initialization.

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

Modified: user/ae/inet6/sys/netinet6/scope6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/scope6.c	Thu Nov 21 01:08:10 2013	(r258412)
+++ user/ae/inet6/sys/netinet6/scope6.c	Thu Nov 21 02:42:22 2013	(r258413)
@@ -500,3 +500,24 @@ sa6_checkzone(struct sockaddr_in6 *sa6)
 	/* Return error if we can't determine zone id */
 	return (sa6->sin6_scope_id ? 0: EADDRNOTAVAIL);
 }
+
+/*
+ * This function is similar to sa6_checkzone, but it uses given ifp
+ * to initialize sin6_scope_id.
+ */
+int
+sa6_checkzone_ifp(struct ifnet *ifp, struct sockaddr_in6 *sa6)
+{
+	int scope;
+
+	scope = in6_addrscope(&sa6->sin6_addr);
+	if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
+	    scope == IPV6_ADDR_SCOPE_INTFACELOCAL) {
+		if (sa6->sin6_scope_id != 0 &&
+		    sa6->sin6_scope_id != in6_getscopezone(ifp, scope))
+			return (EADDRNOTAVAIL);
+		if (sa6->sin6_scope_id == 0)
+			sa6->sin6_scope_id = in6_getscopezone(ifp, scope);
+	}
+	return (sa6_checkzone(sa6));
+}

Modified: user/ae/inet6/sys/netinet6/scope6_var.h
==============================================================================
--- user/ae/inet6/sys/netinet6/scope6_var.h	Thu Nov 21 01:08:10 2013	(r258412)
+++ user/ae/inet6/sys/netinet6/scope6_var.h	Thu Nov 21 02:42:22 2013	(r258413)
@@ -59,6 +59,7 @@ u_int32_t scope6_addr2default(struct in6
 int	sa6_embedscope(struct sockaddr_in6 *, int);
 int	sa6_recoverscope(struct sockaddr_in6 *);
 int	sa6_checkzone(struct sockaddr_in6 *);
+int	sa6_checkzone_ifp(struct ifnet *, struct sockaddr_in6 *);
 int	in6_setscope(struct in6_addr *, struct ifnet *, u_int32_t *);
 int	in6_clearscope(struct in6_addr *);
 uint16_t in6_getscope(struct in6_addr *);


More information about the svn-src-user mailing list