diff options
author | Yuri Pankov <yuri.pankov@nexenta.com> | 2011-11-03 11:18:52 +0400 |
---|---|---|
committer | Yuri Pankov <yuri.pankov@nexenta.com> | 2011-11-03 11:18:52 +0400 |
commit | 9b241b4ed1cf882400b069ff9853cdd310d469bf (patch) | |
tree | 8a5bb2eea89b306ecbb77024a71a975a634a6994 /usr/src/uts/common/netinet | |
parent | abaa65c888454bd18b57728a7bf6de5ba661abf3 (diff) | |
download | illumos-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.h | 34 |
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__) */ |