InetAddress.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. /*
  2. * Copyright (c)2013-2020 ZeroTier, Inc.
  3. *
  4. * Use of this software is governed by the Business Source License included
  5. * in the LICENSE.TXT file in the project's root directory.
  6. *
  7. * Change Date: 2024-01-01
  8. *
  9. * On the date above, in accordance with the Business Source License, use
  10. * of this software will be governed by version 2.0 of the Apache License.
  11. */
  12. /****/
  13. #include <cstring>
  14. #include <cstdint>
  15. #include "Constants.hpp"
  16. #include "InetAddress.hpp"
  17. #include "Utils.hpp"
  18. namespace ZeroTier {
  19. const InetAddress InetAddress::LO4((const void *) ("\x7f\x00\x00\x01"), 4, 0);
  20. const InetAddress InetAddress::LO6((const void *) ("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"), 16, 0);
  21. const InetAddress InetAddress::NIL;
  22. InetAddress::IpScope InetAddress::ipScope() const noexcept
  23. {
  24. switch (as.ss.ss_family) {
  25. case AF_INET: {
  26. const uint32_t ip = Utils::ntoh((uint32_t)as.sa_in.sin_addr.s_addr);
  27. switch (ip >> 24U) {
  28. case 0x00:
  29. return IP_SCOPE_NONE; // 0.0.0.0/8 (reserved, never used)
  30. case 0x06:
  31. return IP_SCOPE_PSEUDOPRIVATE; // 6.0.0.0/8 (US Army)
  32. case 0x0a:
  33. return IP_SCOPE_PRIVATE; // 10.0.0.0/8
  34. case 0x0b: //return IP_SCOPE_PSEUDOPRIVATE; // 11.0.0.0/8 (US DoD)
  35. case 0x15: //return IP_SCOPE_PSEUDOPRIVATE; // 21.0.0.0/8 (US DDN-RVN)
  36. case 0x16: //return IP_SCOPE_PSEUDOPRIVATE; // 22.0.0.0/8 (US DISA)
  37. case 0x19: //return IP_SCOPE_PSEUDOPRIVATE; // 25.0.0.0/8 (UK Ministry of Defense)
  38. case 0x1a: //return IP_SCOPE_PSEUDOPRIVATE; // 26.0.0.0/8 (US DISA)
  39. case 0x1c: //return IP_SCOPE_PSEUDOPRIVATE; // 28.0.0.0/8 (US DSI-North)
  40. case 0x1d: //return IP_SCOPE_PSEUDOPRIVATE; // 29.0.0.0/8 (US DISA)
  41. case 0x1e: //return IP_SCOPE_PSEUDOPRIVATE; // 30.0.0.0/8 (US DISA)
  42. case 0x33: //return IP_SCOPE_PSEUDOPRIVATE; // 51.0.0.0/8 (UK Department of Social Security)
  43. case 0x37: //return IP_SCOPE_PSEUDOPRIVATE; // 55.0.0.0/8 (US DoD)
  44. case 0x38:
  45. return IP_SCOPE_PSEUDOPRIVATE; // 56.0.0.0/8 (US Postal Service)
  46. case 0x64:
  47. if ((ip & 0xffc00000) == 0x64400000) return IP_SCOPE_PRIVATE; // 100.64.0.0/10
  48. break;
  49. case 0x7f:
  50. return IP_SCOPE_LOOPBACK; // 127.0.0.0/8
  51. case 0xa9:
  52. if ((ip & 0xffff0000) == 0xa9fe0000) return IP_SCOPE_LINK_LOCAL; // 169.254.0.0/16
  53. break;
  54. case 0xac:
  55. if ((ip & 0xfff00000) == 0xac100000) return IP_SCOPE_PRIVATE; // 172.16.0.0/12
  56. break;
  57. case 0xc0:
  58. if ((ip & 0xffff0000) == 0xc0a80000) return IP_SCOPE_PRIVATE; // 192.168.0.0/16
  59. break;
  60. case 0xff:
  61. return IP_SCOPE_NONE; // 255.0.0.0/8 (broadcast, or unused/unusable)
  62. }
  63. switch (ip >> 28U) {
  64. case 0xe:
  65. return IP_SCOPE_MULTICAST; // 224.0.0.0/4
  66. case 0xf:
  67. return IP_SCOPE_PSEUDOPRIVATE; // 240.0.0.0/4 ("reserved," usually unusable)
  68. }
  69. return IP_SCOPE_GLOBAL;
  70. }
  71. case AF_INET6: {
  72. const uint8_t *const ip = as.sa_in6.sin6_addr.s6_addr;
  73. if ((ip[0] & 0xf0U) == 0xf0) {
  74. if (ip[0] == 0xff) return IP_SCOPE_MULTICAST; // ff00::/8
  75. if ((ip[0] == 0xfe) && ((ip[1] & 0xc0U) == 0x80)) {
  76. unsigned int k = 2;
  77. while ((!ip[k]) && (k < 15)) ++k;
  78. if ((k == 15) && (ip[15] == 0x01))
  79. return IP_SCOPE_LOOPBACK; // fe80::1/128
  80. else return IP_SCOPE_LINK_LOCAL; // fe80::/10
  81. }
  82. if ((ip[0] & 0xfeU) == 0xfc) return IP_SCOPE_PRIVATE; // fc00::/7
  83. }
  84. unsigned int k = 0;
  85. while ((!ip[k]) && (k < 15)) ++k;
  86. if (k == 15) { // all 0's except last byte
  87. if (ip[15] == 0x01) return IP_SCOPE_LOOPBACK; // ::1/128
  88. if (ip[15] == 0x00) return IP_SCOPE_NONE; // ::/128
  89. }
  90. return IP_SCOPE_GLOBAL;
  91. }
  92. }
  93. return IP_SCOPE_NONE;
  94. }
  95. void InetAddress::set(const void *ipBytes, unsigned int ipLen, unsigned int port) noexcept
  96. {
  97. memoryZero(this);
  98. if (ipLen == 4) {
  99. as.sa_in.sin_family = AF_INET;
  100. as.sa_in.sin_port = Utils::hton((uint16_t) port);
  101. as.sa_in.sin_addr.s_addr = Utils::loadAsIsEndian<uint32_t>(ipBytes);
  102. } else if (ipLen == 16) {
  103. as.sa_in6.sin6_family = AF_INET6;
  104. as.sa_in6.sin6_port = Utils::hton((uint16_t) port);
  105. Utils::copy<16>(as.sa_in6.sin6_addr.s6_addr, ipBytes);
  106. }
  107. }
  108. bool InetAddress::isDefaultRoute() const noexcept
  109. {
  110. switch (as.ss.ss_family) {
  111. case AF_INET:
  112. return ((as.sa_in.sin_port == 0) && (as.sa_in.sin_addr.s_addr == 0));
  113. case AF_INET6:
  114. if (as.sa_in6.sin6_port == 0) {
  115. for (unsigned int i = 0;i < 16;++i) {
  116. if (as.sa_in6.sin6_addr.s6_addr[i])
  117. return false;
  118. }
  119. return true;
  120. }
  121. return false;
  122. default:
  123. return false;
  124. }
  125. }
  126. char *InetAddress::toString(char buf[ZT_INETADDRESS_STRING_SIZE_MAX]) const noexcept
  127. {
  128. char *p = toIpString(buf);
  129. if (*p) {
  130. while (*p) ++p;
  131. *(p++) = '/';
  132. Utils::decimal(port(), p);
  133. }
  134. return buf;
  135. }
  136. char *InetAddress::toIpString(char buf[ZT_INETADDRESS_STRING_SIZE_MAX]) const noexcept
  137. {
  138. buf[0] = (char) 0;
  139. switch (as.ss.ss_family) {
  140. case AF_INET:
  141. inet_ntop(AF_INET, &as.sa_in.sin_addr.s_addr, buf, INET_ADDRSTRLEN);
  142. break;
  143. case AF_INET6:
  144. inet_ntop(AF_INET6, as.sa_in6.sin6_addr.s6_addr, buf, INET6_ADDRSTRLEN);
  145. break;
  146. }
  147. return buf;
  148. }
  149. bool InetAddress::fromString(const char *ipSlashPort) noexcept
  150. {
  151. char buf[64];
  152. memoryZero(this);
  153. if (!*ipSlashPort)
  154. return true;
  155. if (!Utils::scopy(buf, sizeof(buf), ipSlashPort))
  156. return false;
  157. char *portAt = buf;
  158. while ((*portAt) && (*portAt != '/'))
  159. ++portAt;
  160. unsigned int port = 0;
  161. if (*portAt) {
  162. *(portAt++) = (char) 0;
  163. port = Utils::strToUInt(portAt) & 0xffffU;
  164. }
  165. if (strchr(buf, ':')) {
  166. as.sa_in6.sin6_family = AF_INET6;
  167. as.sa_in6.sin6_port = Utils::hton((uint16_t) port);
  168. inet_pton(AF_INET6, buf, as.sa_in6.sin6_addr.s6_addr);
  169. return true;
  170. } else if (strchr(buf, '.')) {
  171. as.sa_in.sin_family = AF_INET;
  172. as.sa_in.sin_port = Utils::hton((uint16_t) port);
  173. inet_pton(AF_INET, buf, &as.sa_in.sin_addr.s_addr);
  174. return true;
  175. }
  176. return false;
  177. }
  178. InetAddress InetAddress::netmask() const noexcept
  179. {
  180. InetAddress r(*this);
  181. switch (r.as.ss.ss_family) {
  182. case AF_INET:
  183. r.as.sa_in.sin_addr.s_addr = Utils::hton((uint32_t) (0xffffffffU << (32 - netmaskBits())));
  184. break;
  185. case AF_INET6: {
  186. uint64_t nm[2];
  187. const unsigned int bits = netmaskBits();
  188. if (bits) {
  189. nm[0] = Utils::hton((uint64_t) ((bits >= 64) ? 0xffffffffffffffffULL : (0xffffffffffffffffULL << (64 - bits))));
  190. nm[1] = Utils::hton((uint64_t) ((bits <= 64) ? 0ULL : (0xffffffffffffffffULL << (128 - bits))));
  191. } else {
  192. nm[0] = 0;
  193. nm[1] = 0;
  194. }
  195. Utils::copy<16>(r.as.sa_in6.sin6_addr.s6_addr, nm);
  196. }
  197. break;
  198. }
  199. return r;
  200. }
  201. InetAddress InetAddress::broadcast() const noexcept
  202. {
  203. if (as.ss.ss_family == AF_INET) {
  204. InetAddress r(*this);
  205. reinterpret_cast<sockaddr_in *>(&r)->sin_addr.s_addr |= Utils::hton((uint32_t) (0xffffffffU >> netmaskBits()));
  206. return r;
  207. }
  208. return InetAddress();
  209. }
  210. InetAddress InetAddress::network() const noexcept
  211. {
  212. InetAddress r(*this);
  213. switch (r.as.ss.ss_family) {
  214. case AF_INET:
  215. r.as.sa_in.sin_addr.s_addr &= Utils::hton((uint32_t) (0xffffffffU << (32 - netmaskBits())));
  216. break;
  217. case AF_INET6: {
  218. uint64_t nm[2];
  219. const unsigned int bits = netmaskBits();
  220. Utils::copy<16>(nm, reinterpret_cast<sockaddr_in6 *>(&r)->sin6_addr.s6_addr);
  221. nm[0] &= Utils::hton((uint64_t) ((bits >= 64) ? 0xffffffffffffffffULL : (0xffffffffffffffffULL << (64 - bits))));
  222. nm[1] &= Utils::hton((uint64_t) ((bits <= 64) ? 0ULL : (0xffffffffffffffffULL << (128 - bits))));
  223. Utils::copy<16>(r.as.sa_in6.sin6_addr.s6_addr, nm);
  224. }
  225. break;
  226. }
  227. return r;
  228. }
  229. bool InetAddress::isEqualPrefix(const InetAddress &addr) const noexcept
  230. {
  231. if (addr.as.ss.ss_family == as.ss.ss_family) {
  232. switch (as.ss.ss_family) {
  233. case AF_INET6: {
  234. const InetAddress mask(netmask());
  235. InetAddress addr_mask(addr.netmask());
  236. const uint8_t *const n = addr_mask.as.sa_in6.sin6_addr.s6_addr;
  237. const uint8_t *const m = mask.as.sa_in6.sin6_addr.s6_addr;
  238. const uint8_t *const a = addr.as.sa_in6.sin6_addr.s6_addr;
  239. const uint8_t *const b = as.sa_in6.sin6_addr.s6_addr;
  240. for (unsigned int i = 0;i < 16;++i) {
  241. if ((a[i] & m[i]) != (b[i] & n[i]))
  242. return false;
  243. }
  244. return true;
  245. }
  246. }
  247. }
  248. return false;
  249. }
  250. bool InetAddress::containsAddress(const InetAddress &addr) const noexcept
  251. {
  252. if (addr.as.ss.ss_family == as.ss.ss_family) {
  253. switch (as.ss.ss_family) {
  254. case AF_INET: {
  255. const unsigned int bits = netmaskBits();
  256. if (bits == 0)
  257. return true;
  258. return (
  259. (Utils::ntoh((uint32_t) addr.as.sa_in.sin_addr.s_addr) >> (32 - bits)) ==
  260. (Utils::ntoh((uint32_t) as.sa_in.sin_addr.s_addr) >> (32 - bits))
  261. );
  262. }
  263. case AF_INET6: {
  264. const InetAddress mask(netmask());
  265. const uint8_t *const m = mask.as.sa_in6.sin6_addr.s6_addr;
  266. const uint8_t *const a = addr.as.sa_in6.sin6_addr.s6_addr;
  267. const uint8_t *const b = as.sa_in6.sin6_addr.s6_addr;
  268. for (unsigned int i = 0;i < 16;++i) {
  269. if ((a[i] & m[i]) != b[i])
  270. return false;
  271. }
  272. return true;
  273. }
  274. }
  275. }
  276. return false;
  277. }
  278. bool InetAddress::isNetwork() const noexcept
  279. {
  280. switch (as.ss.ss_family) {
  281. case AF_INET: {
  282. unsigned int bits = netmaskBits();
  283. if (bits <= 0)
  284. return false;
  285. if (bits >= 32)
  286. return false;
  287. const uint32_t ip = Utils::ntoh((uint32_t) as.sa_in.sin_addr.s_addr);
  288. return ((ip & (0xffffffffU >> bits)) == 0);
  289. }
  290. case AF_INET6: {
  291. unsigned int bits = netmaskBits();
  292. if (bits <= 0)
  293. return false;
  294. if (bits >= 128)
  295. return false;
  296. const uint8_t *const ip = as.sa_in6.sin6_addr.s6_addr;
  297. unsigned int p = bits / 8;
  298. if ((ip[p++] & (0xffU >> (bits % 8))) != 0)
  299. return false;
  300. while (p < 16) {
  301. if (ip[p++])
  302. return false;
  303. }
  304. return true;
  305. }
  306. }
  307. return false;
  308. }
  309. int InetAddress::marshal(uint8_t data[ZT_INETADDRESS_MARSHAL_SIZE_MAX]) const noexcept
  310. {
  311. unsigned int port;
  312. switch (as.ss.ss_family) {
  313. case AF_INET:
  314. port = Utils::ntoh((uint16_t) reinterpret_cast<const sockaddr_in *>(this)->sin_port);
  315. data[0] = 4;
  316. data[1] = reinterpret_cast<const uint8_t *>(&as.sa_in.sin_addr.s_addr)[0];
  317. data[2] = reinterpret_cast<const uint8_t *>(&as.sa_in.sin_addr.s_addr)[1];
  318. data[3] = reinterpret_cast<const uint8_t *>(&as.sa_in.sin_addr.s_addr)[2];
  319. data[4] = reinterpret_cast<const uint8_t *>(&as.sa_in.sin_addr.s_addr)[3];
  320. data[5] = (uint8_t) (port >> 8U);
  321. data[6] = (uint8_t) port;
  322. return 7;
  323. case AF_INET6:
  324. port = Utils::ntoh((uint16_t) as.sa_in6.sin6_port);
  325. data[0] = 6;
  326. Utils::copy<16>(data + 1, as.sa_in6.sin6_addr.s6_addr);
  327. data[17] = (uint8_t) (port >> 8U);
  328. data[18] = (uint8_t) port;
  329. return 19;
  330. default:
  331. data[0] = 0;
  332. return 1;
  333. }
  334. }
  335. int InetAddress::unmarshal(const uint8_t *restrict data, const int len) noexcept
  336. {
  337. memoryZero(this);
  338. if (unlikely(len <= 0))
  339. return -1;
  340. switch (data[0]) {
  341. case 0:
  342. return 1;
  343. case 4:
  344. if (unlikely(len < 7))
  345. return -1;
  346. as.sa_in.sin_family = AF_INET;
  347. as.sa_in.sin_port = Utils::loadAsIsEndian<uint16_t>(data + 5);
  348. as.sa_in.sin_addr.s_addr = Utils::loadAsIsEndian<uint32_t>(data + 1);
  349. return 7;
  350. case 6:
  351. if (unlikely(len < 19))
  352. return -1;
  353. as.sa_in6.sin6_family = AF_INET6;
  354. as.sa_in6.sin6_port = Utils::loadAsIsEndian<uint16_t>(data + 17);
  355. Utils::copy<16>(as.sa_in6.sin6_addr.s6_addr, data + 1);
  356. return 19;
  357. default:
  358. return -1;
  359. }
  360. }
  361. InetAddress InetAddress::makeIpv6LinkLocal(const MAC &mac) noexcept
  362. {
  363. InetAddress r;
  364. r.as.sa_in6.sin6_family = AF_INET6;
  365. r.as.sa_in6.sin6_port = ZT_CONST_TO_BE_UINT16(64);
  366. r.as.sa_in6.sin6_addr.s6_addr[0] = 0xfe;
  367. r.as.sa_in6.sin6_addr.s6_addr[1] = 0x80;
  368. r.as.sa_in6.sin6_addr.s6_addr[2] = 0x00;
  369. r.as.sa_in6.sin6_addr.s6_addr[3] = 0x00;
  370. r.as.sa_in6.sin6_addr.s6_addr[4] = 0x00;
  371. r.as.sa_in6.sin6_addr.s6_addr[5] = 0x00;
  372. r.as.sa_in6.sin6_addr.s6_addr[6] = 0x00;
  373. r.as.sa_in6.sin6_addr.s6_addr[7] = 0x00;
  374. r.as.sa_in6.sin6_addr.s6_addr[8] = mac[0] & 0xfdU;
  375. r.as.sa_in6.sin6_addr.s6_addr[9] = mac[1];
  376. r.as.sa_in6.sin6_addr.s6_addr[10] = mac[2];
  377. r.as.sa_in6.sin6_addr.s6_addr[11] = 0xff;
  378. r.as.sa_in6.sin6_addr.s6_addr[12] = 0xfe;
  379. r.as.sa_in6.sin6_addr.s6_addr[13] = mac[3];
  380. r.as.sa_in6.sin6_addr.s6_addr[14] = mac[4];
  381. r.as.sa_in6.sin6_addr.s6_addr[15] = mac[5];
  382. return r;
  383. }
  384. InetAddress InetAddress::makeIpv6rfc4193(uint64_t nwid, uint64_t zeroTierAddress) noexcept
  385. {
  386. InetAddress r;
  387. r.as.sa_in6.sin6_family = AF_INET6;
  388. r.as.sa_in6.sin6_port = ZT_CONST_TO_BE_UINT16(88); // /88 includes 0xfd + network ID, discriminating by device ID below that
  389. r.as.sa_in6.sin6_addr.s6_addr[0] = 0xfd;
  390. r.as.sa_in6.sin6_addr.s6_addr[1] = (uint8_t) (nwid >> 56U);
  391. r.as.sa_in6.sin6_addr.s6_addr[2] = (uint8_t) (nwid >> 48U);
  392. r.as.sa_in6.sin6_addr.s6_addr[3] = (uint8_t) (nwid >> 40U);
  393. r.as.sa_in6.sin6_addr.s6_addr[4] = (uint8_t) (nwid >> 32U);
  394. r.as.sa_in6.sin6_addr.s6_addr[5] = (uint8_t) (nwid >> 24U);
  395. r.as.sa_in6.sin6_addr.s6_addr[6] = (uint8_t) (nwid >> 16U);
  396. r.as.sa_in6.sin6_addr.s6_addr[7] = (uint8_t) (nwid >> 8U);
  397. r.as.sa_in6.sin6_addr.s6_addr[8] = (uint8_t) nwid;
  398. r.as.sa_in6.sin6_addr.s6_addr[9] = 0x99;
  399. r.as.sa_in6.sin6_addr.s6_addr[10] = 0x93;
  400. r.as.sa_in6.sin6_addr.s6_addr[11] = (uint8_t) (zeroTierAddress >> 32U);
  401. r.as.sa_in6.sin6_addr.s6_addr[12] = (uint8_t) (zeroTierAddress >> 24U);
  402. r.as.sa_in6.sin6_addr.s6_addr[13] = (uint8_t) (zeroTierAddress >> 16U);
  403. r.as.sa_in6.sin6_addr.s6_addr[14] = (uint8_t) (zeroTierAddress >> 8U);
  404. r.as.sa_in6.sin6_addr.s6_addr[15] = (uint8_t) zeroTierAddress;
  405. return r;
  406. }
  407. InetAddress InetAddress::makeIpv66plane(uint64_t nwid, uint64_t zeroTierAddress) noexcept
  408. {
  409. nwid ^= (nwid >> 32U);
  410. InetAddress r;
  411. r.as.sa_in6.sin6_family = AF_INET6;
  412. r.as.sa_in6.sin6_port = ZT_CONST_TO_BE_UINT16(40);
  413. r.as.sa_in6.sin6_addr.s6_addr[0] = 0xfc;
  414. r.as.sa_in6.sin6_addr.s6_addr[1] = (uint8_t) (nwid >> 24U);
  415. r.as.sa_in6.sin6_addr.s6_addr[2] = (uint8_t) (nwid >> 16U);
  416. r.as.sa_in6.sin6_addr.s6_addr[3] = (uint8_t) (nwid >> 8U);
  417. r.as.sa_in6.sin6_addr.s6_addr[4] = (uint8_t) nwid;
  418. r.as.sa_in6.sin6_addr.s6_addr[5] = (uint8_t) (zeroTierAddress >> 32U);
  419. r.as.sa_in6.sin6_addr.s6_addr[6] = (uint8_t) (zeroTierAddress >> 24U);
  420. r.as.sa_in6.sin6_addr.s6_addr[7] = (uint8_t) (zeroTierAddress >> 16U);
  421. r.as.sa_in6.sin6_addr.s6_addr[8] = (uint8_t) (zeroTierAddress >> 8U);
  422. r.as.sa_in6.sin6_addr.s6_addr[9] = (uint8_t) zeroTierAddress;
  423. r.as.sa_in6.sin6_addr.s6_addr[15] = 0x01;
  424. return r;
  425. }
  426. } // namespace ZeroTier