diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/go/cmd/zerotier/cli/help.go b/go/cmd/zerotier/cli/help.go index 9c85eb7cb..9982612cc 100644 --- a/go/cmd/zerotier/cli/help.go +++ b/go/cmd/zerotier/cli/help.go @@ -36,7 +36,9 @@ Commands: version Print version service Start as service status Show node status and configuration - join [fingerprint] Join a virtual network + join [option] Join a virtual network + auth Join authorization token + fingerprint Full controller identity fingerprint leave Leave a virtual network networks List VL2 virtual networks network [command] [option] - Network management commands @@ -57,6 +59,7 @@ Commands: add [endpoint] Designate a peer as a root remove
Un-designate a peer as a root subscribe Subscribe to a root set + unsubscribe Unsubscribe from a root set set [option] [value] - Get or set a core config option port Primary P2P port secondaryport Secondary P2P port (0 to disable) diff --git a/include/ZeroTierCore.h b/include/ZeroTierCore.h index 77a4666b1..e88f47757 100644 --- a/include/ZeroTierCore.h +++ b/include/ZeroTierCore.h @@ -376,7 +376,6 @@ enum ZT_TracePacketDropReason ZT_TRACE_PACKET_DROP_REASON_INVALID_COMPRESSED_DATA = 6, ZT_TRACE_PACKET_DROP_REASON_UNRECOGNIZED_VERB = 7, ZT_TRACE_PACKET_DROP_REASON_REPLY_NOT_EXPECTED = 8 - }; /** diff --git a/node/AES.cpp b/node/AES.cpp index b5c1472f6..9d92c65ab 100644 --- a/node/AES.cpp +++ b/node/AES.cpp @@ -1116,7 +1116,7 @@ void AES::_encryptSW(const uint8_t in[16], uint8_t out[16]) const noexcept void AES::_decryptSW(const uint8_t in[16], uint8_t out[16]) const noexcept { - const uint32_t *const restrict rk = _k.sw.dk; + const uint32_t *restrict rk = _k.sw.dk; uint32_t s0, s1, s2, s3, t0, t1, t2, t3; const uint32_t m8 = 0xff; s0 = readuint32_t(in) ^ rk[0]; diff --git a/node/Buf.hpp b/node/Buf.hpp index d07829e12..2c739f363 100644 --- a/node/Buf.hpp +++ b/node/Buf.hpp @@ -79,7 +79,7 @@ namespace ZeroTier { */ class Buf { - friend class SharedPtr; + friend class SharedPtr< Buf >; public: // New and delete operators that allocate Buf instances from a shared lock-free memory pool. @@ -115,7 +115,7 @@ public: */ struct Slice : TriviallyCopyable { - ZT_INLINE Slice(const SharedPtr &b_, const unsigned int s_, const unsigned int e_) noexcept: b(b_), s(s_), e(e_) + ZT_INLINE Slice(const SharedPtr< Buf > &b_, const unsigned int s_, const unsigned int e_) noexcept: b(b_), s(s_), e(e_) {} ZT_INLINE Slice() noexcept: b(), s(0), e(0) @@ -137,7 +137,7 @@ public: /** * Buffer holding slice data */ - SharedPtr b; + SharedPtr< Buf > b; /** * Index of start of data in slice @@ -153,16 +153,16 @@ public: /** * A vector of slices making up a packet that might span more than one buffer. */ - class PacketVector : public ZeroTier::FCV + class PacketVector : public ZeroTier::FCV< Slice, ZT_MAX_PACKET_FRAGMENTS > { public: - ZT_INLINE PacketVector() : ZeroTier::FCV() + ZT_INLINE PacketVector() : ZeroTier::FCV< Slice, ZT_MAX_PACKET_FRAGMENTS >() {} ZT_INLINE unsigned int totalSize() const noexcept { unsigned int size = 0; - for (PacketVector::const_iterator s(begin());s != end();++s) + for (PacketVector::const_iterator s(begin()); s != end(); ++s) size += s->e - s->s; return size; } @@ -176,7 +176,7 @@ public: ZT_INLINE int mergeCopy(Buf &b) const noexcept { unsigned int size = 0; - for (PacketVector::const_iterator s(begin());s != end();++s) { + for (PacketVector::const_iterator s(begin()); s != end(); ++s) { const unsigned int start = s->s; const unsigned int rem = s->e - start; if (likely((size + rem) <= ZT_BUF_MEM_SIZE)) { @@ -186,7 +186,7 @@ public: return -1; } } - return (int) size; + return (int)size; } /** @@ -200,11 +200,11 @@ public: * @tparam F Type of copyFunction (typically inferred) * @return Size of data in destination or -1 on error */ - template + template< typename F > ZT_INLINE int mergeMap(Buf &b, const unsigned int simpleCopyBefore, F copyFunction) const noexcept { unsigned int size = 0; - for (PacketVector::const_iterator s(begin());s != end();++s) { + for (PacketVector::const_iterator s(begin()); s != end(); ++s) { unsigned int start = s->s; unsigned int rem = s->e - start; if (likely((size + rem) <= ZT_BUF_MEM_SIZE)) { @@ -225,7 +225,7 @@ public: return -1; } } - return (int) size; + return (int)size; } }; @@ -248,13 +248,13 @@ public: __nextInPool(0), __refCount(0) { - Utils::copy(unsafeData, b2.unsafeData); + Utils::copy< ZT_BUF_MEM_SIZE >(unsafeData, b2.unsafeData); } ZT_INLINE Buf &operator=(const Buf &b2) noexcept { if (this != &b2) - Utils::copy(unsafeData, b2.unsafeData); + Utils::copy< ZT_BUF_MEM_SIZE >(unsafeData, b2.unsafeData); return *this; } @@ -281,14 +281,14 @@ public: * @return True if iterator has read past the size of the data */ static ZT_INLINE bool readOverflow(const int &ii, const unsigned int size) noexcept - { return ((ii - (int) size) > 0); } + { return ((ii - (int)size) > 0); } /** * Set all memory to zero */ ZT_INLINE void clear() noexcept { - Utils::zero(unsafeData); + Utils::zero< ZT_BUF_MEM_SIZE >(unsafeData); } /** @@ -300,7 +300,7 @@ public: ZT_INLINE uint8_t rI8(int &ii) const noexcept { const int s = ii++; - return unsafeData[(unsigned int) s & ZT_BUF_MEM_MASK]; + return unsafeData[(unsigned int)s & ZT_BUF_MEM_MASK]; } /** @@ -311,7 +311,7 @@ public: */ ZT_INLINE uint16_t rI16(int &ii) const noexcept { - const unsigned int s = (unsigned int) ii & ZT_BUF_MEM_MASK; + const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; ii += 2; #ifdef ZT_NO_UNALIGNED_ACCESS return ( @@ -330,7 +330,7 @@ public: */ ZT_INLINE uint32_t rI32(int &ii) const noexcept { - const unsigned int s = (unsigned int) ii & ZT_BUF_MEM_MASK; + const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; ii += 4; #ifdef ZT_NO_UNALIGNED_ACCESS return ( @@ -351,7 +351,7 @@ public: */ ZT_INLINE uint64_t rI64(int &ii) const noexcept { - const unsigned int s = (unsigned int) ii & ZT_BUF_MEM_MASK; + const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; ii += 8; #ifdef ZT_NO_UNALIGNED_ACCESS return ( @@ -383,7 +383,7 @@ public: * @param obj Object to read * @return Bytes read or a negative value on unmarshal error (passed from object) or overflow */ - template + template< typename T > ZT_INLINE int rO(int &ii, T &obj) const noexcept { if (likely(ii < ZT_BUF_MEM_SIZE)) { @@ -408,12 +408,12 @@ public: */ ZT_INLINE char *rS(int &ii, char *const buf, const unsigned int bufSize) const noexcept { - const char *const s = (const char *) (unsafeData + ii); + const char *const s = (const char *)(unsafeData + ii); const int sii = ii; while (ii < ZT_BUF_MEM_SIZE) { if (unsafeData[ii++] == 0) { const int l = ii - sii; - if (unlikely((unsigned int) l > bufSize)) + if (unlikely((unsigned int)l > bufSize)) return nullptr; Utils::copy(buf, s, l); return buf; @@ -437,7 +437,7 @@ public: */ ZT_INLINE const char *rSnc(int &ii) const noexcept { - const char *const s = (const char *) (unsafeData + ii); + const char *const s = (const char *)(unsafeData + ii); while (ii < ZT_BUF_MEM_SIZE) { if (unsafeData[ii++] == 0) return s; @@ -458,7 +458,7 @@ public: */ ZT_INLINE uint8_t *rB(int &ii, void *const bytes, const unsigned int len) const noexcept { - if (likely(((ii += (int) len) <= ZT_BUF_MEM_SIZE))) { + if (likely(((ii += (int)len) <= ZT_BUF_MEM_SIZE))) { Utils::copy(bytes, unsafeData + ii, len); return reinterpret_cast(bytes); } @@ -481,7 +481,7 @@ public: ZT_INLINE const uint8_t *rBnc(int &ii, unsigned int len) const noexcept { const uint8_t *const b = unsafeData + ii; - return ((ii += (int) len) <= ZT_BUF_MEM_SIZE) ? b : nullptr; + return ((ii += (int)len) <= ZT_BUF_MEM_SIZE) ? b : nullptr; } /** @@ -490,7 +490,7 @@ public: * @tparam I Static index * @return Value */ - template + template< unsigned int I > ZT_INLINE uint8_t lI8() const noexcept { static_assert(I < ZT_BUF_MEM_SIZE, "overflow"); @@ -503,7 +503,7 @@ public: * @tparam I Static index * @return Value */ - template + template< unsigned int I > ZT_INLINE uint8_t lI16() const noexcept { static_assert((I + 1) < ZT_BUF_MEM_SIZE, "overflow"); @@ -522,7 +522,7 @@ public: * @tparam I Static index * @return Value */ - template + template< unsigned int I > ZT_INLINE uint8_t lI32() const noexcept { static_assert((I + 3) < ZT_BUF_MEM_SIZE, "overflow"); @@ -543,7 +543,7 @@ public: * @tparam I Static index * @return Value */ - template + template< unsigned int I > ZT_INLINE uint8_t lI64() const noexcept { static_assert((I + 7) < ZT_BUF_MEM_SIZE, "overflow"); @@ -571,7 +571,7 @@ public: */ ZT_INLINE uint8_t lI8(const int ii) const noexcept { - return unsafeData[(unsigned int) ii & ZT_BUF_MEM_MASK]; + return unsafeData[(unsigned int)ii & ZT_BUF_MEM_MASK]; } /** @@ -583,7 +583,7 @@ public: */ ZT_INLINE uint16_t lI16(const int ii) const noexcept { - const unsigned int s = (unsigned int) ii & ZT_BUF_MEM_MASK; + const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS return ( ((uint16_t)unsafeData[s] << 8U) | @@ -602,7 +602,7 @@ public: */ ZT_INLINE uint32_t lI32(const int ii) const noexcept { - const unsigned int s = (unsigned int) ii & ZT_BUF_MEM_MASK; + const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS return ( ((uint32_t)unsafeData[s] << 24U) | @@ -623,7 +623,7 @@ public: */ ZT_INLINE uint8_t lI64(const int ii) const noexcept { - const unsigned int s = (unsigned int) ii & ZT_BUF_MEM_MASK; + const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS return ( ((uint64_t)unsafeData[s] << 56U) | @@ -648,7 +648,7 @@ public: ZT_INLINE void wI8(int &ii, const uint8_t n) noexcept { const int s = ii++; - unsafeData[(unsigned int) s & ZT_BUF_MEM_MASK] = n; + unsafeData[(unsigned int)s & ZT_BUF_MEM_MASK] = n; } /** @@ -659,7 +659,7 @@ public: */ ZT_INLINE void wI16(int &ii, const uint16_t n) noexcept { - const unsigned int s = ((unsigned int) ii) & ZT_BUF_MEM_MASK; + const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; ii += 2; #ifdef ZT_NO_UNALIGNED_ACCESS unsafeData[s] = (uint8_t)(n >> 8U); @@ -677,7 +677,7 @@ public: */ ZT_INLINE void wI32(int &ii, const uint32_t n) noexcept { - const unsigned int s = ((unsigned int) ii) & ZT_BUF_MEM_MASK; + const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; ii += 4; #ifdef ZT_NO_UNALIGNED_ACCESS unsafeData[s] = (uint8_t)(n >> 24U); @@ -697,7 +697,7 @@ public: */ ZT_INLINE void wI64(int &ii, const uint64_t n) noexcept { - const unsigned int s = ((unsigned int) ii) & ZT_BUF_MEM_MASK; + const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; ii += 8; #ifdef ZT_NO_UNALIGNED_ACCESS unsafeData[s] = (uint8_t)(n >> 56U); @@ -720,7 +720,7 @@ public: * @param ii Index value-result parameter (incremented by size of object) * @param t Object to write */ - template + template< typename T > ZT_INLINE void wO(int &ii, T &t) noexcept { const int s = ii; @@ -745,7 +745,7 @@ public: char c; do { c = *(s++); - wI8(ii, (uint8_t) c); + wI8(ii, (uint8_t)c); } while (c); } else { wI8(ii, 0); @@ -762,7 +762,7 @@ public: ZT_INLINE void wB(int &ii, const void *const bytes, const unsigned int len) noexcept { const int s = ii; - if (likely((ii += (int) len) <= ZT_BUF_MEM_SIZE)) + if (likely((ii += (int)len) <= ZT_BUF_MEM_SIZE)) Utils::copy(unsafeData + s, bytes, len); } @@ -775,7 +775,7 @@ public: ZT_INLINE void wZ(int &ii, const unsigned int len) noexcept { const int s = ii; - if (likely((ii += (int) len) <= ZT_BUF_MEM_SIZE)) + if (likely((ii += (int)len) <= ZT_BUF_MEM_SIZE)) Utils::zero(unsafeData + s, len); } @@ -788,7 +788,7 @@ public: ZT_INLINE void wR(int &ii, const unsigned int len) noexcept { const int s = ii; - if (likely((ii += (int) len) <= ZT_BUF_MEM_SIZE)) + if (likely((ii += (int)len) <= ZT_BUF_MEM_SIZE)) Utils::getSecureRandom(unsafeData + s, len); } @@ -797,7 +797,7 @@ public: */ ZT_INLINE void sI8(const int ii, const uint8_t n) noexcept { - unsafeData[(unsigned int) ii & ZT_BUF_MEM_MASK] = n; + unsafeData[(unsigned int)ii & ZT_BUF_MEM_MASK] = n; } /** @@ -805,7 +805,7 @@ public: */ ZT_INLINE void sI16(const int ii, const uint16_t n) noexcept { - const unsigned int s = ((unsigned int) ii) & ZT_BUF_MEM_MASK; + const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS unsafeData[s] = (uint8_t)(n >> 8U); unsafeData[s + 1] = (uint8_t)n; @@ -819,7 +819,7 @@ public: */ ZT_INLINE void sI32(const int ii, const uint32_t n) noexcept { - const unsigned int s = ((unsigned int) ii) & ZT_BUF_MEM_MASK; + const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS unsafeData[s] = (uint8_t)(n >> 24U); unsafeData[s + 1] = (uint8_t)(n >> 16U); @@ -835,7 +835,7 @@ public: */ ZT_INLINE void sI64(const int ii, const uint64_t n) noexcept { - const unsigned int s = ((unsigned int) ii) & ZT_BUF_MEM_MASK; + const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS unsafeData[s] = (uint8_t)(n >> 56U); unsafeData[s + 1] = (uint8_t)(n >> 48U); @@ -858,10 +858,10 @@ public: private: // Next item in free buffer pool linked list if Buf is placed in pool, undefined and unused otherwise - std::atomic __nextInPool; + std::atomic< uintptr_t > __nextInPool; // Reference counter for SharedPtr<> - std::atomic __refCount; + std::atomic< int > __refCount; }; } // namespace ZeroTier diff --git a/node/Constants.hpp b/node/Constants.hpp index 28cb1e633..a7d3fd58d 100644 --- a/node/Constants.hpp +++ b/node/Constants.hpp @@ -29,7 +29,11 @@ /** * Version bit packed into four 16-bit fields in a 64-bit unsigned integer. */ -#define ZT_VERSION_PACKED ( ((uint64_t)ZEROTIER_VERSION_MAJOR << 48U) | ((uint64_t)ZEROTIER_VERSION_MINOR << 32U) | ((uint64_t)ZEROTIER_VERSION_REVISION << 16U) | (uint64_t)ZEROTIER_VERSION_BUILD ) +#define ZT_VERSION_PACKED ( \ + ((uint64_t)ZEROTIER_VERSION_MAJOR << 48U) | \ + ((uint64_t)ZEROTIER_VERSION_MINOR << 32U) | \ + ((uint64_t)ZEROTIER_VERSION_REVISION << 16U) | \ + (uint64_t)ZEROTIER_VERSION_BUILD ) /** * Length of a ZeroTier address in bytes