svn commit: r274348 - head/sys/netinet6
Andrey V. Elsukov
ae at FreeBSD.org
Mon Nov 10 16:12:52 UTC 2014
Author: ae
Date: Mon Nov 10 16:12:51 2014
New Revision: 274348
URL: https://svnweb.freebsd.org/changeset/base/274348
Log:
Add sa6_checkzone_ifp() function. It checks correctness of struct
sockaddr_in6, usually obtained from the user level through ioctl.
It initializes sin6_scope_id using given interface.
Sponsored by: Yandex LLC
Modified:
head/sys/netinet6/scope6.c
head/sys/netinet6/scope6_var.h
Modified: head/sys/netinet6/scope6.c
==============================================================================
--- head/sys/netinet6/scope6.c Mon Nov 10 16:01:39 2014 (r274347)
+++ head/sys/netinet6/scope6.c Mon Nov 10 16:12:51 2014 (r274348)
@@ -532,4 +532,25 @@ sa6_checkzone(struct sockaddr_in6 *sa6)
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 (0);
+ } else if (sa6->sin6_scope_id != in6_getscopezone(ifp, scope))
+ return (EADDRNOTAVAIL);
+ }
+ return (sa6_checkzone(sa6));
+}
+
Modified: head/sys/netinet6/scope6_var.h
==============================================================================
--- head/sys/netinet6/scope6_var.h Mon Nov 10 16:01:39 2014 (r274347)
+++ head/sys/netinet6/scope6_var.h Mon Nov 10 16:12:51 2014 (r274348)
@@ -58,6 +58,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-head
mailing list