summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/netinet
diff options
context:
space:
mode:
authorYuri Pankov <yuri.pankov@nexenta.com>2011-11-03 11:18:52 +0400
committerYuri Pankov <yuri.pankov@nexenta.com>2011-11-03 11:18:52 +0400
commit9b241b4ed1cf882400b069ff9853cdd310d469bf (patch)
tree8a5bb2eea89b306ecbb77024a71a975a634a6994 /usr/src/uts/common/netinet
parentabaa65c888454bd18b57728a7bf6de5ba661abf3 (diff)
downloadillumos-joyent-9b241b4ed1cf882400b069ff9853cdd310d469bf.tar.gz
877 share_nfs cannot share to IPv6 subnets
1554 SMB has no concept of IPv6 host access lists 1592 NFS access checks shouldn't fail if client address can't be resolved Reviewed by: Gordon Ross <gordon.w.ross@gmail.com> Reviewed by: Dan McDonald <danmcd@nexenta.com> Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/uts/common/netinet')
-rw-r--r--usr/src/uts/common/netinet/in.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/usr/src/uts/common/netinet/in.h b/usr/src/uts/common/netinet/in.h
index c1166fc34f..b819f0dd39 100644
--- a/usr/src/uts/common/netinet/in.h
+++ b/usr/src/uts/common/netinet/in.h
@@ -1,6 +1,8 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
/*
* Copyright (c) 1982, 1986 Regents of the University of California.
@@ -839,6 +841,38 @@ struct sockaddr_in6 {
((addr1)->_S6_un._S6_u32[1] == (addr2)->_S6_un._S6_u32[1]) && \
((addr1)->_S6_un._S6_u32[0] == (addr2)->_S6_un._S6_u32[0]))
+/*
+ * IN6_ARE_PREFIXEDADDR_EQUAL (not defined in RFCs)
+ * Compares if prefixed parts of IPv6 addresses are equal.
+ *
+ * uint32_t IN6_MASK_FROM_PREFIX(int, int);
+ * bool IN6_ARE_PREFIXEDADDR_EQUAL(const struct in6_addr *,
+ * const struct in6_addr *,
+ * int);
+ */
+#define IN6_MASK_FROM_PREFIX(qoctet, prefix) \
+ ((((qoctet) + 1) * 32 < (prefix)) ? 0xFFFFFFFFu : \
+ ((((qoctet) * 32) >= (prefix)) ? 0x00000000u : \
+ 0xFFFFFFFFu << (((qoctet) + 1) * 32 - (prefix))))
+
+#define IN6_ARE_PREFIXEDADDR_EQUAL(addr1, addr2, prefix) \
+ (((ntohl((addr1)->_S6_un._S6_u32[0]) & \
+ IN6_MASK_FROM_PREFIX(0, prefix)) == \
+ (ntohl((addr2)->_S6_un._S6_u32[0]) & \
+ IN6_MASK_FROM_PREFIX(0, prefix))) && \
+ ((ntohl((addr1)->_S6_un._S6_u32[1]) & \
+ IN6_MASK_FROM_PREFIX(1, prefix)) == \
+ (ntohl((addr2)->_S6_un._S6_u32[1]) & \
+ IN6_MASK_FROM_PREFIX(1, prefix))) && \
+ ((ntohl((addr1)->_S6_un._S6_u32[2]) & \
+ IN6_MASK_FROM_PREFIX(2, prefix)) == \
+ (ntohl((addr2)->_S6_un._S6_u32[2]) & \
+ IN6_MASK_FROM_PREFIX(2, prefix))) && \
+ ((ntohl((addr1)->_S6_un._S6_u32[3]) & \
+ IN6_MASK_FROM_PREFIX(3, prefix)) == \
+ (ntohl((addr2)->_S6_un._S6_u32[3]) & \
+ IN6_MASK_FROM_PREFIX(3, prefix))))
+
#endif /* !defined(_XPG4_2) || defined(_XPG6) || defined(__EXTENSIONS__) */