From ee649ae69a2e4e4f325e66a9a31694ea0a5f3d9a Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Fri, 24 Jun 2016 06:40:50 -0700 Subject: Add 6plane assignment support to network controller, and cleanup. --- node/InetAddress.cpp | 23 +++++++++++++++++++++-- node/InetAddress.hpp | 11 +++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) (limited to 'node') diff --git a/node/InetAddress.cpp b/node/InetAddress.cpp index 30b1ff2e..3f6b9be6 100644 --- a/node/InetAddress.cpp +++ b/node/InetAddress.cpp @@ -395,7 +395,6 @@ bool InetAddress::operator<(const InetAddress &a) const } InetAddress InetAddress::makeIpv6LinkLocal(const MAC &mac) - throw() { struct sockaddr_in6 sin6; sin6.sin6_family = AF_INET6; @@ -420,7 +419,6 @@ InetAddress InetAddress::makeIpv6LinkLocal(const MAC &mac) } InetAddress InetAddress::makeIpv6rfc4193(uint64_t nwid,uint64_t zeroTierAddress) - throw() { InetAddress r; struct sockaddr_in6 *const sin6 = reinterpret_cast(&r); @@ -445,4 +443,25 @@ InetAddress InetAddress::makeIpv6rfc4193(uint64_t nwid,uint64_t zeroTierAddress) return r; } +InetAddress InetAddress::makeIpv66plane(uint64_t nwid,uint64_t zeroTierAddress) +{ + nwid ^= (nwid >> 32); + InetAddress r; + struct sockaddr_in6 *const sin6 = reinterpret_cast(&r); + sin6->sin6_family = AF_INET6; + sin6->sin6_addr.s6_addr[0] = 0xfc; + sin6->sin6_addr.s6_addr[1] = (uint8_t)(nwid >> 24); + sin6->sin6_addr.s6_addr[2] = (uint8_t)(nwid >> 16); + sin6->sin6_addr.s6_addr[3] = (uint8_t)(nwid >> 8); + sin6->sin6_addr.s6_addr[4] = (uint8_t)nwid; + sin6->sin6_addr.s6_addr[5] = (uint8_t)(zeroTierAddress >> 32); + sin6->sin6_addr.s6_addr[6] = (uint8_t)(zeroTierAddress >> 24); + sin6->sin6_addr.s6_addr[7] = (uint8_t)(zeroTierAddress >> 16); + sin6->sin6_addr.s6_addr[8] = (uint8_t)(zeroTierAddress >> 8); + sin6->sin6_addr.s6_addr[9] = (uint8_t)zeroTierAddress; + sin6->sin6_addr.s6_addr[15] = 0x01; + sin6->sin6_port = Utils::hton((uint16_t)40); + return r; +} + } // namespace ZeroTier diff --git a/node/InetAddress.hpp b/node/InetAddress.hpp index 8abf1c04..e03deb71 100644 --- a/node/InetAddress.hpp +++ b/node/InetAddress.hpp @@ -471,8 +471,7 @@ struct InetAddress : public sockaddr_storage * @param mac MAC address seed * @return IPv6 link-local address */ - static InetAddress makeIpv6LinkLocal(const MAC &mac) - throw(); + static InetAddress makeIpv6LinkLocal(const MAC &mac); /** * Compute private IPv6 unicast address from network ID and ZeroTier address @@ -515,8 +514,12 @@ struct InetAddress : public sockaddr_storage * @param zeroTierAddress 40-bit device address (in least significant 40 bits, highest 24 bits ignored) * @return IPv6 private unicast address with /88 netmask */ - static InetAddress makeIpv6rfc4193(uint64_t nwid,uint64_t zeroTierAddress) - throw(); + static InetAddress makeIpv6rfc4193(uint64_t nwid,uint64_t zeroTierAddress); + + /** + * Compute a private IPv6 "6plane" unicast address from network ID and ZeroTier address + */ + static InetAddress makeIpv66plane(uint64_t nwid,uint64_t zeroTierAddress); }; } // namespace ZeroTier -- cgit v1.2.3