Trace.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. /*
  2. * ZeroTier One - Network Virtualization Everywhere
  3. * Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. * --
  19. *
  20. * You can be released from the requirements of the license by purchasing
  21. * a commercial license. Buying such a license is mandatory as soon as you
  22. * develop commercial closed-source software that incorporates or links
  23. * directly against ZeroTier software without disclosing the source code
  24. * of your own application.
  25. */
  26. #include "Trace.hpp"
  27. #include "RuntimeEnvironment.hpp"
  28. #include "Switch.hpp"
  29. #include "Node.hpp"
  30. #include "Utils.hpp"
  31. #include "Dictionary.hpp"
  32. #include "CertificateOfMembership.hpp"
  33. #include "CertificateOfOwnership.hpp"
  34. #include "CertificateOfRepresentation.hpp"
  35. #include "Tag.hpp"
  36. #include "Capability.hpp"
  37. #include "Revocation.hpp"
  38. namespace ZeroTier {
  39. // Defining ZT_TRACE causes debug tracing messages to be dumped to stderr
  40. #ifdef ZT_TRACE
  41. static const char *packetVerbString(Packet::Verb v)
  42. {
  43. switch(v) {
  44. case Packet::VERB_NOP: return "NOP";
  45. case Packet::VERB_HELLO: return "HELLO";
  46. case Packet::VERB_ERROR: return "ERROR";
  47. case Packet::VERB_OK: return "OK";
  48. case Packet::VERB_WHOIS: return "WHOIS";
  49. case Packet::VERB_RENDEZVOUS: return "RENDEZVOUS";
  50. case Packet::VERB_FRAME: return "FRAME";
  51. case Packet::VERB_EXT_FRAME: return "EXT_FRAME";
  52. case Packet::VERB_ECHO: return "ECHO";
  53. case Packet::VERB_MULTICAST_LIKE: return "MULTICAST_LIKE";
  54. case Packet::VERB_NETWORK_CREDENTIALS: return "NETWORK_CREDENTIALS";
  55. case Packet::VERB_NETWORK_CONFIG_REQUEST: return "NETWORK_CONFIG_REQUEST";
  56. case Packet::VERB_NETWORK_CONFIG: return "NETWORK_CONFIG";
  57. case Packet::VERB_MULTICAST_GATHER: return "MULTICAST_GATHER";
  58. case Packet::VERB_MULTICAST_FRAME: return "MULTICAST_FRAME";
  59. case Packet::VERB_PUSH_DIRECT_PATHS: return "PUSH_DIRECT_PATHS";
  60. case Packet::VERB_USER_MESSAGE: return "USER_MESSAGE";
  61. case Packet::VERB_REMOTE_TRACE: return "REMOTE_TRACE";
  62. }
  63. return "(unknown)";
  64. }
  65. static const char *packetErrorString(Packet::ErrorCode e)
  66. {
  67. switch(e) {
  68. case Packet::ERROR_NONE: return "NONE";
  69. case Packet::ERROR_INVALID_REQUEST: return "INVALID_REQUEST";
  70. case Packet::ERROR_BAD_PROTOCOL_VERSION: return "BAD_PROTOCOL_VERSION";
  71. case Packet::ERROR_OBJ_NOT_FOUND: return "OBJECT_NOT_FOUND";
  72. case Packet::ERROR_IDENTITY_COLLISION: return "IDENTITY_COLLISION";
  73. case Packet::ERROR_UNSUPPORTED_OPERATION: return "UNSUPPORTED_OPERATION";
  74. case Packet::ERROR_NEED_MEMBERSHIP_CERTIFICATE: return "NEED_MEMBERSHIP_CERTIFICATE";
  75. case Packet::ERROR_NETWORK_ACCESS_DENIED_: return "NETWORK_ACCESS_DENIED";
  76. case Packet::ERROR_UNWANTED_MULTICAST: return "UNWANTED_MULTICAST";
  77. }
  78. return "(unknown)";
  79. }
  80. #define TRprintf(f,...) { fprintf(stderr,(f),__VA_ARGS__); fflush(stderr); }
  81. #else
  82. #define TRprintf(f,...)
  83. #endif // ZT_TRACE
  84. #define ZT_REMOTE_TRACE_FIELD__EVENT "E"
  85. #define ZT_REMOTE_TRACE_FIELD__PACKET_ID "pid"
  86. #define ZT_REMOTE_TRACE_FIELD__PACKET_VERB "pv"
  87. #define ZT_REMOTE_TRACE_FIELD__PACKET_TRUSTED_PATH_ID "ptpid"
  88. #define ZT_REMOTE_TRACE_FIELD__PACKET_TRUSTED_PATH_APPROVED "ptpok"
  89. #define ZT_REMOTE_TRACE_FIELD__PACKET_HOPS "phops"
  90. #define ZT_REMOTE_TRACE_FIELD__OLD_REMOTE_PHYADDR "oldrphy"
  91. #define ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR "rzt"
  92. #define ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR "rphy"
  93. #define ZT_REMOTE_TRACE_FIELD__LOCAL_ZTADDR "lzt"
  94. #define ZT_REMOTE_TRACE_FIELD__LOCAL_PHYADDR "lphy"
  95. #define ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET "ls"
  96. #define ZT_REMOTE_TRACE_FIELD__IP_SCOPE "ipsc"
  97. #define ZT_REMOTE_TRACE_FIELD__NETWORK_ID "nwid"
  98. #define ZT_REMOTE_TRACE_FIELD__SOURCE_MAC "seth"
  99. #define ZT_REMOTE_TRACE_FIELD__DEST_MAC "deth"
  100. #define ZT_REMOTE_TRACE_FIELD__ETHERTYPE "et"
  101. #define ZT_REMOTE_TRACE_FIELD__VLAN_ID "vlan"
  102. #define ZT_REMOTE_TRACE_FIELD__FRAME_LENGTH "fl"
  103. #define ZT_REMOTE_TRACE_FIELD__FRAME_DATA "fd"
  104. #define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE "credtype"
  105. #define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID "credid"
  106. #define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP "credts"
  107. #define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_INFO "credinfo"
  108. #define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO "crediss"
  109. #define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_REVOCATION_TARGET "credRt"
  110. #define ZT_REMOTE_TRACE_FIELD__REASON "reason"
  111. #define ZT_REMOTE_TRACE_EVENT__RESETTING_PATHS_IN_SCOPE_S "1000"
  112. #define ZT_REMOTE_TRACE_EVENT__TX_TIMED_OUT_S "1001"
  113. #define ZT_REMOTE_TRACE_EVENT__PEER_CONFIRMING_UNKNOWN_PATH_S "1002"
  114. #define ZT_REMOTE_TRACE_EVENT__PEER_LEARNED_NEW_PATH_S "1003"
  115. #define ZT_REMOTE_TRACE_EVENT__PEER_REDIRECTED_S "1004"
  116. #define ZT_REMOTE_TRACE_EVENT__PACKET_MAC_FAILURE_S "1005"
  117. #define ZT_REMOTE_TRACE_EVENT__PACKET_INVALID_S "1006"
  118. #define ZT_REMOTE_TRACE_EVENT__DROPPED_HELLO_S "1006"
  119. #define ZT_REMOTE_TRACE_EVENT__OUTGOING_NETWORK_FRAME_DROPPED_S "2000"
  120. #define ZT_REMOTE_TRACE_EVENT__INCOMING_NETWORK_ACCESS_DENIED_S "2001"
  121. #define ZT_REMOTE_TRACE_EVENT__INCOMING_NETWORK_FRAME_DROPPED_S "2002"
  122. #define ZT_REMOTE_TRACE_EVENT__CREDENTIAL_REJECTED_S "2003"
  123. #define ZT_REMOTE_TRACE_EVENT__CREDENTIAL_ACCEPTED_S "2004"
  124. void Trace::resettingPathsInScope(void *const tPtr,const Address &reporter,const InetAddress &reporterPhysicalAddress,const InetAddress &myPhysicalAddress,const InetAddress::IpScope scope)
  125. {
  126. char tmp[128];
  127. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  128. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__RESETTING_PATHS_IN_SCOPE_S);
  129. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,reporter);
  130. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR,reporterPhysicalAddress.toString(tmp));
  131. d.add(ZT_REMOTE_TRACE_FIELD__LOCAL_PHYADDR,myPhysicalAddress.toString(tmp));
  132. d.add(ZT_REMOTE_TRACE_FIELD__IP_SCOPE,(uint64_t)scope);
  133. _send(tPtr,d,0);
  134. }
  135. void Trace::txTimedOut(void *const tPtr,const Address &destination)
  136. {
  137. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  138. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__TX_TIMED_OUT_S);
  139. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,destination);
  140. _send(tPtr,d,0);
  141. }
  142. void Trace::peerConfirmingUnknownPath(void *const tPtr,const uint64_t networkId,Peer &peer,const SharedPtr<Path> &path,const uint64_t packetId,const Packet::Verb verb)
  143. {
  144. char tmp[128];
  145. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  146. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__PEER_CONFIRMING_UNKNOWN_PATH_S);
  147. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_ID,packetId);
  148. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_VERB,(uint64_t)verb);
  149. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,networkId);
  150. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,peer.address());
  151. if (path) {
  152. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR,path->address().toString(tmp));
  153. d.add(ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET,path->localSocket());
  154. }
  155. _send(tPtr,d,networkId);
  156. }
  157. void Trace::peerLearnedNewPath(void *const tPtr,const uint64_t networkId,Peer &peer,const SharedPtr<Path> &oldPath,const SharedPtr<Path> &newPath,const uint64_t packetId)
  158. {
  159. char tmp[128];
  160. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  161. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__PEER_LEARNED_NEW_PATH_S);
  162. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_ID,packetId);
  163. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,networkId);
  164. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,peer.address());
  165. if (oldPath) {
  166. d.add(ZT_REMOTE_TRACE_FIELD__OLD_REMOTE_PHYADDR,oldPath->address().toString(tmp));
  167. }
  168. if (newPath) {
  169. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR,newPath->address().toString(tmp));
  170. d.add(ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET,newPath->localSocket());
  171. }
  172. _send(tPtr,d,networkId);
  173. }
  174. void Trace::peerRedirected(void *const tPtr,const uint64_t networkId,Peer &peer,const SharedPtr<Path> &oldPath,const SharedPtr<Path> &newPath)
  175. {
  176. char tmp[128];
  177. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  178. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__PEER_REDIRECTED_S);
  179. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,networkId);
  180. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,peer.address());
  181. if (oldPath) {
  182. d.add(ZT_REMOTE_TRACE_FIELD__OLD_REMOTE_PHYADDR,oldPath->address().toString(tmp));
  183. }
  184. if (newPath) {
  185. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR,newPath->address().toString(tmp));
  186. d.add(ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET,newPath->localSocket());
  187. }
  188. _send(tPtr,d,networkId);
  189. }
  190. void Trace::outgoingNetworkFrameDropped(void *const tPtr,const SharedPtr<Network> &network,const MAC &sourceMac,const MAC &destMac,const unsigned int etherType,const unsigned int vlanId,const unsigned int frameLen,const char *reason)
  191. {
  192. if (!network) return; // sanity check
  193. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  194. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__OUTGOING_NETWORK_FRAME_DROPPED_S);
  195. d.add(ZT_REMOTE_TRACE_FIELD__SOURCE_MAC,sourceMac.toInt());
  196. d.add(ZT_REMOTE_TRACE_FIELD__DEST_MAC,destMac.toInt());
  197. d.add(ZT_REMOTE_TRACE_FIELD__ETHERTYPE,(uint64_t)etherType);
  198. d.add(ZT_REMOTE_TRACE_FIELD__VLAN_ID,(uint64_t)vlanId);
  199. d.add(ZT_REMOTE_TRACE_FIELD__FRAME_LENGTH,(uint64_t)frameLen);
  200. if (reason)
  201. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  202. _send(tPtr,d,network);
  203. }
  204. void Trace::incomingNetworkAccessDenied(void *const tPtr,const SharedPtr<Network> &network,const SharedPtr<Path> &path,const uint64_t packetId,const unsigned int packetLength,const Address &source,const Packet::Verb verb,bool credentialsRequested)
  205. {
  206. if (!network) return; // sanity check
  207. char tmp[128];
  208. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  209. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__INCOMING_NETWORK_ACCESS_DENIED_S);
  210. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_ID,packetId);
  211. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_VERB,(uint64_t)verb);
  212. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,network->id());
  213. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,source);
  214. if (path) {
  215. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR,path->address().toString(tmp));
  216. d.add(ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET,path->localSocket());
  217. }
  218. }
  219. void Trace::incomingNetworkFrameDropped(void *const tPtr,const SharedPtr<Network> &network,const SharedPtr<Path> &path,const uint64_t packetId,const unsigned int packetLength,const Address &source,const Packet::Verb verb,const MAC &sourceMac,const MAC &destMac)
  220. {
  221. //Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  222. //d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__INCOMING_NETWORK_FRAME_DROPPED_S);
  223. }
  224. void Trace::incomingPacketTrustedPath(void *const tPtr,const SharedPtr<Path> &path,const uint64_t packetId,const Address &source,const uint64_t trustedPathId,bool approved)
  225. {
  226. // TODO
  227. }
  228. void Trace::incomingPacketMessageAuthenticationFailure(void *const tPtr,const SharedPtr<Path> &path,const uint64_t packetId,const Address &source,const unsigned int hops)
  229. {
  230. char tmp[128];
  231. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  232. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__PACKET_MAC_FAILURE_S);
  233. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_ID,packetId);
  234. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_HOPS,(uint64_t)hops);
  235. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,source);
  236. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR,path->address().toString(tmp));
  237. d.add(ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET,path->localSocket());
  238. _send(tPtr,d,0);
  239. }
  240. void Trace::incomingPacketInvalid(void *const tPtr,const SharedPtr<Path> &path,const uint64_t packetId,const Address &source,const unsigned int hops,const Packet::Verb verb,const char *reason)
  241. {
  242. char tmp[128];
  243. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  244. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__PACKET_INVALID_S);
  245. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_ID,packetId);
  246. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_VERB,(uint64_t)verb);
  247. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,source);
  248. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR,path->address().toString(tmp));
  249. d.add(ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET,path->localSocket());
  250. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_HOPS,(uint64_t)hops);
  251. if (reason)
  252. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  253. _send(tPtr,d,0);
  254. }
  255. void Trace::incomingPacketDroppedHELLO(void *const tPtr,const SharedPtr<Path> &path,const uint64_t packetId,const Address &source,const char *reason)
  256. {
  257. char tmp[128];
  258. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  259. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__PACKET_INVALID_S);
  260. d.add(ZT_REMOTE_TRACE_FIELD__PACKET_ID,packetId);
  261. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR,source);
  262. d.add(ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR,path->address().toString(tmp));
  263. d.add(ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET,path->localSocket());
  264. if (reason)
  265. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  266. _send(tPtr,d,0);
  267. }
  268. void Trace::networkConfigRequestSent(void *const tPtr,const Network &network,const Address &controller)
  269. {
  270. }
  271. void Trace::networkFilter(
  272. void *const tPtr,
  273. const Network &network,
  274. const RuleResultLog &primaryRuleSetLog,
  275. const RuleResultLog *const matchingCapabilityRuleSetLog,
  276. const Capability *const matchingCapability,
  277. const Address &ztSource,
  278. const Address &ztDest,
  279. const MAC &macSource,
  280. const MAC &macDest,
  281. const uint8_t *const frameData,
  282. const unsigned int frameLen,
  283. const unsigned int etherType,
  284. const unsigned int vlanId,
  285. const bool noTee,
  286. const bool inbound,
  287. const int accept)
  288. {
  289. //char tmp[128];
  290. //Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  291. //_send(tPtr,d,network.id());
  292. }
  293. void Trace::credentialRejected(void *const tPtr,const CertificateOfMembership &c,const char *reason)
  294. {
  295. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  296. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_REJECTED_S);
  297. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  298. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  299. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  300. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  301. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
  302. if (reason)
  303. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  304. }
  305. void Trace::credentialRejected(void *const tPtr,const CertificateOfOwnership &c,const char *reason)
  306. {
  307. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  308. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_REJECTED_S);
  309. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  310. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  311. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  312. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  313. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
  314. if (reason)
  315. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  316. }
  317. void Trace::credentialRejected(void *const tPtr,const CertificateOfRepresentation &c,const char *reason)
  318. {
  319. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  320. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_REJECTED_S);
  321. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  322. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  323. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  324. if (reason)
  325. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  326. }
  327. void Trace::credentialRejected(void *const tPtr,const Capability &c,const char *reason)
  328. {
  329. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  330. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_REJECTED_S);
  331. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  332. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  333. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  334. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  335. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
  336. if (reason)
  337. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  338. }
  339. void Trace::credentialRejected(void *const tPtr,const Tag &c,const char *reason)
  340. {
  341. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  342. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_REJECTED_S);
  343. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  344. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  345. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  346. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  347. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
  348. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_INFO,(uint64_t)c.value());
  349. if (reason)
  350. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  351. }
  352. void Trace::credentialRejected(void *const tPtr,const Revocation &c,const char *reason)
  353. {
  354. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  355. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_REJECTED_S);
  356. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  357. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  358. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  359. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_REVOCATION_TARGET,c.target());
  360. if (reason)
  361. d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
  362. }
  363. void Trace::credentialAccepted(void *const tPtr,const CertificateOfMembership &c)
  364. {
  365. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  366. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_ACCEPTED_S);
  367. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  368. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  369. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  370. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  371. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
  372. }
  373. void Trace::credentialAccepted(void *const tPtr,const CertificateOfOwnership &c)
  374. {
  375. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  376. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_ACCEPTED_S);
  377. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  378. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  379. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  380. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  381. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
  382. }
  383. void Trace::credentialAccepted(void *const tPtr,const CertificateOfRepresentation &c)
  384. {
  385. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  386. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_ACCEPTED_S);
  387. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  388. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  389. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  390. }
  391. void Trace::credentialAccepted(void *const tPtr,const Capability &c)
  392. {
  393. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  394. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_ACCEPTED_S);
  395. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  396. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  397. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  398. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  399. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
  400. }
  401. void Trace::credentialAccepted(void *const tPtr,const Tag &c)
  402. {
  403. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  404. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_ACCEPTED_S);
  405. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  406. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  407. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  408. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
  409. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
  410. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_INFO,(uint64_t)c.value());
  411. }
  412. void Trace::credentialAccepted(void *const tPtr,const Revocation &c)
  413. {
  414. Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> d;
  415. d.add(ZT_REMOTE_TRACE_FIELD__EVENT,ZT_REMOTE_TRACE_EVENT__CREDENTIAL_ACCEPTED_S);
  416. d.add(ZT_REMOTE_TRACE_FIELD__NETWORK_ID,c.networkId());
  417. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
  418. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
  419. d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_REVOCATION_TARGET,c.target());
  420. }
  421. void Trace::_send(void *const tPtr,const Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> &d)
  422. {
  423. const Address rtt(RR->node->remoteTraceTarget());
  424. if (rtt) {
  425. Packet outp(rtt,RR->identity.address(),Packet::VERB_REMOTE_TRACE);
  426. outp.appendCString(d.data());
  427. outp.compress();
  428. RR->sw->send(tPtr,outp,true);
  429. }
  430. }
  431. void Trace::_send(void *const tPtr,const Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> &d,const uint64_t networkId)
  432. {
  433. _send(tPtr,d);
  434. if (networkId) {
  435. const SharedPtr<Network> network(RR->node->network(networkId));
  436. if ((network)&&(network->config().remoteTraceTarget)) {
  437. Packet outp(network->config().remoteTraceTarget,RR->identity.address(),Packet::VERB_REMOTE_TRACE);
  438. outp.appendCString(d.data());
  439. outp.compress();
  440. RR->sw->send(tPtr,outp,true);
  441. }
  442. }
  443. }
  444. void Trace::_send(void *const tPtr,const Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> &d,const SharedPtr<Network> &network)
  445. {
  446. _send(tPtr,d);
  447. if ((network)&&(network->config().remoteTraceTarget)) {
  448. Packet outp(network->config().remoteTraceTarget,RR->identity.address(),Packet::VERB_REMOTE_TRACE);
  449. outp.appendCString(d.data());
  450. outp.compress();
  451. RR->sw->send(tPtr,outp,true);
  452. }
  453. }
  454. } // namespace ZeroTier