IncomingPacket.cpp 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at https://mozilla.org/MPL/2.0/.
  4. *
  5. * (c) ZeroTier, Inc.
  6. * https://www.zerotier.com/
  7. */
  8. #include "IncomingPacket.hpp"
  9. #include "../include/ZeroTierOne.h"
  10. #include "../version.h"
  11. #include "Bond.hpp"
  12. #include "Capability.hpp"
  13. #include "CertificateOfMembership.hpp"
  14. #include "Constants.hpp"
  15. #include "Metrics.hpp"
  16. #include "NetworkController.hpp"
  17. #include "Node.hpp"
  18. #include "PacketMultiplexer.hpp"
  19. #include "Path.hpp"
  20. #include "Peer.hpp"
  21. #include "Revocation.hpp"
  22. #include "RuntimeEnvironment.hpp"
  23. #include "SelfAwareness.hpp"
  24. #include "Switch.hpp"
  25. #include "Tag.hpp"
  26. #include "Topology.hpp"
  27. #include "Trace.hpp"
  28. #include "World.hpp"
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. namespace ZeroTier {
  33. bool IncomingPacket::tryDecode(const RuntimeEnvironment* RR, void* tPtr, int32_t flowId)
  34. {
  35. const Address sourceAddress(source());
  36. try {
  37. // Check for trusted paths or unencrypted HELLOs (HELLO is the only packet sent in the clear)
  38. const unsigned int c = cipher();
  39. if (c == ZT_PROTO_CIPHER_SUITE__NO_CRYPTO_TRUSTED_PATH) {
  40. // If this is marked as a packet via a trusted path, check source address and path ID.
  41. // Obviously if no trusted paths are configured this always returns false and such
  42. // packets are dropped on the floor.
  43. const uint64_t tpid = trustedPathId();
  44. if (RR->topology->shouldInboundPathBeTrusted(_path->address(), tpid)) {
  45. _authenticated = true;
  46. }
  47. else {
  48. RR->t->incomingPacketMessageAuthenticationFailure(tPtr, _path, packetId(), sourceAddress, hops(), "path not trusted");
  49. return true;
  50. }
  51. }
  52. else if ((c == ZT_PROTO_CIPHER_SUITE__C25519_POLY1305_NONE) && (verb() == Packet::VERB_HELLO)) {
  53. // Only HELLO is allowed in the clear, but will still have a MAC
  54. return _doHELLO(RR, tPtr, false);
  55. }
  56. const SharedPtr<Peer> peer(RR->topology->getPeer(tPtr, sourceAddress));
  57. if (peer) {
  58. if (! _authenticated) {
  59. if (! dearmor(peer->key(), peer->aesKeys(), RR->identity)) {
  60. RR->t->incomingPacketMessageAuthenticationFailure(tPtr, _path, packetId(), sourceAddress, hops(), "invalid MAC");
  61. peer->recordIncomingInvalidPacket(_path);
  62. return true;
  63. }
  64. }
  65. if (! uncompress()) {
  66. RR->t->incomingPacketInvalid(tPtr, _path, packetId(), sourceAddress, hops(), Packet::VERB_NOP, "LZ4 decompression failed");
  67. return true;
  68. }
  69. _authenticated = true;
  70. const Packet::Verb v = verb();
  71. bool r = true;
  72. switch (v) {
  73. // case Packet::VERB_NOP:
  74. default: // ignore unknown verbs, but if they pass auth check they are "received"
  75. Metrics::pkt_nop_in++;
  76. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), v, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  77. break;
  78. case Packet::VERB_HELLO:
  79. r = _doHELLO(RR, tPtr, true);
  80. break;
  81. case Packet::VERB_ACK:
  82. r = _doACK(RR, tPtr, peer);
  83. break;
  84. case Packet::VERB_QOS_MEASUREMENT:
  85. r = _doQOS_MEASUREMENT(RR, tPtr, peer);
  86. break;
  87. case Packet::VERB_ERROR:
  88. r = _doERROR(RR, tPtr, peer);
  89. break;
  90. case Packet::VERB_OK:
  91. r = _doOK(RR, tPtr, peer);
  92. break;
  93. case Packet::VERB_WHOIS:
  94. r = _doWHOIS(RR, tPtr, peer);
  95. break;
  96. case Packet::VERB_RENDEZVOUS:
  97. r = _doRENDEZVOUS(RR, tPtr, peer);
  98. break;
  99. case Packet::VERB_FRAME:
  100. r = _doFRAME(RR, tPtr, peer, flowId);
  101. break;
  102. case Packet::VERB_EXT_FRAME:
  103. r = _doEXT_FRAME(RR, tPtr, peer, flowId);
  104. break;
  105. case Packet::VERB_ECHO:
  106. r = _doECHO(RR, tPtr, peer);
  107. break;
  108. case Packet::VERB_MULTICAST_LIKE:
  109. r = _doMULTICAST_LIKE(RR, tPtr, peer);
  110. break;
  111. case Packet::VERB_NETWORK_CREDENTIALS:
  112. r = _doNETWORK_CREDENTIALS(RR, tPtr, peer);
  113. break;
  114. case Packet::VERB_NETWORK_CONFIG_REQUEST:
  115. r = _doNETWORK_CONFIG_REQUEST(RR, tPtr, peer);
  116. break;
  117. case Packet::VERB_NETWORK_CONFIG:
  118. r = _doNETWORK_CONFIG(RR, tPtr, peer);
  119. break;
  120. case Packet::VERB_MULTICAST_GATHER:
  121. r = _doMULTICAST_GATHER(RR, tPtr, peer);
  122. break;
  123. case Packet::VERB_MULTICAST_FRAME:
  124. r = _doMULTICAST_FRAME(RR, tPtr, peer);
  125. break;
  126. case Packet::VERB_PUSH_DIRECT_PATHS:
  127. r = _doPUSH_DIRECT_PATHS(RR, tPtr, peer);
  128. break;
  129. case Packet::VERB_USER_MESSAGE:
  130. r = _doUSER_MESSAGE(RR, tPtr, peer);
  131. break;
  132. case Packet::VERB_REMOTE_TRACE:
  133. r = _doREMOTE_TRACE(RR, tPtr, peer);
  134. break;
  135. case Packet::VERB_PATH_NEGOTIATION_REQUEST:
  136. r = _doPATH_NEGOTIATION_REQUEST(RR, tPtr, peer);
  137. break;
  138. }
  139. if (r) {
  140. RR->node->statsLogVerb((unsigned int)v, (unsigned int)size());
  141. return true;
  142. }
  143. return false;
  144. }
  145. else {
  146. RR->sw->requestWhois(tPtr, RR->node->now(), sourceAddress);
  147. return false;
  148. }
  149. }
  150. catch (...) {
  151. RR->t->incomingPacketInvalid(tPtr, _path, packetId(), sourceAddress, hops(), verb(), "unexpected exception in tryDecode()");
  152. return true;
  153. }
  154. }
  155. bool IncomingPacket::_doERROR(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  156. {
  157. const Packet::Verb inReVerb = (Packet::Verb)(*this)[ZT_PROTO_VERB_ERROR_IDX_IN_RE_VERB];
  158. const uint64_t inRePacketId = at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_IN_RE_PACKET_ID);
  159. const Packet::ErrorCode errorCode = (Packet::ErrorCode)(*this)[ZT_PROTO_VERB_ERROR_IDX_ERROR_CODE];
  160. uint64_t networkId = 0;
  161. Metrics::pkt_error_in++;
  162. /* Security note: we do not gate doERROR() with expectingReplyTo() to
  163. * avoid having to log every outgoing packet ID. Instead we put the
  164. * logic to determine whether we should consider an ERROR in each
  165. * error handler. In most cases these are only trusted in specific
  166. * circumstances. */
  167. switch (errorCode) {
  168. case Packet::ERROR_OBJ_NOT_FOUND:
  169. // Object not found, currently only meaningful from network controllers.
  170. if (inReVerb == Packet::VERB_NETWORK_CONFIG_REQUEST) {
  171. const SharedPtr<Network> network(RR->node->network(at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD)));
  172. if ((network) && (network->controller() == peer->address())) {
  173. network->setNotFound(tPtr);
  174. }
  175. }
  176. Metrics::pkt_error_obj_not_found_in++;
  177. break;
  178. case Packet::ERROR_UNSUPPORTED_OPERATION:
  179. // This can be sent in response to any operation, though right now we only
  180. // consider it meaningful from network controllers. This would indicate
  181. // that the queried node does not support acting as a controller.
  182. if (inReVerb == Packet::VERB_NETWORK_CONFIG_REQUEST) {
  183. const SharedPtr<Network> network(RR->node->network(at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD)));
  184. if ((network) && (network->controller() == peer->address())) {
  185. network->setNotFound(tPtr);
  186. }
  187. }
  188. Metrics::pkt_error_unsupported_op_in++;
  189. break;
  190. case Packet::ERROR_IDENTITY_COLLISION:
  191. // FIXME: for federation this will need a payload with a signature or something.
  192. if (RR->topology->isUpstream(peer->identity())) {
  193. RR->node->postEvent(tPtr, ZT_EVENT_FATAL_ERROR_IDENTITY_COLLISION);
  194. }
  195. Metrics::pkt_error_identity_collision_in++;
  196. break;
  197. case Packet::ERROR_NEED_MEMBERSHIP_CERTIFICATE: {
  198. // Peers can send this in response to frames if they do not have a recent enough COM from us
  199. networkId = at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD);
  200. const SharedPtr<Network> network(RR->node->network(networkId));
  201. const int64_t now = RR->node->now();
  202. if ((network) && (network->config().com)) {
  203. network->peerRequestedCredentials(tPtr, peer->address(), now);
  204. }
  205. Metrics::pkt_error_need_membership_cert_in++;
  206. } break;
  207. case Packet::ERROR_NETWORK_ACCESS_DENIED_: {
  208. // Network controller: network access denied.
  209. const SharedPtr<Network> network(RR->node->network(at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD)));
  210. if ((network) && (network->controller() == peer->address())) {
  211. network->setAccessDenied(tPtr);
  212. }
  213. Metrics::pkt_error_network_access_denied_in++;
  214. } break;
  215. case Packet::ERROR_UNWANTED_MULTICAST: {
  216. // Members of networks can use this error to indicate that they no longer
  217. // want to receive multicasts on a given channel.
  218. networkId = at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD);
  219. const SharedPtr<Network> network(RR->node->network(networkId));
  220. if ((network) && (network->gate(tPtr, peer))) {
  221. const MulticastGroup mg(MAC(field(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD + 8, 6), 6), at<uint32_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD + 14));
  222. RR->mc->remove(network->id(), mg, peer->address());
  223. }
  224. Metrics::pkt_error_unwanted_multicast_in++;
  225. } break;
  226. case Packet::ERROR_NETWORK_AUTHENTICATION_REQUIRED: {
  227. // fprintf(stderr, "\nPacket::ERROR_NETWORK_AUTHENTICATION_REQUIRED\n\n");
  228. const SharedPtr<Network> network(RR->node->network(at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD)));
  229. if ((network) && (network->controller() == peer->address())) {
  230. int s = (int)size() - (ZT_PROTO_VERB_ERROR_IDX_PAYLOAD + 8);
  231. if (s > 2) {
  232. const uint16_t errorDataSize = at<uint16_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD + 8);
  233. s -= 2;
  234. if (s >= (int)errorDataSize) {
  235. Dictionary<8192> authInfo(((const char*)this->data()) + (ZT_PROTO_VERB_ERROR_IDX_PAYLOAD + 10), errorDataSize);
  236. uint64_t authVer = authInfo.getUI(ZT_AUTHINFO_DICT_KEY_VERSION, 0ULL);
  237. if (authVer == 0) {
  238. char authenticationURL[2048];
  239. if (authInfo.get(ZT_AUTHINFO_DICT_KEY_AUTHENTICATION_URL, authenticationURL, sizeof(authenticationURL)) > 0) {
  240. authenticationURL[sizeof(authenticationURL) - 1] = 0; // ensure always zero terminated
  241. network->setAuthenticationRequired(tPtr, authenticationURL);
  242. }
  243. }
  244. else if (authVer == 1) {
  245. char issuerURL[2048] = { 0 };
  246. char centralAuthURL[2048] = { 0 };
  247. char ssoNonce[64] = { 0 };
  248. char ssoState[128] = { 0 };
  249. char ssoClientID[256] = { 0 };
  250. char ssoProvider[64] = { 0 };
  251. if (authInfo.get(ZT_AUTHINFO_DICT_KEY_ISSUER_URL, issuerURL, sizeof(issuerURL)) > 0) {
  252. issuerURL[sizeof(issuerURL) - 1] = 0;
  253. }
  254. if (authInfo.get(ZT_AUTHINFO_DICT_KEY_CENTRAL_ENDPOINT_URL, centralAuthURL, sizeof(centralAuthURL)) > 0) {
  255. centralAuthURL[sizeof(centralAuthURL) - 1] = 0;
  256. }
  257. if (authInfo.get(ZT_AUTHINFO_DICT_KEY_NONCE, ssoNonce, sizeof(ssoNonce)) > 0) {
  258. ssoNonce[sizeof(ssoNonce) - 1] = 0;
  259. }
  260. if (authInfo.get(ZT_AUTHINFO_DICT_KEY_STATE, ssoState, sizeof(ssoState)) > 0) {
  261. ssoState[sizeof(ssoState) - 1] = 0;
  262. }
  263. if (authInfo.get(ZT_AUTHINFO_DICT_KEY_CLIENT_ID, ssoClientID, sizeof(ssoClientID)) > 0) {
  264. ssoClientID[sizeof(ssoClientID) - 1] = 0;
  265. }
  266. if (authInfo.get(ZT_AUTHINFO_DICT_KEY_SSO_PROVIDER, ssoProvider, sizeof(ssoProvider)) > 0) {
  267. ssoProvider[sizeof(ssoProvider) - 1] = 0;
  268. }
  269. else {
  270. strncpy(ssoProvider, "default", sizeof(ssoProvider));
  271. }
  272. network->setAuthenticationRequired(tPtr, issuerURL, centralAuthURL, ssoClientID, ssoProvider, ssoNonce, ssoState);
  273. }
  274. }
  275. }
  276. else {
  277. network->setAuthenticationRequired(tPtr, "");
  278. }
  279. }
  280. Metrics::pkt_error_authentication_required_in++;
  281. } break;
  282. default:
  283. break;
  284. }
  285. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_ERROR, inRePacketId, inReVerb, false, networkId, ZT_QOS_NO_FLOW);
  286. return true;
  287. }
  288. bool IncomingPacket::_doACK(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  289. {
  290. /*
  291. if (! peer->rateGateACK(RR->node->now())) {
  292. return true;
  293. }
  294. int32_t ackedBytes;
  295. if (payloadLength() != sizeof(ackedBytes)) {
  296. return true; // ignore
  297. }
  298. memcpy(&ackedBytes, payload(), sizeof(ackedBytes));
  299. peer->receivedAck(_path, RR->node->now(), Utils::ntoh(ackedBytes));
  300. */
  301. Metrics::pkt_ack_in++;
  302. return true;
  303. }
  304. bool IncomingPacket::_doQOS_MEASUREMENT(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  305. {
  306. Metrics::pkt_qos_in++;
  307. if (! peer->rateGateQoS(RR->node->now(), _path)) {
  308. return true;
  309. }
  310. if (payloadLength() > ZT_QOS_MAX_PACKET_SIZE || payloadLength() < ZT_QOS_MIN_PACKET_SIZE) {
  311. return true; // ignore
  312. }
  313. const int64_t now = RR->node->now();
  314. uint64_t rx_id[ZT_QOS_TABLE_SIZE];
  315. uint16_t rx_ts[ZT_QOS_TABLE_SIZE];
  316. char* begin = (char*)payload();
  317. char* ptr = begin;
  318. int count = 0;
  319. unsigned int len = payloadLength();
  320. // Read packet IDs and latency compensation intervals for each packet tracked by this QoS packet
  321. while (ptr < (begin + len) && (count < ZT_QOS_TABLE_SIZE)) {
  322. memcpy((void*)&rx_id[count], ptr, sizeof(uint64_t));
  323. ptr += sizeof(uint64_t);
  324. memcpy((void*)&rx_ts[count], ptr, sizeof(uint16_t));
  325. ptr += sizeof(uint16_t);
  326. count++;
  327. }
  328. peer->receivedQoS(_path, now, count, rx_id, rx_ts);
  329. return true;
  330. }
  331. bool IncomingPacket::_doHELLO(const RuntimeEnvironment* RR, void* tPtr, const bool alreadyAuthenticated)
  332. {
  333. Metrics::pkt_hello_in++;
  334. const int64_t now = RR->node->now();
  335. const uint64_t pid = packetId();
  336. const Address fromAddress(source());
  337. const unsigned int protoVersion = (*this)[ZT_PROTO_VERB_HELLO_IDX_PROTOCOL_VERSION];
  338. const unsigned int vMajor = (*this)[ZT_PROTO_VERB_HELLO_IDX_MAJOR_VERSION];
  339. const unsigned int vMinor = (*this)[ZT_PROTO_VERB_HELLO_IDX_MINOR_VERSION];
  340. const unsigned int vRevision = at<uint16_t>(ZT_PROTO_VERB_HELLO_IDX_REVISION);
  341. const int64_t timestamp = at<int64_t>(ZT_PROTO_VERB_HELLO_IDX_TIMESTAMP);
  342. Identity id;
  343. unsigned int ptr = ZT_PROTO_VERB_HELLO_IDX_IDENTITY + id.deserialize(*this, ZT_PROTO_VERB_HELLO_IDX_IDENTITY);
  344. if (protoVersion < ZT_PROTO_VERSION_MIN) {
  345. RR->t->incomingPacketDroppedHELLO(tPtr, _path, pid, fromAddress, "protocol version too old");
  346. return true;
  347. }
  348. if (fromAddress != id.address()) {
  349. RR->t->incomingPacketDroppedHELLO(tPtr, _path, pid, fromAddress, "identity/address mismatch");
  350. return true;
  351. }
  352. SharedPtr<Peer> peer(RR->topology->getPeer(tPtr, id.address()));
  353. if (peer) {
  354. // We already have an identity with this address -- check for collisions
  355. if (! alreadyAuthenticated) {
  356. if (peer->identity() != id) {
  357. // Identity is different from the one we already have -- address collision
  358. // Check rate limits
  359. if (! RR->node->rateGateIdentityVerification(now, _path->address())) {
  360. return true;
  361. }
  362. uint8_t key[ZT_SYMMETRIC_KEY_SIZE];
  363. if (RR->identity.agree(id, key)) {
  364. if (dearmor(key, peer->aesKeysIfSupported(), RR->identity)) { // ensure packet is authentic, otherwise drop
  365. RR->t->incomingPacketDroppedHELLO(tPtr, _path, pid, fromAddress, "address collision");
  366. Packet outp(id.address(), RR->identity.address(), Packet::VERB_ERROR);
  367. outp.append((uint8_t)Packet::VERB_HELLO);
  368. outp.append((uint64_t)pid);
  369. outp.append((uint8_t)Packet::ERROR_IDENTITY_COLLISION);
  370. outp.armor(key, true, false, peer->aesKeysIfSupported(), peer->identity());
  371. Metrics::pkt_error_out++;
  372. Metrics::pkt_error_identity_collision_out++;
  373. _path->send(RR, tPtr, outp.data(), outp.size(), RR->node->now());
  374. }
  375. else {
  376. RR->t->incomingPacketMessageAuthenticationFailure(tPtr, _path, pid, fromAddress, hops(), "invalid MAC");
  377. }
  378. }
  379. else {
  380. RR->t->incomingPacketMessageAuthenticationFailure(tPtr, _path, pid, fromAddress, hops(), "invalid identity");
  381. }
  382. return true;
  383. }
  384. else {
  385. // Identity is the same as the one we already have -- check packet integrity
  386. if (! dearmor(peer->key(), peer->aesKeysIfSupported(), RR->identity)) {
  387. RR->t->incomingPacketMessageAuthenticationFailure(tPtr, _path, pid, fromAddress, hops(), "invalid MAC");
  388. return true;
  389. }
  390. // Continue at // VALID
  391. }
  392. } // else if alreadyAuthenticated then continue at // VALID
  393. }
  394. else {
  395. // We don't already have an identity with this address -- validate and learn it
  396. // Sanity check: this basically can't happen
  397. if (alreadyAuthenticated) {
  398. RR->t->incomingPacketDroppedHELLO(tPtr, _path, pid, fromAddress, "illegal alreadyAuthenticated state");
  399. return true;
  400. }
  401. // Check rate limits
  402. if (! RR->node->rateGateIdentityVerification(now, _path->address())) {
  403. RR->t->incomingPacketDroppedHELLO(tPtr, _path, pid, fromAddress, "rate limit exceeded");
  404. return true;
  405. }
  406. // Check packet integrity and MAC (this is faster than locallyValidate() so do it first to filter out total crap)
  407. SharedPtr<Peer> newPeer(new Peer(RR, RR->identity, id));
  408. if (! dearmor(newPeer->key(), newPeer->aesKeysIfSupported(), RR->identity)) {
  409. RR->t->incomingPacketMessageAuthenticationFailure(tPtr, _path, pid, fromAddress, hops(), "invalid MAC");
  410. return true;
  411. }
  412. // Check that identity's address is valid as per the derivation function
  413. if (! id.locallyValidate()) {
  414. RR->t->incomingPacketDroppedHELLO(tPtr, _path, pid, fromAddress, "invalid identity");
  415. return true;
  416. }
  417. peer = RR->topology->addPeer(tPtr, newPeer);
  418. // Continue at // VALID
  419. }
  420. // VALID -- if we made it here, packet passed identity and authenticity checks!
  421. // Get external surface address if present (was not in old versions)
  422. InetAddress externalSurfaceAddress;
  423. if (ptr < size()) {
  424. ptr += externalSurfaceAddress.deserialize(*this, ptr);
  425. if ((externalSurfaceAddress) && (hops() == 0)) {
  426. RR->sa->iam(tPtr, id.address(), _path->localSocket(), _path->address(), externalSurfaceAddress, RR->topology->isUpstream(id), now);
  427. }
  428. }
  429. // Get primary planet world ID and world timestamp if present
  430. uint64_t planetWorldId = 0;
  431. uint64_t planetWorldTimestamp = 0;
  432. if ((ptr + 16) <= size()) {
  433. planetWorldId = at<uint64_t>(ptr);
  434. ptr += 8;
  435. planetWorldTimestamp = at<uint64_t>(ptr);
  436. ptr += 8;
  437. }
  438. std::vector<std::pair<uint64_t, uint64_t> > moonIdsAndTimestamps;
  439. if (ptr < size()) {
  440. // Remainder of packet, if present, is encrypted
  441. cryptField(peer->key(), ptr, size() - ptr);
  442. // Get moon IDs and timestamps if present
  443. if ((ptr + 2) <= size()) {
  444. const unsigned int numMoons = at<uint16_t>(ptr);
  445. ptr += 2;
  446. for (unsigned int i = 0; i < numMoons; ++i) {
  447. if ((World::Type)(*this)[ptr++] == World::TYPE_MOON) {
  448. moonIdsAndTimestamps.push_back(std::pair<uint64_t, uint64_t>(at<uint64_t>(ptr), at<uint64_t>(ptr + 8)));
  449. }
  450. ptr += 16;
  451. }
  452. }
  453. }
  454. // Send OK(HELLO) with an echo of the packet's timestamp and some of the same
  455. // information about us: version, sent-to address, etc.
  456. Packet outp(id.address(), RR->identity.address(), Packet::VERB_OK);
  457. outp.append((unsigned char)Packet::VERB_HELLO);
  458. outp.append((uint64_t)pid);
  459. outp.append((uint64_t)timestamp);
  460. outp.append((unsigned char)ZT_PROTO_VERSION);
  461. outp.append((unsigned char)ZEROTIER_ONE_VERSION_MAJOR);
  462. outp.append((unsigned char)ZEROTIER_ONE_VERSION_MINOR);
  463. outp.append((uint16_t)ZEROTIER_ONE_VERSION_REVISION);
  464. _path->address().serialize(outp);
  465. const unsigned int worldUpdateSizeAt = outp.size();
  466. outp.addSize(2); // make room for 16-bit size field
  467. if ((planetWorldId) && (RR->topology->planetWorldTimestamp() > planetWorldTimestamp) && (planetWorldId == RR->topology->planetWorldId())) {
  468. RR->topology->planet().serialize(outp, false);
  469. }
  470. if (! moonIdsAndTimestamps.empty()) {
  471. std::vector<World> moons(RR->topology->moons());
  472. for (std::vector<World>::const_iterator m(moons.begin()); m != moons.end(); ++m) {
  473. for (std::vector<std::pair<uint64_t, uint64_t> >::const_iterator i(moonIdsAndTimestamps.begin()); i != moonIdsAndTimestamps.end(); ++i) {
  474. if (i->first == m->id()) {
  475. if (m->timestamp() > i->second) {
  476. m->serialize(outp, false);
  477. }
  478. break;
  479. }
  480. }
  481. }
  482. }
  483. outp.setAt<uint16_t>(worldUpdateSizeAt, (uint16_t)(outp.size() - (worldUpdateSizeAt + 2)));
  484. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), peer->identity());
  485. peer->recordOutgoingPacket(_path, outp.packetId(), outp.payloadLength(), outp.verb(), ZT_QOS_NO_FLOW, now);
  486. Metrics::pkt_ok_out++;
  487. _path->send(RR, tPtr, outp.data(), outp.size(), now);
  488. peer->setRemoteVersion(protoVersion, vMajor, vMinor, vRevision); // important for this to go first so received() knows the version
  489. peer->received(tPtr, _path, hops(), pid, payloadLength(), Packet::VERB_HELLO, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  490. return true;
  491. }
  492. bool IncomingPacket::_doOK(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  493. {
  494. Metrics::pkt_ok_in++;
  495. const Packet::Verb inReVerb = (Packet::Verb)(*this)[ZT_PROTO_VERB_OK_IDX_IN_RE_VERB];
  496. const uint64_t inRePacketId = at<uint64_t>(ZT_PROTO_VERB_OK_IDX_IN_RE_PACKET_ID);
  497. uint64_t networkId = 0;
  498. if (! RR->node->expectingReplyTo(inRePacketId)) {
  499. return true;
  500. }
  501. switch (inReVerb) {
  502. case Packet::VERB_HELLO: {
  503. const uint64_t latency = RR->node->now() - at<uint64_t>(ZT_PROTO_VERB_HELLO__OK__IDX_TIMESTAMP);
  504. const unsigned int vProto = (*this)[ZT_PROTO_VERB_HELLO__OK__IDX_PROTOCOL_VERSION];
  505. const unsigned int vMajor = (*this)[ZT_PROTO_VERB_HELLO__OK__IDX_MAJOR_VERSION];
  506. const unsigned int vMinor = (*this)[ZT_PROTO_VERB_HELLO__OK__IDX_MINOR_VERSION];
  507. const unsigned int vRevision = at<uint16_t>(ZT_PROTO_VERB_HELLO__OK__IDX_REVISION);
  508. if (vProto < ZT_PROTO_VERSION_MIN) {
  509. return true;
  510. }
  511. InetAddress externalSurfaceAddress;
  512. unsigned int ptr = ZT_PROTO_VERB_HELLO__OK__IDX_REVISION + 2;
  513. // Get reported external surface address if present
  514. if (ptr < size()) {
  515. ptr += externalSurfaceAddress.deserialize(*this, ptr);
  516. }
  517. // Handle planet or moon updates if present
  518. if ((ptr + 2) <= size()) {
  519. const unsigned int worldsLen = at<uint16_t>(ptr);
  520. ptr += 2;
  521. if (RR->topology->shouldAcceptWorldUpdateFrom(peer->address())) {
  522. const unsigned int endOfWorlds = ptr + worldsLen;
  523. while (ptr < endOfWorlds) {
  524. World w;
  525. ptr += w.deserialize(*this, ptr);
  526. RR->topology->addWorld(tPtr, w, false);
  527. }
  528. }
  529. else {
  530. ptr += worldsLen;
  531. }
  532. }
  533. if (! hops()) {
  534. _path->updateLatency((unsigned int)latency, RR->node->now());
  535. }
  536. peer->setRemoteVersion(vProto, vMajor, vMinor, vRevision);
  537. if ((externalSurfaceAddress) && (hops() == 0)) {
  538. RR->sa->iam(tPtr, peer->address(), _path->localSocket(), _path->address(), externalSurfaceAddress, RR->topology->isUpstream(peer->identity()), RR->node->now());
  539. }
  540. } break;
  541. case Packet::VERB_WHOIS:
  542. if (RR->topology->isUpstream(peer->identity())) {
  543. const Identity id(*this, ZT_PROTO_VERB_WHOIS__OK__IDX_IDENTITY);
  544. RR->sw->doAnythingWaitingForPeer(tPtr, RR->topology->addPeer(tPtr, SharedPtr<Peer>(new Peer(RR, RR->identity, id))));
  545. }
  546. break;
  547. case Packet::VERB_NETWORK_CONFIG_REQUEST: {
  548. networkId = at<uint64_t>(ZT_PROTO_VERB_OK_IDX_PAYLOAD);
  549. const SharedPtr<Network> network(RR->node->network(networkId));
  550. if (network) {
  551. network->handleConfigChunk(tPtr, packetId(), source(), *this, ZT_PROTO_VERB_OK_IDX_PAYLOAD);
  552. }
  553. } break;
  554. case Packet::VERB_MULTICAST_GATHER: {
  555. networkId = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID);
  556. const SharedPtr<Network> network(RR->node->network(networkId));
  557. if (network) {
  558. const MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC, 6), 6), at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_ADI));
  559. const unsigned int count = at<uint16_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS + 4);
  560. RR->mc->addMultiple(tPtr, RR->node->now(), networkId, mg, field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS + 6, count * 5), count, at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS));
  561. }
  562. } break;
  563. case Packet::VERB_MULTICAST_FRAME: {
  564. const unsigned int flags = (*this)[ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS];
  565. networkId = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_NETWORK_ID);
  566. const MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC, 6), 6), at<uint32_t>(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI));
  567. const SharedPtr<Network> network(RR->node->network(networkId));
  568. if (network) {
  569. unsigned int offset = 0;
  570. if ((flags & 0x01) != 0) { // deprecated but still used by older peers
  571. CertificateOfMembership com;
  572. offset += com.deserialize(*this, ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_COM_AND_GATHER_RESULTS);
  573. if (com) {
  574. network->addCredential(tPtr, com);
  575. }
  576. }
  577. if ((flags & 0x02) != 0) {
  578. // OK(MULTICAST_FRAME) includes implicit gather results
  579. offset += ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_COM_AND_GATHER_RESULTS;
  580. unsigned int totalKnown = at<uint32_t>(offset);
  581. offset += 4;
  582. unsigned int count = at<uint16_t>(offset);
  583. offset += 2;
  584. RR->mc->addMultiple(tPtr, RR->node->now(), networkId, mg, field(offset, count * 5), count, totalKnown);
  585. }
  586. }
  587. } break;
  588. default:
  589. break;
  590. }
  591. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_OK, inRePacketId, inReVerb, false, networkId, ZT_QOS_NO_FLOW);
  592. return true;
  593. }
  594. bool IncomingPacket::_doWHOIS(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  595. {
  596. if ((! RR->topology->amUpstream()) && (! peer->rateGateInboundWhoisRequest(RR->node->now()))) {
  597. return true;
  598. }
  599. Metrics::pkt_whois_in++;
  600. Packet outp(peer->address(), RR->identity.address(), Packet::VERB_OK);
  601. outp.append((unsigned char)Packet::VERB_WHOIS);
  602. outp.append(packetId());
  603. unsigned int count = 0;
  604. unsigned int ptr = ZT_PACKET_IDX_PAYLOAD;
  605. while ((ptr + ZT_ADDRESS_LENGTH) <= size()) {
  606. const Address addr(field(ptr, ZT_ADDRESS_LENGTH), ZT_ADDRESS_LENGTH);
  607. ptr += ZT_ADDRESS_LENGTH;
  608. const Identity id(RR->topology->getIdentity(tPtr, addr));
  609. if (id) {
  610. id.serialize(outp, false);
  611. ++count;
  612. }
  613. else {
  614. // Request unknown WHOIS from upstream from us (if we have one)
  615. RR->sw->requestWhois(tPtr, RR->node->now(), addr);
  616. }
  617. }
  618. if (count > 0) {
  619. Metrics::pkt_ok_out++;
  620. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), RR->identity);
  621. _path->send(RR, tPtr, outp.data(), outp.size(), RR->node->now());
  622. }
  623. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_WHOIS, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  624. return true;
  625. }
  626. bool IncomingPacket::_doRENDEZVOUS(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  627. {
  628. Metrics::pkt_rendezvous_in++;
  629. if (RR->topology->isUpstream(peer->identity())) {
  630. const Address with(field(ZT_PROTO_VERB_RENDEZVOUS_IDX_ZTADDRESS, ZT_ADDRESS_LENGTH), ZT_ADDRESS_LENGTH);
  631. const SharedPtr<Peer> rendezvousWith(RR->topology->getPeer(tPtr, with));
  632. if (rendezvousWith) {
  633. const unsigned int port = at<uint16_t>(ZT_PROTO_VERB_RENDEZVOUS_IDX_PORT);
  634. const unsigned int addrlen = (*this)[ZT_PROTO_VERB_RENDEZVOUS_IDX_ADDRLEN];
  635. if ((port > 0) && ((addrlen == 4) || (addrlen == 16))) {
  636. InetAddress atAddr(field(ZT_PROTO_VERB_RENDEZVOUS_IDX_ADDRESS, addrlen), addrlen, port);
  637. if (RR->node->shouldUsePathForZeroTierTraffic(tPtr, with, _path->localSocket(), atAddr)) {
  638. const uint64_t junk = RR->node->prng();
  639. RR->node->putPacket(tPtr, _path->localSocket(), atAddr, &junk, 4, 2); // send low-TTL junk packet to 'open' local NAT(s) and stateful firewalls
  640. rendezvousWith->attemptToContactAt(tPtr, _path->localSocket(), atAddr, RR->node->now(), false);
  641. }
  642. }
  643. }
  644. }
  645. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_RENDEZVOUS, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  646. return true;
  647. }
  648. // Returns true if packet appears valid; pos and proto will be set
  649. static bool _ipv6GetPayload(const uint8_t* frameData, unsigned int frameLen, unsigned int& pos, unsigned int& proto)
  650. {
  651. if (frameLen < 40) {
  652. return false;
  653. }
  654. pos = 40;
  655. proto = frameData[6];
  656. while (pos <= frameLen) {
  657. switch (proto) {
  658. case 0: // hop-by-hop options
  659. case 43: // routing
  660. case 60: // destination options
  661. case 135: // mobility options
  662. if ((pos + 8) > frameLen) {
  663. return false; // invalid!
  664. }
  665. proto = frameData[pos];
  666. pos += ((unsigned int)frameData[pos + 1] * 8) + 8;
  667. break;
  668. // case 44: // fragment -- we currently can't parse these and they are deprecated in IPv6 anyway
  669. // case 50:
  670. // case 51: // IPSec ESP and AH -- we have to stop here since this is encrypted stuff
  671. default:
  672. return true;
  673. }
  674. }
  675. return false; // overflow == invalid
  676. }
  677. bool IncomingPacket::_doFRAME(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer, int32_t flowId)
  678. {
  679. Metrics::pkt_frame_in++;
  680. int32_t _flowId = ZT_QOS_NO_FLOW;
  681. if (peer->flowHashingSupported()) {
  682. if (size() > ZT_PROTO_VERB_FRAME_IDX_PAYLOAD) {
  683. const unsigned int etherType = at<uint16_t>(ZT_PROTO_VERB_FRAME_IDX_ETHERTYPE);
  684. const unsigned int frameLen = size() - ZT_PROTO_VERB_FRAME_IDX_PAYLOAD;
  685. const uint8_t* const frameData = reinterpret_cast<const uint8_t*>(data()) + ZT_PROTO_VERB_FRAME_IDX_PAYLOAD;
  686. if (etherType == ZT_ETHERTYPE_IPV4 && (frameLen >= 20)) {
  687. uint16_t srcPort = 0;
  688. uint16_t dstPort = 0;
  689. uint8_t proto = (reinterpret_cast<const uint8_t*>(frameData)[9]);
  690. const unsigned int headerLen = 4 * (reinterpret_cast<const uint8_t*>(frameData)[0] & 0xf);
  691. switch (proto) {
  692. case 0x01: // ICMP
  693. // flowId = 0x01;
  694. break;
  695. // All these start with 16-bit source and destination port in that order
  696. case 0x06: // TCP
  697. case 0x11: // UDP
  698. case 0x84: // SCTP
  699. case 0x88: // UDPLite
  700. if (frameLen > (headerLen + 4)) {
  701. unsigned int pos = headerLen + 0;
  702. srcPort = (reinterpret_cast<const uint8_t*>(frameData)[pos++]) << 8;
  703. srcPort |= (reinterpret_cast<const uint8_t*>(frameData)[pos]);
  704. pos++;
  705. dstPort = (reinterpret_cast<const uint8_t*>(frameData)[pos++]) << 8;
  706. dstPort |= (reinterpret_cast<const uint8_t*>(frameData)[pos]);
  707. _flowId = dstPort ^ srcPort ^ proto;
  708. }
  709. break;
  710. }
  711. }
  712. if (etherType == ZT_ETHERTYPE_IPV6 && (frameLen >= 40)) {
  713. uint16_t srcPort = 0;
  714. uint16_t dstPort = 0;
  715. unsigned int pos;
  716. unsigned int proto;
  717. _ipv6GetPayload((const uint8_t*)frameData, frameLen, pos, proto);
  718. switch (proto) {
  719. case 0x3A: // ICMPv6
  720. // flowId = 0x3A;
  721. break;
  722. // All these start with 16-bit source and destination port in that order
  723. case 0x06: // TCP
  724. case 0x11: // UDP
  725. case 0x84: // SCTP
  726. case 0x88: // UDPLite
  727. if (frameLen > (pos + 4)) {
  728. srcPort = (reinterpret_cast<const uint8_t*>(frameData)[pos++]) << 8;
  729. srcPort |= (reinterpret_cast<const uint8_t*>(frameData)[pos]);
  730. pos++;
  731. dstPort = (reinterpret_cast<const uint8_t*>(frameData)[pos++]) << 8;
  732. dstPort |= (reinterpret_cast<const uint8_t*>(frameData)[pos]);
  733. _flowId = dstPort ^ srcPort ^ proto;
  734. }
  735. break;
  736. default:
  737. break;
  738. }
  739. }
  740. }
  741. }
  742. const uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_FRAME_IDX_NETWORK_ID);
  743. const SharedPtr<Network> network(RR->node->network(nwid));
  744. bool trustEstablished = false;
  745. if (network) {
  746. if (network->gate(tPtr, peer)) {
  747. trustEstablished = true;
  748. if (size() > ZT_PROTO_VERB_FRAME_IDX_PAYLOAD) {
  749. const unsigned int etherType = at<uint16_t>(ZT_PROTO_VERB_FRAME_IDX_ETHERTYPE);
  750. const MAC sourceMac(peer->address(), nwid);
  751. const unsigned int frameLen = size() - ZT_PROTO_VERB_FRAME_IDX_PAYLOAD;
  752. const uint8_t* const frameData = reinterpret_cast<const uint8_t*>(data()) + ZT_PROTO_VERB_FRAME_IDX_PAYLOAD;
  753. if (network->filterIncomingPacket(tPtr, peer, RR->identity.address(), sourceMac, network->mac(), frameData, frameLen, etherType, 0) > 0) {
  754. RR->pm->putFrame(tPtr, nwid, network->userPtr(), sourceMac, network->mac(), etherType, 0, (const void*)frameData, frameLen, _flowId);
  755. }
  756. }
  757. }
  758. else {
  759. _sendErrorNeedCredentials(RR, tPtr, peer, nwid);
  760. return false;
  761. }
  762. }
  763. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_FRAME, 0, Packet::VERB_NOP, trustEstablished, nwid, _flowId);
  764. return true;
  765. }
  766. bool IncomingPacket::_doEXT_FRAME(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer, int32_t flowId)
  767. {
  768. Metrics::pkt_ext_frame_in++;
  769. int32_t _flowId = ZT_QOS_NO_FLOW;
  770. if (peer->flowHashingSupported()) {
  771. if (size() > ZT_PROTO_VERB_EXT_FRAME_IDX_PAYLOAD) {
  772. const unsigned int etherType = at<uint16_t>(ZT_PROTO_VERB_EXT_FRAME_IDX_ETHERTYPE);
  773. const unsigned int frameLen = size() - ZT_PROTO_VERB_EXT_FRAME_IDX_PAYLOAD;
  774. const uint8_t* const frameData = reinterpret_cast<const uint8_t*>(data()) + ZT_PROTO_VERB_EXT_FRAME_IDX_PAYLOAD;
  775. if (etherType == ZT_ETHERTYPE_IPV4 && (frameLen >= 20)) {
  776. uint16_t srcPort = 0;
  777. uint16_t dstPort = 0;
  778. uint8_t proto = (reinterpret_cast<const uint8_t*>(frameData)[9]);
  779. const unsigned int headerLen = 4 * (reinterpret_cast<const uint8_t*>(frameData)[0] & 0xf);
  780. switch (proto) {
  781. case 0x01: // ICMP
  782. // flowId = 0x01;
  783. break;
  784. // All these start with 16-bit source and destination port in that order
  785. case 0x06: // TCP
  786. case 0x11: // UDP
  787. case 0x84: // SCTP
  788. case 0x88: // UDPLite
  789. if (frameLen > (headerLen + 4)) {
  790. unsigned int pos = headerLen + 0;
  791. srcPort = (reinterpret_cast<const uint8_t*>(frameData)[pos++]) << 8;
  792. srcPort |= (reinterpret_cast<const uint8_t*>(frameData)[pos]);
  793. pos++;
  794. dstPort = (reinterpret_cast<const uint8_t*>(frameData)[pos++]) << 8;
  795. dstPort |= (reinterpret_cast<const uint8_t*>(frameData)[pos]);
  796. _flowId = dstPort ^ srcPort ^ proto;
  797. }
  798. break;
  799. }
  800. }
  801. if (etherType == ZT_ETHERTYPE_IPV6 && (frameLen >= 40)) {
  802. uint16_t srcPort = 0;
  803. uint16_t dstPort = 0;
  804. unsigned int pos;
  805. unsigned int proto;
  806. _ipv6GetPayload((const uint8_t*)frameData, frameLen, pos, proto);
  807. switch (proto) {
  808. case 0x3A: // ICMPv6
  809. // flowId = 0x3A;
  810. break;
  811. // All these start with 16-bit source and destination port in that order
  812. case 0x06: // TCP
  813. case 0x11: // UDP
  814. case 0x84: // SCTP
  815. case 0x88: // UDPLite
  816. if (frameLen > (pos + 4)) {
  817. srcPort = (reinterpret_cast<const uint8_t*>(frameData)[pos++]) << 8;
  818. srcPort |= (reinterpret_cast<const uint8_t*>(frameData)[pos]);
  819. pos++;
  820. dstPort = (reinterpret_cast<const uint8_t*>(frameData)[pos++]) << 8;
  821. dstPort |= (reinterpret_cast<const uint8_t*>(frameData)[pos]);
  822. _flowId = dstPort ^ srcPort ^ proto;
  823. }
  824. break;
  825. default:
  826. break;
  827. }
  828. }
  829. }
  830. }
  831. const uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_EXT_FRAME_IDX_NETWORK_ID);
  832. const SharedPtr<Network> network(RR->node->network(nwid));
  833. if (network) {
  834. const unsigned int flags = (*this)[ZT_PROTO_VERB_EXT_FRAME_IDX_FLAGS];
  835. unsigned int comLen = 0;
  836. if ((flags & 0x01) != 0) { // inline COM with EXT_FRAME is deprecated but still used with old peers
  837. CertificateOfMembership com;
  838. comLen = com.deserialize(*this, ZT_PROTO_VERB_EXT_FRAME_IDX_COM);
  839. if (com) {
  840. network->addCredential(tPtr, com);
  841. }
  842. }
  843. if (! network->gate(tPtr, peer)) {
  844. RR->t->incomingNetworkAccessDenied(tPtr, network, _path, packetId(), size(), peer->address(), Packet::VERB_EXT_FRAME, true);
  845. _sendErrorNeedCredentials(RR, tPtr, peer, nwid);
  846. return false;
  847. }
  848. if (size() > ZT_PROTO_VERB_EXT_FRAME_IDX_PAYLOAD) {
  849. const unsigned int etherType = at<uint16_t>(comLen + ZT_PROTO_VERB_EXT_FRAME_IDX_ETHERTYPE);
  850. const MAC to(field(comLen + ZT_PROTO_VERB_EXT_FRAME_IDX_TO, ZT_PROTO_VERB_EXT_FRAME_LEN_TO), ZT_PROTO_VERB_EXT_FRAME_LEN_TO);
  851. const MAC from(field(comLen + ZT_PROTO_VERB_EXT_FRAME_IDX_FROM, ZT_PROTO_VERB_EXT_FRAME_LEN_FROM), ZT_PROTO_VERB_EXT_FRAME_LEN_FROM);
  852. const unsigned int frameLen = size() - (comLen + ZT_PROTO_VERB_EXT_FRAME_IDX_PAYLOAD);
  853. const uint8_t* const frameData = (const uint8_t*)field(comLen + ZT_PROTO_VERB_EXT_FRAME_IDX_PAYLOAD, frameLen);
  854. if ((! from) || (from == network->mac())) {
  855. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_EXT_FRAME, 0, Packet::VERB_NOP, true, nwid, _flowId); // trustEstablished because COM is okay
  856. return true;
  857. }
  858. switch (network->filterIncomingPacket(tPtr, peer, RR->identity.address(), from, to, frameData, frameLen, etherType, 0)) {
  859. case 1:
  860. if (from != MAC(peer->address(), nwid)) {
  861. if (network->config().permitsBridging(peer->address())) {
  862. network->learnBridgeRoute(from, peer->address());
  863. }
  864. else {
  865. RR->t->incomingNetworkFrameDropped(tPtr, network, _path, packetId(), size(), peer->address(), Packet::VERB_EXT_FRAME, from, to, "bridging not allowed (remote)");
  866. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_EXT_FRAME, 0, Packet::VERB_NOP, true, nwid, _flowId); // trustEstablished because COM is okay
  867. return true;
  868. }
  869. }
  870. else if (to != network->mac()) {
  871. if (to.isMulticast()) {
  872. if (network->config().multicastLimit == 0) {
  873. RR->t->incomingNetworkFrameDropped(tPtr, network, _path, packetId(), size(), peer->address(), Packet::VERB_EXT_FRAME, from, to, "multicast disabled");
  874. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_EXT_FRAME, 0, Packet::VERB_NOP, true, nwid, _flowId); // trustEstablished because COM is okay
  875. return true;
  876. }
  877. }
  878. else if (! network->config().permitsBridging(RR->identity.address())) {
  879. RR->t->incomingNetworkFrameDropped(tPtr, network, _path, packetId(), size(), peer->address(), Packet::VERB_EXT_FRAME, from, to, "bridging not allowed (local)");
  880. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_EXT_FRAME, 0, Packet::VERB_NOP, true, nwid, _flowId); // trustEstablished because COM is okay
  881. return true;
  882. }
  883. }
  884. // fall through -- 2 means accept regardless of bridging checks or other restrictions
  885. case 2:
  886. RR->pm->putFrame(tPtr, nwid, network->userPtr(), from, to, etherType, 0, (const void*)frameData, frameLen, _flowId);
  887. break;
  888. }
  889. }
  890. if ((flags & 0x10) != 0) { // ACK requested
  891. Packet outp(peer->address(), RR->identity.address(), Packet::VERB_OK);
  892. outp.append((uint8_t)Packet::VERB_EXT_FRAME);
  893. outp.append((uint64_t)packetId());
  894. outp.append((uint64_t)nwid);
  895. const int64_t now = RR->node->now();
  896. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), peer->identity());
  897. peer->recordOutgoingPacket(_path, outp.packetId(), outp.payloadLength(), outp.verb(), ZT_QOS_NO_FLOW, now);
  898. Metrics::pkt_ok_out++;
  899. _path->send(RR, tPtr, outp.data(), outp.size(), RR->node->now());
  900. }
  901. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_EXT_FRAME, 0, Packet::VERB_NOP, true, nwid, _flowId);
  902. }
  903. else {
  904. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_EXT_FRAME, 0, Packet::VERB_NOP, false, nwid, _flowId);
  905. }
  906. return true;
  907. }
  908. bool IncomingPacket::_doECHO(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  909. {
  910. Metrics::pkt_echo_in++;
  911. uint64_t now = RR->node->now();
  912. if (! _path->rateGateEchoRequest(now)) {
  913. return true;
  914. }
  915. const uint64_t pid = packetId();
  916. Packet outp(peer->address(), RR->identity.address(), Packet::VERB_OK);
  917. outp.append((unsigned char)Packet::VERB_ECHO);
  918. outp.append((uint64_t)pid);
  919. if (size() > ZT_PACKET_IDX_PAYLOAD) {
  920. outp.append(reinterpret_cast<const unsigned char*>(data()) + ZT_PACKET_IDX_PAYLOAD, size() - ZT_PACKET_IDX_PAYLOAD);
  921. }
  922. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), peer->identity());
  923. peer->recordOutgoingPacket(_path, outp.packetId(), outp.payloadLength(), outp.verb(), ZT_QOS_NO_FLOW, now);
  924. Metrics::pkt_ok_out++;
  925. _path->send(RR, tPtr, outp.data(), outp.size(), RR->node->now());
  926. peer->received(tPtr, _path, hops(), pid, payloadLength(), Packet::VERB_ECHO, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  927. return true;
  928. }
  929. bool IncomingPacket::_doMULTICAST_LIKE(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  930. {
  931. Metrics::pkt_multicast_like_in++;
  932. const int64_t now = RR->node->now();
  933. bool authorized = false;
  934. uint64_t lastNwid = 0;
  935. // Packet contains a series of 18-byte network,MAC,ADI tuples
  936. for (unsigned int ptr = ZT_PACKET_IDX_PAYLOAD; ptr < size(); ptr += 18) {
  937. const uint64_t nwid = at<uint64_t>(ptr);
  938. if (nwid != lastNwid) {
  939. lastNwid = nwid;
  940. SharedPtr<Network> network(RR->node->network(nwid));
  941. if (network) {
  942. authorized = network->gate(tPtr, peer);
  943. }
  944. if (! authorized) {
  945. authorized = ((RR->topology->amUpstream()) || (RR->node->localControllerHasAuthorized(now, nwid, peer->address())));
  946. }
  947. }
  948. if (authorized) {
  949. RR->mc->add(tPtr, now, nwid, MulticastGroup(MAC(field(ptr + 8, 6), 6), at<uint32_t>(ptr + 14)), peer->address());
  950. }
  951. }
  952. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_MULTICAST_LIKE, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  953. return true;
  954. }
  955. bool IncomingPacket::_doNETWORK_CREDENTIALS(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  956. {
  957. Metrics::pkt_network_credentials_in++;
  958. if (! peer->rateGateCredentialsReceived(RR->node->now())) {
  959. return true;
  960. }
  961. CertificateOfMembership com;
  962. Capability cap;
  963. Tag tag;
  964. Revocation revocation;
  965. CertificateOfOwnership coo;
  966. bool trustEstablished = false;
  967. SharedPtr<Network> network;
  968. unsigned int p = ZT_PACKET_IDX_PAYLOAD;
  969. while ((p < size()) && ((*this)[p] != 0)) {
  970. p += com.deserialize(*this, p);
  971. if (com) {
  972. network = RR->node->network(com.networkId());
  973. if (network) {
  974. switch (network->addCredential(tPtr, com)) {
  975. case Membership::ADD_REJECTED:
  976. break;
  977. case Membership::ADD_ACCEPTED_NEW:
  978. case Membership::ADD_ACCEPTED_REDUNDANT:
  979. trustEstablished = true;
  980. break;
  981. case Membership::ADD_DEFERRED_FOR_WHOIS:
  982. return false;
  983. }
  984. }
  985. }
  986. }
  987. ++p; // skip trailing 0 after COMs if present
  988. if (p < size()) { // older ZeroTier versions do not send capabilities, tags, or revocations
  989. const unsigned int numCapabilities = at<uint16_t>(p);
  990. p += 2;
  991. for (unsigned int i = 0; i < numCapabilities; ++i) {
  992. p += cap.deserialize(*this, p);
  993. if ((! network) || (network->id() != cap.networkId())) {
  994. network = RR->node->network(cap.networkId());
  995. }
  996. if (network) {
  997. switch (network->addCredential(tPtr, cap)) {
  998. case Membership::ADD_REJECTED:
  999. break;
  1000. case Membership::ADD_ACCEPTED_NEW:
  1001. case Membership::ADD_ACCEPTED_REDUNDANT:
  1002. trustEstablished = true;
  1003. break;
  1004. case Membership::ADD_DEFERRED_FOR_WHOIS:
  1005. return false;
  1006. }
  1007. }
  1008. }
  1009. if (p >= size()) {
  1010. return true;
  1011. }
  1012. const unsigned int numTags = at<uint16_t>(p);
  1013. p += 2;
  1014. for (unsigned int i = 0; i < numTags; ++i) {
  1015. p += tag.deserialize(*this, p);
  1016. if ((! network) || (network->id() != tag.networkId())) {
  1017. network = RR->node->network(tag.networkId());
  1018. }
  1019. if (network) {
  1020. switch (network->addCredential(tPtr, tag)) {
  1021. case Membership::ADD_REJECTED:
  1022. break;
  1023. case Membership::ADD_ACCEPTED_NEW:
  1024. case Membership::ADD_ACCEPTED_REDUNDANT:
  1025. trustEstablished = true;
  1026. break;
  1027. case Membership::ADD_DEFERRED_FOR_WHOIS:
  1028. return false;
  1029. }
  1030. }
  1031. }
  1032. if (p >= size()) {
  1033. return true;
  1034. }
  1035. const unsigned int numRevocations = at<uint16_t>(p);
  1036. p += 2;
  1037. for (unsigned int i = 0; i < numRevocations; ++i) {
  1038. p += revocation.deserialize(*this, p);
  1039. if ((! network) || (network->id() != revocation.networkId())) {
  1040. network = RR->node->network(revocation.networkId());
  1041. }
  1042. if (network) {
  1043. switch (network->addCredential(tPtr, peer->address(), revocation)) {
  1044. case Membership::ADD_REJECTED:
  1045. break;
  1046. case Membership::ADD_ACCEPTED_NEW:
  1047. case Membership::ADD_ACCEPTED_REDUNDANT:
  1048. trustEstablished = true;
  1049. break;
  1050. case Membership::ADD_DEFERRED_FOR_WHOIS:
  1051. return false;
  1052. }
  1053. }
  1054. }
  1055. if (p >= size()) {
  1056. return true;
  1057. }
  1058. const unsigned int numCoos = at<uint16_t>(p);
  1059. p += 2;
  1060. for (unsigned int i = 0; i < numCoos; ++i) {
  1061. p += coo.deserialize(*this, p);
  1062. if ((! network) || (network->id() != coo.networkId())) {
  1063. network = RR->node->network(coo.networkId());
  1064. }
  1065. if (network) {
  1066. switch (network->addCredential(tPtr, coo)) {
  1067. case Membership::ADD_REJECTED:
  1068. break;
  1069. case Membership::ADD_ACCEPTED_NEW:
  1070. case Membership::ADD_ACCEPTED_REDUNDANT:
  1071. trustEstablished = true;
  1072. break;
  1073. case Membership::ADD_DEFERRED_FOR_WHOIS:
  1074. return false;
  1075. }
  1076. }
  1077. }
  1078. }
  1079. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_NETWORK_CREDENTIALS, 0, Packet::VERB_NOP, trustEstablished, (network) ? network->id() : 0, ZT_QOS_NO_FLOW);
  1080. return true;
  1081. }
  1082. bool IncomingPacket::_doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  1083. {
  1084. Metrics::pkt_network_config_request_in++;
  1085. const uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_NETWORK_ID);
  1086. const unsigned int hopCount = hops();
  1087. const uint64_t requestPacketId = packetId();
  1088. if (RR->localNetworkController) {
  1089. const unsigned int metaDataLength = (ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT_LEN <= size()) ? at<uint16_t>(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT_LEN) : 0;
  1090. const char* metaDataBytes = (metaDataLength != 0) ? (const char*)field(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT, metaDataLength) : (const char*)0;
  1091. const Dictionary<ZT_NETWORKCONFIG_METADATA_DICT_CAPACITY> metaData(metaDataBytes, metaDataLength);
  1092. RR->localNetworkController->request(nwid, (hopCount > 0) ? InetAddress() : _path->address(), requestPacketId, peer->identity(), metaData);
  1093. }
  1094. else {
  1095. Packet outp(peer->address(), RR->identity.address(), Packet::VERB_ERROR);
  1096. outp.append((unsigned char)Packet::VERB_NETWORK_CONFIG_REQUEST);
  1097. outp.append(requestPacketId);
  1098. outp.append((unsigned char)Packet::ERROR_UNSUPPORTED_OPERATION);
  1099. outp.append(nwid);
  1100. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), peer->identity());
  1101. Metrics::pkt_error_out++;
  1102. Metrics::pkt_error_unsupported_op_out++;
  1103. _path->send(RR, tPtr, outp.data(), outp.size(), RR->node->now());
  1104. }
  1105. peer->received(tPtr, _path, hopCount, requestPacketId, payloadLength(), Packet::VERB_NETWORK_CONFIG_REQUEST, 0, Packet::VERB_NOP, false, nwid, ZT_QOS_NO_FLOW);
  1106. return true;
  1107. }
  1108. bool IncomingPacket::_doNETWORK_CONFIG(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  1109. {
  1110. Metrics::pkt_network_config_in++;
  1111. const SharedPtr<Network> network(RR->node->network(at<uint64_t>(ZT_PACKET_IDX_PAYLOAD)));
  1112. if (network) {
  1113. const uint64_t configUpdateId = network->handleConfigChunk(tPtr, packetId(), source(), *this, ZT_PACKET_IDX_PAYLOAD);
  1114. if (configUpdateId) {
  1115. Packet outp(peer->address(), RR->identity.address(), Packet::VERB_OK);
  1116. outp.append((uint8_t)Packet::VERB_ECHO);
  1117. outp.append((uint64_t)packetId());
  1118. outp.append((uint64_t)network->id());
  1119. outp.append((uint64_t)configUpdateId);
  1120. const int64_t now = RR->node->now();
  1121. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), peer->identity());
  1122. peer->recordOutgoingPacket(_path, outp.packetId(), outp.payloadLength(), outp.verb(), ZT_QOS_NO_FLOW, now);
  1123. Metrics::pkt_ok_out++;
  1124. _path->send(RR, tPtr, outp.data(), outp.size(), RR->node->now());
  1125. }
  1126. }
  1127. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_NETWORK_CONFIG, 0, Packet::VERB_NOP, false, (network) ? network->id() : 0, ZT_QOS_NO_FLOW);
  1128. return true;
  1129. }
  1130. bool IncomingPacket::_doMULTICAST_GATHER(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  1131. {
  1132. Metrics::pkt_multicast_gather_in++;
  1133. const uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_GATHER_IDX_NETWORK_ID);
  1134. const unsigned int flags = (*this)[ZT_PROTO_VERB_MULTICAST_GATHER_IDX_FLAGS];
  1135. const MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_GATHER_IDX_MAC, 6), 6), at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER_IDX_ADI));
  1136. const unsigned int gatherLimit = at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER_IDX_GATHER_LIMIT);
  1137. const SharedPtr<Network> network(RR->node->network(nwid));
  1138. if ((flags & 0x01) != 0) {
  1139. try {
  1140. CertificateOfMembership com;
  1141. com.deserialize(*this, ZT_PROTO_VERB_MULTICAST_GATHER_IDX_COM);
  1142. if ((com) && (network)) {
  1143. network->addCredential(tPtr, com);
  1144. }
  1145. }
  1146. catch (...) {
  1147. } // discard invalid COMs
  1148. }
  1149. const bool trustEstablished = (network) ? network->gate(tPtr, peer) : false;
  1150. const int64_t now = RR->node->now();
  1151. if ((gatherLimit > 0) && ((trustEstablished) || (RR->topology->amUpstream()) || (RR->node->localControllerHasAuthorized(now, nwid, peer->address())))) {
  1152. Packet outp(peer->address(), RR->identity.address(), Packet::VERB_OK);
  1153. outp.append((unsigned char)Packet::VERB_MULTICAST_GATHER);
  1154. outp.append(packetId());
  1155. outp.append(nwid);
  1156. mg.mac().appendTo(outp);
  1157. outp.append((uint32_t)mg.adi());
  1158. const unsigned int gatheredLocally = RR->mc->gather(peer->address(), nwid, mg, outp, gatherLimit);
  1159. if (gatheredLocally > 0) {
  1160. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), peer->identity());
  1161. peer->recordOutgoingPacket(_path, outp.packetId(), outp.payloadLength(), outp.verb(), ZT_QOS_NO_FLOW, now);
  1162. Metrics::pkt_ok_out++;
  1163. _path->send(RR, tPtr, outp.data(), outp.size(), now);
  1164. }
  1165. }
  1166. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_MULTICAST_GATHER, 0, Packet::VERB_NOP, trustEstablished, nwid, ZT_QOS_NO_FLOW);
  1167. return true;
  1168. }
  1169. bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  1170. {
  1171. Metrics::pkt_multicast_frame_in++;
  1172. const uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_FRAME_IDX_NETWORK_ID);
  1173. const unsigned int flags = (*this)[ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FLAGS];
  1174. const SharedPtr<Network> network(RR->node->network(nwid));
  1175. if (network) {
  1176. // Offset -- size of optional fields added to position of later fields
  1177. unsigned int offset = 0;
  1178. if ((flags & 0x01) != 0) {
  1179. // This is deprecated but may still be sent by old peers
  1180. CertificateOfMembership com;
  1181. offset += com.deserialize(*this, ZT_PROTO_VERB_MULTICAST_FRAME_IDX_COM);
  1182. if (com) {
  1183. network->addCredential(tPtr, com);
  1184. }
  1185. }
  1186. if (! network->gate(tPtr, peer)) {
  1187. _sendErrorNeedCredentials(RR, tPtr, peer, nwid);
  1188. return false;
  1189. }
  1190. unsigned int gatherLimit = 0;
  1191. if ((flags & 0x02) != 0) {
  1192. gatherLimit = at<uint32_t>(offset + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_GATHER_LIMIT);
  1193. offset += 4;
  1194. }
  1195. MAC from;
  1196. if ((flags & 0x04) != 0) {
  1197. from.setTo(field(offset + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_SOURCE_MAC, 6), 6);
  1198. offset += 6;
  1199. }
  1200. else {
  1201. from.fromAddress(peer->address(), nwid);
  1202. }
  1203. const MulticastGroup to(MAC(field(offset + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_DEST_MAC, 6), 6), at<uint32_t>(offset + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_DEST_ADI));
  1204. const unsigned int etherType = at<uint16_t>(offset + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ETHERTYPE);
  1205. const unsigned int frameLen = size() - (offset + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME);
  1206. if (network->config().multicastLimit == 0) {
  1207. RR->t->incomingNetworkFrameDropped(tPtr, network, _path, packetId(), size(), peer->address(), Packet::VERB_MULTICAST_FRAME, from, to.mac(), "multicast disabled");
  1208. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_MULTICAST_FRAME, 0, Packet::VERB_NOP, false, nwid, ZT_QOS_NO_FLOW);
  1209. return true;
  1210. }
  1211. if ((frameLen > 0) && (frameLen <= ZT_MAX_MTU)) {
  1212. if (! to.mac().isMulticast()) {
  1213. RR->t->incomingPacketInvalid(tPtr, _path, packetId(), source(), hops(), Packet::VERB_MULTICAST_FRAME, "destination not multicast");
  1214. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_MULTICAST_FRAME, 0, Packet::VERB_NOP, true, nwid, ZT_QOS_NO_FLOW); // trustEstablished because COM is okay
  1215. return true;
  1216. }
  1217. if ((! from) || (from.isMulticast()) || (from == network->mac())) {
  1218. RR->t->incomingPacketInvalid(tPtr, _path, packetId(), source(), hops(), Packet::VERB_MULTICAST_FRAME, "invalid source MAC");
  1219. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_MULTICAST_FRAME, 0, Packet::VERB_NOP, true, nwid, ZT_QOS_NO_FLOW); // trustEstablished because COM is okay
  1220. return true;
  1221. }
  1222. const uint8_t* const frameData = (const uint8_t*)field(offset + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME, frameLen);
  1223. if ((flags & 0x08) && (network->config().isMulticastReplicator(RR->identity.address()))) {
  1224. RR->mc->send(tPtr, RR->node->now(), network, peer->address(), to, from, etherType, frameData, frameLen);
  1225. }
  1226. if (from != MAC(peer->address(), nwid)) {
  1227. if (network->config().permitsBridging(peer->address())) {
  1228. network->learnBridgeRoute(from, peer->address());
  1229. }
  1230. else {
  1231. RR->t->incomingNetworkFrameDropped(tPtr, network, _path, packetId(), size(), peer->address(), Packet::VERB_MULTICAST_FRAME, from, to.mac(), "bridging not allowed (remote)");
  1232. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_MULTICAST_FRAME, 0, Packet::VERB_NOP, true, nwid, ZT_QOS_NO_FLOW); // trustEstablished because COM is okay
  1233. return true;
  1234. }
  1235. }
  1236. if (network->filterIncomingPacket(tPtr, peer, RR->identity.address(), from, to.mac(), frameData, frameLen, etherType, 0) > 0) {
  1237. RR->node->putFrame(tPtr, nwid, network->userPtr(), from, to.mac(), etherType, 0, (const void*)frameData, frameLen);
  1238. }
  1239. }
  1240. if (gatherLimit) {
  1241. Packet outp(source(), RR->identity.address(), Packet::VERB_OK);
  1242. outp.append((unsigned char)Packet::VERB_MULTICAST_FRAME);
  1243. outp.append(packetId());
  1244. outp.append(nwid);
  1245. to.mac().appendTo(outp);
  1246. outp.append((uint32_t)to.adi());
  1247. outp.append((unsigned char)0x02); // flag 0x02 = contains gather results
  1248. if (RR->mc->gather(peer->address(), nwid, to, outp, gatherLimit)) {
  1249. const int64_t now = RR->node->now();
  1250. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), peer->identity());
  1251. peer->recordOutgoingPacket(_path, outp.packetId(), outp.payloadLength(), outp.verb(), ZT_QOS_NO_FLOW, now);
  1252. Metrics::pkt_ok_out++;
  1253. _path->send(RR, tPtr, outp.data(), outp.size(), RR->node->now());
  1254. }
  1255. }
  1256. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_MULTICAST_FRAME, 0, Packet::VERB_NOP, true, nwid, ZT_QOS_NO_FLOW);
  1257. }
  1258. return true;
  1259. }
  1260. bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  1261. {
  1262. Metrics::pkt_push_direct_paths_in++;
  1263. const int64_t now = RR->node->now();
  1264. if (! peer->rateGatePushDirectPaths(now)) {
  1265. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_PUSH_DIRECT_PATHS, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  1266. return true;
  1267. }
  1268. // Second, limit addresses by scope and type
  1269. uint8_t countPerScope[ZT_INETADDRESS_MAX_SCOPE + 1][2]; // [][0] is v4, [][1] is v6
  1270. memset(countPerScope, 0, sizeof(countPerScope));
  1271. unsigned int count = at<uint16_t>(ZT_PACKET_IDX_PAYLOAD);
  1272. unsigned int ptr = ZT_PACKET_IDX_PAYLOAD + 2;
  1273. while (count--) { // if ptr overflows Buffer will throw
  1274. unsigned int flags = (*this)[ptr++];
  1275. unsigned int extLen = at<uint16_t>(ptr);
  1276. ptr += 2;
  1277. ptr += extLen; // unused right now
  1278. unsigned int addrType = (*this)[ptr++];
  1279. unsigned int addrLen = (*this)[ptr++];
  1280. switch (addrType) {
  1281. case 4: {
  1282. const InetAddress a(field(ptr, 4), 4, at<uint16_t>(ptr + 4));
  1283. if (((flags & ZT_PUSH_DIRECT_PATHS_FLAG_FORGET_PATH) == 0) && // not being told to forget
  1284. (! (((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) == 0) && (peer->hasActivePathTo(now, a)))) && // not already known
  1285. (RR->node->shouldUsePathForZeroTierTraffic(tPtr, peer->address(), _path->localSocket(), a))) // should use path
  1286. {
  1287. if ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) != 0) {
  1288. peer->clusterRedirect(tPtr, _path, a, now);
  1289. }
  1290. else if (++countPerScope[(int)a.ipScope()][0] <= ZT_PUSH_DIRECT_PATHS_MAX_PER_SCOPE_AND_FAMILY) {
  1291. peer->attemptToContactAt(tPtr, InetAddress(), a, now, false);
  1292. }
  1293. }
  1294. } break;
  1295. case 6: {
  1296. const InetAddress a(field(ptr, 16), 16, at<uint16_t>(ptr + 16));
  1297. if (((flags & ZT_PUSH_DIRECT_PATHS_FLAG_FORGET_PATH) == 0) && // not being told to forget
  1298. (! (((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) == 0) && (peer->hasActivePathTo(now, a)))) && // not already known
  1299. (RR->node->shouldUsePathForZeroTierTraffic(tPtr, peer->address(), _path->localSocket(), a))) // should use path
  1300. {
  1301. if ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) != 0) {
  1302. peer->clusterRedirect(tPtr, _path, a, now);
  1303. }
  1304. else if (++countPerScope[(int)a.ipScope()][1] <= ZT_PUSH_DIRECT_PATHS_MAX_PER_SCOPE_AND_FAMILY) {
  1305. peer->attemptToContactAt(tPtr, InetAddress(), a, now, false);
  1306. }
  1307. }
  1308. } break;
  1309. }
  1310. ptr += addrLen;
  1311. }
  1312. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_PUSH_DIRECT_PATHS, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  1313. return true;
  1314. }
  1315. bool IncomingPacket::_doUSER_MESSAGE(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  1316. {
  1317. Metrics::pkt_user_message_in++;
  1318. if (likely(size() >= (ZT_PACKET_IDX_PAYLOAD + 8))) {
  1319. ZT_UserMessage um;
  1320. um.origin = peer->address().toInt();
  1321. um.typeId = at<uint64_t>(ZT_PACKET_IDX_PAYLOAD);
  1322. um.data = reinterpret_cast<const void*>(reinterpret_cast<const uint8_t*>(data()) + ZT_PACKET_IDX_PAYLOAD + 8);
  1323. um.length = size() - (ZT_PACKET_IDX_PAYLOAD + 8);
  1324. RR->node->postEvent(tPtr, ZT_EVENT_USER_MESSAGE, reinterpret_cast<const void*>(&um));
  1325. }
  1326. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_USER_MESSAGE, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  1327. return true;
  1328. }
  1329. bool IncomingPacket::_doREMOTE_TRACE(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  1330. {
  1331. Metrics::pkt_remote_trace_in++;
  1332. ZT_RemoteTrace rt;
  1333. const char* ptr = reinterpret_cast<const char*>(data()) + ZT_PACKET_IDX_PAYLOAD;
  1334. const char* const eof = reinterpret_cast<const char*>(data()) + size();
  1335. rt.origin = peer->address().toInt();
  1336. rt.data = const_cast<char*>(ptr); // start of first string
  1337. while (ptr < eof) {
  1338. if (! *ptr) { // end of string
  1339. rt.len = (unsigned int)(ptr - rt.data);
  1340. if ((rt.len > 0) && (rt.len <= ZT_MAX_REMOTE_TRACE_SIZE)) {
  1341. RR->node->postEvent(tPtr, ZT_EVENT_REMOTE_TRACE, &rt);
  1342. }
  1343. rt.data = const_cast<char*>(++ptr); // start of next string, if any
  1344. }
  1345. else {
  1346. ++ptr;
  1347. }
  1348. }
  1349. peer->received(tPtr, _path, hops(), packetId(), payloadLength(), Packet::VERB_REMOTE_TRACE, 0, Packet::VERB_NOP, false, 0, ZT_QOS_NO_FLOW);
  1350. return true;
  1351. }
  1352. bool IncomingPacket::_doPATH_NEGOTIATION_REQUEST(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer)
  1353. {
  1354. Metrics::pkt_path_negotiation_request_in++;
  1355. uint64_t now = RR->node->now();
  1356. if (! peer->rateGatePathNegotiation(now, _path)) {
  1357. return true;
  1358. }
  1359. if (payloadLength() != sizeof(int16_t)) {
  1360. return true;
  1361. }
  1362. int16_t remoteUtility = 0;
  1363. memcpy(&remoteUtility, payload(), sizeof(int16_t));
  1364. peer->processIncomingPathNegotiationRequest(now, _path, Utils::ntoh(remoteUtility));
  1365. return true;
  1366. }
  1367. void IncomingPacket::_sendErrorNeedCredentials(const RuntimeEnvironment* RR, void* tPtr, const SharedPtr<Peer>& peer, const uint64_t nwid)
  1368. {
  1369. Packet outp(source(), RR->identity.address(), Packet::VERB_ERROR);
  1370. outp.append((uint8_t)verb());
  1371. outp.append(packetId());
  1372. outp.append((uint8_t)Packet::ERROR_NEED_MEMBERSHIP_CERTIFICATE);
  1373. outp.append(nwid);
  1374. outp.armor(peer->key(), true, false, peer->aesKeysIfSupported(), peer->identity());
  1375. Metrics::pkt_error_out++;
  1376. Metrics::pkt_error_need_membership_cert_out++;
  1377. _path->send(RR, tPtr, outp.data(), outp.size(), RR->node->now());
  1378. }
  1379. } // namespace ZeroTier