2
0

NetworkConfig.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. /*
  2. * Copyright (c)2013-2020 ZeroTier, Inc.
  3. *
  4. * Use of this software is governed by the Business Source License included
  5. * in the LICENSE.TXT file in the project's root directory.
  6. *
  7. * Change Date: 2024-01-01
  8. *
  9. * On the date above, in accordance with the Business Source License, use
  10. * of this software will be governed by version 2.0 of the Apache License.
  11. */
  12. /****/
  13. #ifndef ZT_NETWORKCONFIG_HPP
  14. #define ZT_NETWORKCONFIG_HPP
  15. #include <cstdint>
  16. #include <cstring>
  17. #include <cstdlib>
  18. #include <vector>
  19. #include <stdexcept>
  20. #include <algorithm>
  21. #include "Constants.hpp"
  22. #include "InetAddress.hpp"
  23. #include "MulticastGroup.hpp"
  24. #include "Address.hpp"
  25. #include "CertificateOfMembership.hpp"
  26. #include "CertificateOfOwnership.hpp"
  27. #include "Capability.hpp"
  28. #include "Tag.hpp"
  29. #include "Dictionary.hpp"
  30. #include "Hashtable.hpp"
  31. #include "Identity.hpp"
  32. #include "Utils.hpp"
  33. #include "Trace.hpp"
  34. namespace ZeroTier {
  35. /**
  36. * Default maximum time delta for COMs, tags, and capabilities
  37. *
  38. * The current value is two hours, providing ample time for a controller to
  39. * experience fail-over, etc.
  40. */
  41. #define ZT_NETWORKCONFIG_DEFAULT_CREDENTIAL_TIME_MAX_MAX_DELTA 7200000ULL
  42. /**
  43. * Default minimum credential TTL and maxDelta for COM timestamps
  44. *
  45. * This is just slightly over three minutes and provides three retries for
  46. * all currently online members to refresh.
  47. */
  48. #define ZT_NETWORKCONFIG_DEFAULT_CREDENTIAL_TIME_MIN_MAX_DELTA 185000ULL
  49. /**
  50. * Flag: enable broadcast
  51. */
  52. #define ZT_NETWORKCONFIG_FLAG_ENABLE_BROADCAST 0x0000000000000002ULL
  53. /**
  54. * Flag: enable IPv6 NDP emulation for certain V6 address patterns
  55. */
  56. #define ZT_NETWORKCONFIG_FLAG_ENABLE_IPV6_NDP_EMULATION 0x0000000000000004ULL
  57. /**
  58. * Flag: result of unrecognized MATCH entries in a rules table: match if set, no-match if clear
  59. */
  60. #define ZT_NETWORKCONFIG_FLAG_RULES_RESULT_OF_UNSUPPORTED_MATCH 0x0000000000000008ULL
  61. /**
  62. * Device can bridge to other Ethernet networks and gets unknown recipient multicasts
  63. */
  64. #define ZT_NETWORKCONFIG_SPECIALIST_TYPE_ACTIVE_BRIDGE 0x0000020000000000ULL
  65. /**
  66. * Device that replicates multicasts
  67. */
  68. #define ZT_NETWORKCONFIG_SPECIALIST_TYPE_MULTICAST_REPLICATOR 0x0000040000000000ULL
  69. /**
  70. * Device that is allowed to remotely debug connectivity on this network
  71. */
  72. #define ZT_NETWORKCONFIG_SPECIALIST_TYPE_DIAGNOSTICIAN 0x0000080000000000ULL
  73. // Dictionary capacity needed for max size network config
  74. #define ZT_NETWORKCONFIG_DICT_CAPACITY (1024 + (sizeof(ZT_VirtualNetworkRule) * ZT_MAX_NETWORK_RULES) + (sizeof(Capability) * ZT_MAX_NETWORK_CAPABILITIES) + (sizeof(Tag) * ZT_MAX_NETWORK_TAGS) + (sizeof(CertificateOfOwnership) * ZT_MAX_CERTIFICATES_OF_OWNERSHIP))
  75. // Dictionary capacity needed for max size network meta-data
  76. #define ZT_NETWORKCONFIG_METADATA_DICT_CAPACITY 8192
  77. // Fields for meta-data sent with network config requests
  78. // Protocol version (see Packet.hpp)
  79. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_PROTOCOL_VERSION "pv"
  80. // Software vendor
  81. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_VENDOR "vend"
  82. // Software major version
  83. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_MAJOR_VERSION "majv"
  84. // Software minor version
  85. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_MINOR_VERSION "minv"
  86. // Software revision
  87. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_REVISION "revv"
  88. // Rules engine revision
  89. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_RULES_ENGINE_REV "revr"
  90. // Maximum number of rules per network this node can accept
  91. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_MAX_NETWORK_RULES "mr"
  92. // Maximum number of capabilities this node can accept
  93. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_MAX_NETWORK_CAPABILITIES "mc"
  94. // Maximum number of rules per capability this node can accept
  95. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_MAX_CAPABILITY_RULES "mcr"
  96. // Maximum number of tags this node can accept
  97. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_MAX_NETWORK_TAGS "mt"
  98. // Network join authorization token (if any)
  99. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_AUTH "a"
  100. // Network configuration meta-data flags
  101. #define ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_FLAGS "f"
  102. // These dictionary keys are short so they don't take up much room.
  103. // By convention we use upper case for binary blobs, but it doesn't really matter.
  104. // network config version
  105. #define ZT_NETWORKCONFIG_DICT_KEY_VERSION "v"
  106. // network ID
  107. #define ZT_NETWORKCONFIG_DICT_KEY_NETWORK_ID "nwid"
  108. // integer(hex)
  109. #define ZT_NETWORKCONFIG_DICT_KEY_TIMESTAMP "ts"
  110. // integer(hex)
  111. #define ZT_NETWORKCONFIG_DICT_KEY_REVISION "r"
  112. // address of member
  113. #define ZT_NETWORKCONFIG_DICT_KEY_ISSUED_TO "id"
  114. // flags(hex)
  115. #define ZT_NETWORKCONFIG_DICT_KEY_FLAGS "f"
  116. // integer(hex)
  117. #define ZT_NETWORKCONFIG_DICT_KEY_MULTICAST_LIMIT "ml"
  118. // network type (hex)
  119. #define ZT_NETWORKCONFIG_DICT_KEY_TYPE "t"
  120. // text
  121. #define ZT_NETWORKCONFIG_DICT_KEY_NAME "n"
  122. // network MTU
  123. #define ZT_NETWORKCONFIG_DICT_KEY_MTU "mtu"
  124. // credential time max delta in ms
  125. #define ZT_NETWORKCONFIG_DICT_KEY_CREDENTIAL_TIME_MAX_DELTA "ctmd"
  126. // binary serialized certificate of membership
  127. #define ZT_NETWORKCONFIG_DICT_KEY_COM "C"
  128. // specialists (binary array of uint64_t)
  129. #define ZT_NETWORKCONFIG_DICT_KEY_SPECIALISTS "S"
  130. // routes (binary blob)
  131. #define ZT_NETWORKCONFIG_DICT_KEY_ROUTES "RT"
  132. // static IPs (binary blob)
  133. #define ZT_NETWORKCONFIG_DICT_KEY_STATIC_IPS "I"
  134. // rules (binary blob)
  135. #define ZT_NETWORKCONFIG_DICT_KEY_RULES "R"
  136. // capabilities (binary blobs)
  137. #define ZT_NETWORKCONFIG_DICT_KEY_CAPABILITIES "CAP"
  138. // tags (binary blobs)
  139. #define ZT_NETWORKCONFIG_DICT_KEY_TAGS "TAG"
  140. // tags (binary blobs)
  141. #define ZT_NETWORKCONFIG_DICT_KEY_CERTIFICATES_OF_OWNERSHIP "COO"
  142. /**
  143. * Network configuration received from network controller nodes
  144. *
  145. * This is a memcpy()'able structure and is safe (in a crash sense) to modify
  146. * without locks.
  147. */
  148. struct NetworkConfig
  149. {
  150. NetworkConfig();
  151. /**
  152. * Write this network config to a dictionary for transport
  153. *
  154. * @param d Dictionary
  155. * @param includeLegacy If true, include legacy fields for old node versions
  156. * @return True if dictionary was successfully created, false if e.g. overflow
  157. */
  158. bool toDictionary(Dictionary &d,bool includeLegacy) const;
  159. /**
  160. * Read this network config from a dictionary
  161. *
  162. * @param d Dictionary (non-const since it might be modified during parse, should not be used after call)
  163. * @return True if dictionary was valid and network config successfully initialized
  164. */
  165. bool fromDictionary(const Dictionary &d);
  166. /**
  167. * @return True if broadcast (ff:ff:ff:ff:ff:ff) address should work on this network
  168. */
  169. ZT_ALWAYS_INLINE bool enableBroadcast() const { return ((this->flags & ZT_NETWORKCONFIG_FLAG_ENABLE_BROADCAST) != 0); }
  170. /**
  171. * @return True if IPv6 NDP emulation should be allowed for certain "magic" IPv6 address patterns
  172. */
  173. ZT_ALWAYS_INLINE bool ndpEmulation() const { return ((this->flags & ZT_NETWORKCONFIG_FLAG_ENABLE_IPV6_NDP_EMULATION) != 0); }
  174. /**
  175. * @return Network type is public (no access control)
  176. */
  177. ZT_ALWAYS_INLINE bool isPublic() const { return (this->type == ZT_NETWORK_TYPE_PUBLIC); }
  178. /**
  179. * @return Network type is private (certificate access control)
  180. */
  181. ZT_ALWAYS_INLINE bool isPrivate() const { return (this->type == ZT_NETWORK_TYPE_PRIVATE); }
  182. /**
  183. * @param fromPeer Peer attempting to bridge other Ethernet peers onto network
  184. * @return True if this network allows bridging
  185. */
  186. ZT_ALWAYS_INLINE bool permitsBridging(const Address &fromPeer) const
  187. {
  188. for(unsigned int i=0;i<specialistCount;++i) {
  189. if ((fromPeer == specialists[i])&&((specialists[i] & ZT_NETWORKCONFIG_SPECIALIST_TYPE_ACTIVE_BRIDGE) != 0))
  190. return true;
  191. }
  192. return false;
  193. }
  194. ZT_ALWAYS_INLINE operator bool() const { return (networkId != 0); }
  195. ZT_ALWAYS_INLINE bool operator==(const NetworkConfig &nc) const { return (memcmp(this,&nc,sizeof(NetworkConfig)) == 0); }
  196. ZT_ALWAYS_INLINE bool operator!=(const NetworkConfig &nc) const { return (!(*this == nc)); }
  197. /**
  198. * Add a specialist or mask flags if already present
  199. *
  200. * This masks the existing flags if the specialist is already here or adds
  201. * it otherwise.
  202. *
  203. * @param a Address of specialist
  204. * @param f Flags (OR of specialist role/type flags)
  205. * @return True if successfully masked or added
  206. */
  207. bool addSpecialist(const Address &a,const uint64_t f);
  208. ZT_ALWAYS_INLINE const Capability *capability(const uint32_t id) const
  209. {
  210. for(unsigned int i=0;i<capabilityCount;++i) {
  211. if (capabilities[i].id() == id)
  212. return &(capabilities[i]);
  213. }
  214. return (Capability *)0;
  215. }
  216. ZT_ALWAYS_INLINE const Tag *tag(const uint32_t id) const
  217. {
  218. for(unsigned int i=0;i<tagCount;++i) {
  219. if (tags[i].id() == id)
  220. return &(tags[i]);
  221. }
  222. return (Tag *)0;
  223. }
  224. /**
  225. * Network ID that this configuration applies to
  226. */
  227. uint64_t networkId;
  228. /**
  229. * Controller-side time of config generation/issue
  230. */
  231. int64_t timestamp;
  232. /**
  233. * Max difference between timestamp and tag/capability timestamp
  234. */
  235. int64_t credentialTimeMaxDelta;
  236. /**
  237. * Controller-side revision counter for this configuration
  238. */
  239. uint64_t revision;
  240. /**
  241. * Address of device to which this config is issued
  242. */
  243. Address issuedTo;
  244. /**
  245. * Flags (64-bit)
  246. */
  247. uint64_t flags;
  248. /**
  249. * Network MTU
  250. */
  251. unsigned int mtu;
  252. /**
  253. * Maximum number of recipients per multicast (not including active bridges)
  254. */
  255. unsigned int multicastLimit;
  256. /**
  257. * Number of specialists
  258. */
  259. unsigned int specialistCount;
  260. /**
  261. * Number of routes
  262. */
  263. unsigned int routeCount;
  264. /**
  265. * Number of ZT-managed static IP assignments
  266. */
  267. unsigned int staticIpCount;
  268. /**
  269. * Number of rule table entries
  270. */
  271. unsigned int ruleCount;
  272. /**
  273. * Number of capabilities
  274. */
  275. unsigned int capabilityCount;
  276. /**
  277. * Number of tags
  278. */
  279. unsigned int tagCount;
  280. /**
  281. * Number of certificates of ownership
  282. */
  283. unsigned int certificateOfOwnershipCount;
  284. /**
  285. * Specialist devices
  286. *
  287. * For each entry the least significant 40 bits are the device's ZeroTier
  288. * address and the most significant 24 bits are flags indicating its role.
  289. */
  290. uint64_t specialists[ZT_MAX_NETWORK_SPECIALISTS];
  291. /**
  292. * Statically defined "pushed" routes (including default gateways)
  293. */
  294. ZT_VirtualNetworkRoute routes[ZT_MAX_NETWORK_ROUTES];
  295. /**
  296. * Static IP assignments
  297. */
  298. InetAddress staticIps[ZT_MAX_ZT_ASSIGNED_ADDRESSES];
  299. /**
  300. * Base network rules
  301. */
  302. ZT_VirtualNetworkRule rules[ZT_MAX_NETWORK_RULES];
  303. /**
  304. * Capabilities for this node on this network, in ascending order of capability ID
  305. */
  306. Capability capabilities[ZT_MAX_NETWORK_CAPABILITIES];
  307. /**
  308. * Tags for this node on this network, in ascending order of tag ID
  309. */
  310. Tag tags[ZT_MAX_NETWORK_TAGS];
  311. /**
  312. * Certificates of ownership for this network member
  313. */
  314. CertificateOfOwnership certificatesOfOwnership[ZT_MAX_CERTIFICATES_OF_OWNERSHIP];
  315. /**
  316. * Network type (currently just public or private)
  317. */
  318. ZT_VirtualNetworkType type;
  319. /**
  320. * Network short name or empty string if not defined
  321. */
  322. char name[ZT_MAX_NETWORK_SHORT_NAME_LENGTH + 1];
  323. /**
  324. * Certificate of membership (for private networks)
  325. */
  326. CertificateOfMembership com;
  327. };
  328. } // namespace ZeroTier
  329. #endif