summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2016-06-24 06:40:50 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2016-06-24 06:40:50 -0700
commitee649ae69a2e4e4f325e66a9a31694ea0a5f3d9a (patch)
tree53d325ebfc7b53c7ffbbc3d9c8f952b9f459a983 /node
parent20d155e630aba9fdfb757765e889c13ea8d9a9d9 (diff)
downloadinfinitytier-ee649ae69a2e4e4f325e66a9a31694ea0a5f3d9a.tar.gz
infinitytier-ee649ae69a2e4e4f325e66a9a31694ea0a5f3d9a.zip
Add 6plane assignment support to network controller, and cleanup.
Diffstat (limited to 'node')
-rw-r--r--node/InetAddress.cpp23
-rw-r--r--node/InetAddress.hpp11
2 files changed, 28 insertions, 6 deletions
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<struct sockaddr_in6 *>(&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<struct sockaddr_in6 *>(&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