From 8e4d7c56d867866235bd365cc05fc345ad051dac Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 27 Feb 2020 14:24:11 -0800 Subject: [PATCH] Stub out a protocol field in Endpoint INETADDR types for future use. --- node/Endpoint.cpp | 20 +++++++++++--------- node/Endpoint.hpp | 29 +++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/node/Endpoint.cpp b/node/Endpoint.cpp index 89ca94648..9f8c5989b 100644 --- a/node/Endpoint.cpp +++ b/node/Endpoint.cpp @@ -25,7 +25,7 @@ bool Endpoint::operator==(const Endpoint &ep) const case TYPE_URL: return (strcmp(_v.url,ep._v.url) == 0); case TYPE_ETHERNET: return (_v.eth == ep._v.eth); case TYPE_INETADDR_V4: - case TYPE_INETADDR_V6: return (inetAddr() == ep.inetAddr()); + case TYPE_INETADDR_V6: return ((asInetAddress(_v.in.sa) == asInetAddress(ep._v.in.sa))&&(_v.in.proto == ep._v.in.proto)); } } return false; @@ -45,7 +45,7 @@ bool Endpoint::operator<(const Endpoint &ep) const case TYPE_URL: return (strcmp(_v.url,ep._v.url) < 0); case TYPE_ETHERNET: return (_v.eth < ep._v.eth); case TYPE_INETADDR_V4: - case TYPE_INETADDR_V6: return (inetAddr() < ep.inetAddr()); + case TYPE_INETADDR_V6: return ((_v.in.proto < ep._v.in.proto)||((_v.in.proto == ep._v.in.proto)&&(asInetAddress(_v.in.sa) < asInetAddress(ep._v.in.sa)))); default: return false; } } @@ -100,10 +100,11 @@ int Endpoint::marshal(uint8_t data[ZT_ENDPOINT_MARSHAL_SIZE_MAX]) const noexcept return 13; case TYPE_INETADDR_V4: case TYPE_INETADDR_V6: - p = asInetAddress(_v.sa).marshal(data + 7); - if (p < 0) - return p; - return 7 + p; + p = 7 + asInetAddress(_v.in.sa).marshal(data + 7); + if (p <= 7) + return -1; + data[p++] = _v.in.proto; + return p; default: data[0] = (uint8_t)TYPE_NIL; return 7; @@ -174,10 +175,11 @@ int Endpoint::unmarshal(const uint8_t *restrict data,const int len) noexcept return 13; case TYPE_INETADDR_V4: case TYPE_INETADDR_V6: - p = asInetAddress(_v.sa).unmarshal(data + 7,len - 7); - if (p <= 0) + p = 7 + asInetAddress(_v.in.sa).unmarshal(data + 7,len - 7); + if ((p <= 7)||(p >= len)) return -1; - return 7 + p; + _v.in.proto = data[p++]; + return p; default: // Unrecognized endpoint types not yet specified must start with a 16-bit // length so that older versions of ZeroTier can skip them. diff --git a/node/Endpoint.hpp b/node/Endpoint.hpp index fc0c1db54..5abdfd7ab 100644 --- a/node/Endpoint.hpp +++ b/node/Endpoint.hpp @@ -55,9 +55,21 @@ public: TYPE_INETADDR_V6 = ZT_TRACE_EVENT_PATH_TYPE_INETADDR_V6 }; + /** + * Protocol identifiers for INETADDR endpoint types + * + * Most of these are reserved for future use. + */ + enum Protocol + { + PROTO_UDP_ZT = 0, + PROTO_TCP_ZT = 1, + PROTO_IP_ZT = 2 + }; + ZT_ALWAYS_INLINE Endpoint() noexcept { memoryZero(this); } - explicit ZT_ALWAYS_INLINE Endpoint(const InetAddress &sa) + explicit ZT_ALWAYS_INLINE Endpoint(const InetAddress &sa,const Protocol proto = PROTO_UDP_ZT) { switch (sa.family()) { case AF_INET: @@ -69,7 +81,8 @@ public: _t = TYPE_NIL; return; } - asInetAddress(_v.sa) = sa; + asInetAddress(_v.in.sa) = sa; + _v.in.proto = (uint8_t)proto; } ZT_ALWAYS_INLINE Endpoint(const Address &zt,const uint8_t identityHash[ZT_IDENTITY_HASH_SIZE]) : @@ -95,7 +108,12 @@ public: /** * @return InetAddress or NIL if not of this type */ - ZT_ALWAYS_INLINE const InetAddress &inetAddr() const noexcept { return ((_t == TYPE_INETADDR_V4)||(_t == TYPE_INETADDR_V6)) ? asInetAddress(_v.sa) : InetAddress::NIL; } + ZT_ALWAYS_INLINE const InetAddress &inetAddr() const noexcept { return ((_t == TYPE_INETADDR_V4)||(_t == TYPE_INETADDR_V6)) ? asInetAddress(_v.in.sa) : InetAddress::NIL; } + + /** + * @return Protocol for INETADDR types, undefined for other endpoint types + */ + ZT_ALWAYS_INLINE Protocol inetAddrProto() const noexcept { return (Protocol)_v.in.proto; } /** * @return DNS name or empty string if not of this type @@ -149,7 +167,10 @@ private: Type _t; int _l[3]; // X,Y,Z location in kilometers from the nearest gravitational center of mass union { - struct sockaddr_storage sa; + struct { + sockaddr_storage sa; + uint8_t proto; + } in; struct { uint16_t port; char name[ZT_ENDPOINT_MAX_NAME_SIZE];