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