InetAddress.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  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 <stdio.h>
  27. #include <string.h>
  28. #include <stdint.h>
  29. #include <string>
  30. #include "Constants.hpp"
  31. #include "InetAddress.hpp"
  32. #include "Utils.hpp"
  33. namespace ZeroTier {
  34. const InetAddress InetAddress::LO4((const void *)("\x7f\x00\x00\x01"),4,0);
  35. const InetAddress InetAddress::LO6((const void *)("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"),16,0);
  36. InetAddress::IpScope InetAddress::ipScope() const
  37. throw()
  38. {
  39. switch(ss_family) {
  40. case AF_INET: {
  41. const uint32_t ip = Utils::ntoh((uint32_t)reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr);
  42. switch(ip >> 24) {
  43. case 0x00: return IP_SCOPE_NONE; // 0.0.0.0/8 (reserved, never used)
  44. case 0x06: return IP_SCOPE_PSEUDOPRIVATE; // 6.0.0.0/8 (US Army)
  45. case 0x0a: return IP_SCOPE_PRIVATE; // 10.0.0.0/8
  46. case 0x0b: return IP_SCOPE_PSEUDOPRIVATE; // 11.0.0.0/8 (US DoD)
  47. case 0x15: return IP_SCOPE_PSEUDOPRIVATE; // 21.0.0.0/8 (US DDN-RVN)
  48. case 0x16: return IP_SCOPE_PSEUDOPRIVATE; // 22.0.0.0/8 (US DISA)
  49. case 0x19: return IP_SCOPE_PSEUDOPRIVATE; // 25.0.0.0/8 (UK Ministry of Defense)
  50. case 0x1a: return IP_SCOPE_PSEUDOPRIVATE; // 26.0.0.0/8 (US DISA)
  51. case 0x1c: return IP_SCOPE_PSEUDOPRIVATE; // 28.0.0.0/8 (US DSI-North)
  52. case 0x1d: return IP_SCOPE_PSEUDOPRIVATE; // 29.0.0.0/8 (US DISA)
  53. case 0x1e: return IP_SCOPE_PSEUDOPRIVATE; // 30.0.0.0/8 (US DISA)
  54. case 0x2c: return IP_SCOPE_PSEUDOPRIVATE; // 44.0.0.0/8 (Amateur Radio)
  55. case 0x33: return IP_SCOPE_PSEUDOPRIVATE; // 51.0.0.0/8 (UK Department of Social Security)
  56. case 0x37: return IP_SCOPE_PSEUDOPRIVATE; // 55.0.0.0/8 (US DoD)
  57. case 0x38: return IP_SCOPE_PSEUDOPRIVATE; // 56.0.0.0/8 (US Postal Service)
  58. case 0x64:
  59. if ((ip & 0xffc00000) == 0x64400000) return IP_SCOPE_SHARED; // 100.64.0.0/10
  60. break;
  61. case 0x7f: return IP_SCOPE_LOOPBACK; // 127.0.0.0/8
  62. case 0xa9:
  63. if ((ip & 0xffff0000) == 0xa9fe0000) return IP_SCOPE_LINK_LOCAL; // 169.254.0.0/16
  64. break;
  65. case 0xac:
  66. if ((ip & 0xfff00000) == 0xac100000) return IP_SCOPE_PRIVATE; // 172.16.0.0/12
  67. break;
  68. case 0xc0:
  69. if ((ip & 0xffff0000) == 0xc0a80000) return IP_SCOPE_PRIVATE; // 192.168.0.0/16
  70. break;
  71. case 0xff: return IP_SCOPE_NONE; // 255.0.0.0/8 (broadcast, or unused/unusable)
  72. }
  73. switch(ip >> 28) {
  74. case 0xe: return IP_SCOPE_MULTICAST; // 224.0.0.0/4
  75. case 0xf: return IP_SCOPE_PSEUDOPRIVATE; // 240.0.0.0/4 ("reserved," usually unusable)
  76. }
  77. return IP_SCOPE_GLOBAL;
  78. } break;
  79. case AF_INET6: {
  80. const unsigned char *ip = reinterpret_cast<const unsigned char *>(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr);
  81. if ((ip[0] & 0xf0) == 0xf0) {
  82. if (ip[0] == 0xff) return IP_SCOPE_MULTICAST; // ff00::/8
  83. if ((ip[0] == 0xfe)&&((ip[1] & 0xc0) == 0x80)) {
  84. unsigned int k = 2;
  85. while ((!ip[k])&&(k < 15)) ++k;
  86. if ((k == 15)&&(ip[15] == 0x01))
  87. return IP_SCOPE_LOOPBACK; // fe80::1/128
  88. else return IP_SCOPE_LINK_LOCAL; // fe80::/10
  89. }
  90. if ((ip[0] & 0xfe) == 0xfc) return IP_SCOPE_PRIVATE; // fc00::/7
  91. }
  92. unsigned int k = 0;
  93. while ((!ip[k])&&(k < 15)) ++k;
  94. if (k == 15) { // all 0's except last byte
  95. if (ip[15] == 0x01) return IP_SCOPE_LOOPBACK; // ::1/128
  96. if (ip[15] == 0x00) return IP_SCOPE_NONE; // ::/128
  97. }
  98. return IP_SCOPE_GLOBAL;
  99. } break;
  100. }
  101. return IP_SCOPE_NONE;
  102. }
  103. void InetAddress::set(const std::string &ip,unsigned int port)
  104. throw()
  105. {
  106. memset(this,0,sizeof(InetAddress));
  107. if (ip.find(':') != std::string::npos) {
  108. struct sockaddr_in6 *sin6 = reinterpret_cast<struct sockaddr_in6 *>(this);
  109. ss_family = AF_INET6;
  110. sin6->sin6_port = Utils::hton((uint16_t)port);
  111. if (inet_pton(AF_INET6,ip.c_str(),(void *)&(sin6->sin6_addr.s6_addr)) <= 0)
  112. memset(this,0,sizeof(InetAddress));
  113. } else if (ip.find('.') != std::string::npos) {
  114. struct sockaddr_in *sin = reinterpret_cast<struct sockaddr_in *>(this);
  115. ss_family = AF_INET;
  116. sin->sin_port = Utils::hton((uint16_t)port);
  117. if (inet_pton(AF_INET,ip.c_str(),(void *)&(sin->sin_addr.s_addr)) <= 0)
  118. memset(this,0,sizeof(InetAddress));
  119. }
  120. }
  121. void InetAddress::set(const void *ipBytes,unsigned int ipLen,unsigned int port)
  122. throw()
  123. {
  124. memset(this,0,sizeof(InetAddress));
  125. if (ipLen == 4) {
  126. uint32_t ipb[1];
  127. memcpy(ipb,ipBytes,4);
  128. ss_family = AF_INET;
  129. reinterpret_cast<struct sockaddr_in *>(this)->sin_addr.s_addr = ipb[0];
  130. reinterpret_cast<struct sockaddr_in *>(this)->sin_port = Utils::hton((uint16_t)port);
  131. } else if (ipLen == 16) {
  132. ss_family = AF_INET6;
  133. memcpy(reinterpret_cast<struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,ipBytes,16);
  134. reinterpret_cast<struct sockaddr_in6 *>(this)->sin6_port = Utils::hton((uint16_t)port);
  135. }
  136. }
  137. std::string InetAddress::toString() const
  138. {
  139. char buf[128];
  140. switch(ss_family) {
  141. case AF_INET:
  142. Utils::snprintf(buf,sizeof(buf),"%d.%d.%d.%d/%d",
  143. (int)(reinterpret_cast<const unsigned char *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr)))[0],
  144. (int)(reinterpret_cast<const unsigned char *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr)))[1],
  145. (int)(reinterpret_cast<const unsigned char *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr)))[2],
  146. (int)(reinterpret_cast<const unsigned char *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr)))[3],
  147. (int)Utils::ntoh((uint16_t)(reinterpret_cast<const struct sockaddr_in *>(this)->sin_port))
  148. );
  149. return std::string(buf);
  150. case AF_INET6:
  151. Utils::snprintf(buf,sizeof(buf),"%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x/%d",
  152. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[0]),
  153. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[1]),
  154. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[2]),
  155. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[3]),
  156. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[4]),
  157. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[5]),
  158. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[6]),
  159. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[7]),
  160. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[8]),
  161. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[9]),
  162. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[10]),
  163. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[11]),
  164. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[12]),
  165. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[13]),
  166. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[14]),
  167. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[15]),
  168. (int)Utils::ntoh((uint16_t)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_port))
  169. );
  170. return std::string(buf);
  171. }
  172. return std::string();
  173. }
  174. std::string InetAddress::toIpString() const
  175. {
  176. char buf[128];
  177. switch(ss_family) {
  178. case AF_INET:
  179. Utils::snprintf(buf,sizeof(buf),"%d.%d.%d.%d",
  180. (int)(reinterpret_cast<const unsigned char *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr)))[0],
  181. (int)(reinterpret_cast<const unsigned char *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr)))[1],
  182. (int)(reinterpret_cast<const unsigned char *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr)))[2],
  183. (int)(reinterpret_cast<const unsigned char *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr)))[3]
  184. );
  185. return std::string(buf);
  186. case AF_INET6:
  187. Utils::snprintf(buf,sizeof(buf),"%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
  188. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[0]),
  189. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[1]),
  190. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[2]),
  191. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[3]),
  192. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[4]),
  193. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[5]),
  194. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[6]),
  195. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[7]),
  196. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[8]),
  197. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[9]),
  198. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[10]),
  199. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[11]),
  200. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[12]),
  201. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[13]),
  202. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[14]),
  203. (int)(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr[15])
  204. );
  205. return std::string(buf);
  206. }
  207. return std::string();
  208. }
  209. void InetAddress::fromString(const std::string &ipSlashPort)
  210. {
  211. const std::size_t slashAt = ipSlashPort.find('/');
  212. if (slashAt == std::string::npos) {
  213. set(ipSlashPort,0);
  214. } else {
  215. long p = strtol(ipSlashPort.substr(slashAt+1).c_str(),(char **)0,10);
  216. if ((p > 0)&&(p <= 0xffff))
  217. set(ipSlashPort.substr(0,slashAt),(unsigned int)p);
  218. else set(ipSlashPort.substr(0,slashAt),0);
  219. }
  220. }
  221. InetAddress InetAddress::netmask() const
  222. {
  223. InetAddress r(*this);
  224. switch(r.ss_family) {
  225. case AF_INET:
  226. reinterpret_cast<struct sockaddr_in *>(&r)->sin_addr.s_addr = Utils::hton((uint32_t)(0xffffffff << (32 - netmaskBits())));
  227. break;
  228. case AF_INET6: {
  229. uint64_t nm[2];
  230. const unsigned int bits = netmaskBits();
  231. if(bits) {
  232. nm[0] = Utils::hton((uint64_t)((bits >= 64) ? 0xffffffffffffffffULL : (0xffffffffffffffffULL << (64 - bits))));
  233. nm[1] = Utils::hton((uint64_t)((bits <= 64) ? 0ULL : (0xffffffffffffffffULL << (128 - bits))));
  234. }
  235. else {
  236. nm[0] = 0;
  237. nm[1] = 0;
  238. }
  239. memcpy(reinterpret_cast<struct sockaddr_in6 *>(&r)->sin6_addr.s6_addr,nm,16);
  240. } break;
  241. }
  242. return r;
  243. }
  244. InetAddress InetAddress::broadcast() const
  245. {
  246. if (ss_family == AF_INET) {
  247. InetAddress r(*this);
  248. reinterpret_cast<struct sockaddr_in *>(&r)->sin_addr.s_addr |= Utils::hton((uint32_t)(0xffffffff >> netmaskBits()));
  249. return r;
  250. }
  251. return InetAddress();
  252. }
  253. InetAddress InetAddress::network() const
  254. {
  255. InetAddress r(*this);
  256. switch(r.ss_family) {
  257. case AF_INET:
  258. reinterpret_cast<struct sockaddr_in *>(&r)->sin_addr.s_addr &= Utils::hton((uint32_t)(0xffffffff << (32 - netmaskBits())));
  259. break;
  260. case AF_INET6: {
  261. uint64_t nm[2];
  262. const unsigned int bits = netmaskBits();
  263. memcpy(nm,reinterpret_cast<struct sockaddr_in6 *>(&r)->sin6_addr.s6_addr,16);
  264. nm[0] &= Utils::hton((uint64_t)((bits >= 64) ? 0xffffffffffffffffULL : (0xffffffffffffffffULL << (64 - bits))));
  265. nm[1] &= Utils::hton((uint64_t)((bits <= 64) ? 0ULL : (0xffffffffffffffffULL << (128 - bits))));
  266. memcpy(reinterpret_cast<struct sockaddr_in6 *>(&r)->sin6_addr.s6_addr,nm,16);
  267. } break;
  268. }
  269. return r;
  270. }
  271. #ifdef ZT_SDK
  272. bool InetAddress::isEqualPrefix(const InetAddress &addr) const
  273. {
  274. if (addr.ss_family == ss_family) {
  275. switch(ss_family) {
  276. case AF_INET6: {
  277. const InetAddress mask(netmask());
  278. InetAddress addr_mask(addr.netmask());
  279. const uint8_t *n = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&addr_mask)->sin6_addr.s6_addr);
  280. const uint8_t *m = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&mask)->sin6_addr.s6_addr);
  281. const uint8_t *a = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&addr)->sin6_addr.s6_addr);
  282. const uint8_t *b = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr);
  283. for(unsigned int i=0;i<16;++i) {
  284. if ((a[i] & m[i]) != (b[i] & n[i]))
  285. return false;
  286. }
  287. return true;
  288. }
  289. }
  290. }
  291. return false;
  292. }
  293. #endif
  294. bool InetAddress::containsAddress(const InetAddress &addr) const
  295. {
  296. if (addr.ss_family == ss_family) {
  297. switch(ss_family) {
  298. case AF_INET: {
  299. const unsigned int bits = netmaskBits();
  300. if (bits == 0)
  301. return true;
  302. return ( (Utils::ntoh((uint32_t)reinterpret_cast<const struct sockaddr_in *>(&addr)->sin_addr.s_addr) >> (32 - bits)) == (Utils::ntoh((uint32_t)reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr) >> (32 - bits)) );
  303. }
  304. case AF_INET6: {
  305. const InetAddress mask(netmask());
  306. const uint8_t *m = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&mask)->sin6_addr.s6_addr);
  307. const uint8_t *a = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&addr)->sin6_addr.s6_addr);
  308. const uint8_t *b = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr);
  309. for(unsigned int i=0;i<16;++i) {
  310. if ((a[i] & m[i]) != b[i])
  311. return false;
  312. }
  313. return true;
  314. }
  315. }
  316. }
  317. return false;
  318. }
  319. bool InetAddress::isNetwork() const
  320. throw()
  321. {
  322. switch(ss_family) {
  323. case AF_INET: {
  324. unsigned int bits = netmaskBits();
  325. if (bits <= 0)
  326. return false;
  327. if (bits >= 32)
  328. return false;
  329. uint32_t ip = Utils::ntoh((uint32_t)reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr);
  330. return ((ip & (0xffffffff >> bits)) == 0);
  331. }
  332. case AF_INET6: {
  333. unsigned int bits = netmaskBits();
  334. if (bits <= 0)
  335. return false;
  336. if (bits >= 128)
  337. return false;
  338. const unsigned char *ip = reinterpret_cast<const unsigned char *>(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr);
  339. unsigned int p = bits / 8;
  340. if ((ip[p++] & (0xff >> (bits % 8))) != 0)
  341. return false;
  342. while (p < 16) {
  343. if (ip[p++])
  344. return false;
  345. }
  346. return true;
  347. }
  348. }
  349. return false;
  350. }
  351. bool InetAddress::operator==(const InetAddress &a) const
  352. throw()
  353. {
  354. if (ss_family == a.ss_family) {
  355. switch(ss_family) {
  356. case AF_INET:
  357. return (
  358. (reinterpret_cast<const struct sockaddr_in *>(this)->sin_port == reinterpret_cast<const struct sockaddr_in *>(&a)->sin_port)&&
  359. (reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr == reinterpret_cast<const struct sockaddr_in *>(&a)->sin_addr.s_addr));
  360. break;
  361. case AF_INET6:
  362. return (
  363. (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_port == reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_port)&&
  364. (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_flowinfo == reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_flowinfo)&&
  365. (memcmp(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_addr.s6_addr,16) == 0)&&
  366. (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_scope_id == reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_scope_id));
  367. break;
  368. default:
  369. return (memcmp(this,&a,sizeof(InetAddress)) == 0);
  370. }
  371. }
  372. return false;
  373. }
  374. bool InetAddress::operator<(const InetAddress &a) const
  375. throw()
  376. {
  377. if (ss_family < a.ss_family)
  378. return true;
  379. else if (ss_family == a.ss_family) {
  380. switch(ss_family) {
  381. case AF_INET:
  382. if (reinterpret_cast<const struct sockaddr_in *>(this)->sin_port < reinterpret_cast<const struct sockaddr_in *>(&a)->sin_port)
  383. return true;
  384. else if (reinterpret_cast<const struct sockaddr_in *>(this)->sin_port == reinterpret_cast<const struct sockaddr_in *>(&a)->sin_port) {
  385. if (reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr < reinterpret_cast<const struct sockaddr_in *>(&a)->sin_addr.s_addr)
  386. return true;
  387. }
  388. break;
  389. case AF_INET6:
  390. if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_port < reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_port)
  391. return true;
  392. else if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_port == reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_port) {
  393. if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_flowinfo < reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_flowinfo)
  394. return true;
  395. else if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_flowinfo == reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_flowinfo) {
  396. if (memcmp(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_addr.s6_addr,16) < 0)
  397. return true;
  398. else if (memcmp(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_addr.s6_addr,16) == 0) {
  399. if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_scope_id < reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_scope_id)
  400. return true;
  401. }
  402. }
  403. }
  404. break;
  405. default:
  406. return (memcmp(this,&a,sizeof(InetAddress)) < 0);
  407. }
  408. }
  409. return false;
  410. }
  411. InetAddress InetAddress::makeIpv6LinkLocal(const MAC &mac)
  412. {
  413. struct sockaddr_in6 sin6;
  414. sin6.sin6_family = AF_INET6;
  415. sin6.sin6_addr.s6_addr[0] = 0xfe;
  416. sin6.sin6_addr.s6_addr[1] = 0x80;
  417. sin6.sin6_addr.s6_addr[2] = 0x00;
  418. sin6.sin6_addr.s6_addr[3] = 0x00;
  419. sin6.sin6_addr.s6_addr[4] = 0x00;
  420. sin6.sin6_addr.s6_addr[5] = 0x00;
  421. sin6.sin6_addr.s6_addr[6] = 0x00;
  422. sin6.sin6_addr.s6_addr[7] = 0x00;
  423. sin6.sin6_addr.s6_addr[8] = mac[0] & 0xfd;
  424. sin6.sin6_addr.s6_addr[9] = mac[1];
  425. sin6.sin6_addr.s6_addr[10] = mac[2];
  426. sin6.sin6_addr.s6_addr[11] = 0xff;
  427. sin6.sin6_addr.s6_addr[12] = 0xfe;
  428. sin6.sin6_addr.s6_addr[13] = mac[3];
  429. sin6.sin6_addr.s6_addr[14] = mac[4];
  430. sin6.sin6_addr.s6_addr[15] = mac[5];
  431. sin6.sin6_port = Utils::hton((uint16_t)64);
  432. return InetAddress(sin6);
  433. }
  434. InetAddress InetAddress::makeIpv6rfc4193(uint64_t nwid,uint64_t zeroTierAddress)
  435. {
  436. InetAddress r;
  437. struct sockaddr_in6 *const sin6 = reinterpret_cast<struct sockaddr_in6 *>(&r);
  438. sin6->sin6_family = AF_INET6;
  439. sin6->sin6_addr.s6_addr[0] = 0xfd;
  440. sin6->sin6_addr.s6_addr[1] = (uint8_t)(nwid >> 56);
  441. sin6->sin6_addr.s6_addr[2] = (uint8_t)(nwid >> 48);
  442. sin6->sin6_addr.s6_addr[3] = (uint8_t)(nwid >> 40);
  443. sin6->sin6_addr.s6_addr[4] = (uint8_t)(nwid >> 32);
  444. sin6->sin6_addr.s6_addr[5] = (uint8_t)(nwid >> 24);
  445. sin6->sin6_addr.s6_addr[6] = (uint8_t)(nwid >> 16);
  446. sin6->sin6_addr.s6_addr[7] = (uint8_t)(nwid >> 8);
  447. sin6->sin6_addr.s6_addr[8] = (uint8_t)nwid;
  448. sin6->sin6_addr.s6_addr[9] = 0x99;
  449. sin6->sin6_addr.s6_addr[10] = 0x93;
  450. sin6->sin6_addr.s6_addr[11] = (uint8_t)(zeroTierAddress >> 32);
  451. sin6->sin6_addr.s6_addr[12] = (uint8_t)(zeroTierAddress >> 24);
  452. sin6->sin6_addr.s6_addr[13] = (uint8_t)(zeroTierAddress >> 16);
  453. sin6->sin6_addr.s6_addr[14] = (uint8_t)(zeroTierAddress >> 8);
  454. sin6->sin6_addr.s6_addr[15] = (uint8_t)zeroTierAddress;
  455. sin6->sin6_port = Utils::hton((uint16_t)88); // /88 includes 0xfd + network ID, discriminating by device ID below that
  456. return r;
  457. }
  458. InetAddress InetAddress::makeIpv66plane(uint64_t nwid,uint64_t zeroTierAddress)
  459. {
  460. nwid ^= (nwid >> 32);
  461. InetAddress r;
  462. struct sockaddr_in6 *const sin6 = reinterpret_cast<struct sockaddr_in6 *>(&r);
  463. sin6->sin6_family = AF_INET6;
  464. sin6->sin6_addr.s6_addr[0] = 0xfc;
  465. sin6->sin6_addr.s6_addr[1] = (uint8_t)(nwid >> 24);
  466. sin6->sin6_addr.s6_addr[2] = (uint8_t)(nwid >> 16);
  467. sin6->sin6_addr.s6_addr[3] = (uint8_t)(nwid >> 8);
  468. sin6->sin6_addr.s6_addr[4] = (uint8_t)nwid;
  469. sin6->sin6_addr.s6_addr[5] = (uint8_t)(zeroTierAddress >> 32);
  470. sin6->sin6_addr.s6_addr[6] = (uint8_t)(zeroTierAddress >> 24);
  471. sin6->sin6_addr.s6_addr[7] = (uint8_t)(zeroTierAddress >> 16);
  472. sin6->sin6_addr.s6_addr[8] = (uint8_t)(zeroTierAddress >> 8);
  473. sin6->sin6_addr.s6_addr[9] = (uint8_t)zeroTierAddress;
  474. sin6->sin6_addr.s6_addr[15] = 0x01;
  475. sin6->sin6_port = Utils::hton((uint16_t)40);
  476. return r;
  477. }
  478. } // namespace ZeroTier