From 41f9bdc5db0ac1c7ff243810adf61ee99208942b Mon Sep 17 00:00:00 2001 From: lison Date: Fri, 28 Jul 2023 00:43:31 +0800 Subject: [PATCH 1/5] Update build.sh (#2068) fix mkwork compilation errors --- attic/world/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/attic/world/build.sh b/attic/world/build.sh index d8800cd4c..f3bcfabc9 100755 --- a/attic/world/build.sh +++ b/attic/world/build.sh @@ -1,3 +1,3 @@ #!/bin/bash -c++ -std=c++11 -I../.. -I.. -g -o mkworld ../../node/C25519.cpp ../../node/Salsa20.cpp ../../node/SHA512.cpp ../../node/Identity.cpp ../../node/Utils.cpp ../../node/InetAddress.cpp ../../osdep/OSUtils.cpp mkworld.cpp -lm +c++ -std=c++11 -I../.. -I../../ext -I.. -g -o mkworld ../../node/C25519.cpp ../../node/Salsa20.cpp ../../node/SHA512.cpp ../../node/Identity.cpp ../../node/Utils.cpp ../../node/InetAddress.cpp ../../osdep/OSUtils.cpp mkworld.cpp -lm From fb6af1971bebed2382ac5f93287988144ae51afb Mon Sep 17 00:00:00 2001 From: travisladuke Date: Tue, 25 Jul 2023 16:03:29 -0700 Subject: [PATCH 2/5] Fix network DNS on macOS It stopped working for ipv4 only networks in Monterey. See #1696 We add some config like so to System Configuration ``` scutil show State:/Network/Service/9bee8941b5xxxxxx/IPv4 { Addresses : { 0 : 10.2.1.36 } InterfaceName : feth4823 Router : 10.2.1.36 ServerAddress : 127.0.0.1 } ``` --- osdep/MacDNSHelper.hpp | 6 +- osdep/MacDNSHelper.mm | 129 +++++++++++++++++++++++++++++++++++++-- osdep/MacEthernetTap.cpp | 3 +- service/OneService.cpp | 7 ++- 4 files changed, 137 insertions(+), 8 deletions(-) diff --git a/osdep/MacDNSHelper.hpp b/osdep/MacDNSHelper.hpp index 2fa283621..fafbeec54 100644 --- a/osdep/MacDNSHelper.hpp +++ b/osdep/MacDNSHelper.hpp @@ -12,8 +12,10 @@ class MacDNSHelper public: static void setDNS(uint64_t nwid, const char *domain, const std::vector &servers); static void removeDNS(uint64_t nwid); - static bool addIps(uint64_t nwid, const MAC mac, const char *dev, const std::vector &addrs); - static bool removeIps(uint64_t nwid); + static bool addIps4(uint64_t nwid, const MAC mac, const char *dev, const std::vector &addrs); + static bool addIps6(uint64_t nwid, const MAC mac, const char *dev, const std::vector &addrs); + static bool removeIps4(uint64_t nwid); + static bool removeIps6(uint64_t nwid); }; } diff --git a/osdep/MacDNSHelper.mm b/osdep/MacDNSHelper.mm index 5d6d14927..66de9e8cb 100644 --- a/osdep/MacDNSHelper.mm +++ b/osdep/MacDNSHelper.mm @@ -95,9 +95,114 @@ void MacDNSHelper::removeDNS(uint64_t nwid) // Originally I planned to put all the v6 ip addresses from the network into the config. // But only the link local address is necessary and sufficient. Added other v6 addresses // doesn't do anything. -bool MacDNSHelper::addIps(uint64_t nwid, const MAC mac, const char *dev, const std::vector& addrs) -{ +// +// As of Monterey we need IPv4 set up too. +bool MacDNSHelper::addIps4(uint64_t nwid, const MAC mac, const char *dev, const std::vector& addrs) +{ + const char* ipStr = {0}; + const char* ipStr2 = {0}; + char buf2[256] = {0}; + + bool hasV4 = false; + for (unsigned int i = 0; i < addrs.size(); ++i) { + if (addrs[i].isV4()) { + hasV4 = true; + + ipStr = addrs[i].toIpString(buf2); + ipStr2 = addrs[i].toIpString(buf2); + + break; + } + } + + if (!hasV4) { + MacDNSHelper::removeIps4(nwid); + return true; + } + + + SCDynamicStoreRef ds = SCDynamicStoreCreate(NULL, CFSTR("zerotier"), NULL, NULL); + char buf[256] = { 0 }; + sprintf(buf, "State:/Network/Service/%.16llx/IPv4", nwid); + + + CFStringRef key = CFStringCreateWithCString(NULL, buf, kCFStringEncodingUTF8); + + CFStringRef cfaddr = CFStringCreateWithCString(NULL, ipStr, kCFStringEncodingUTF8); + CFArrayRef addrArray = CFArrayCreate(NULL, (const void**)&cfaddr, 1, &kCFTypeArrayCallBacks); + + CFStringRef cfdev = CFStringCreateWithCString(NULL, dev, kCFStringEncodingUTF8); + + CFStringRef cfserver = CFStringCreateWithCString(NULL, "127.0.0.1", kCFStringEncodingUTF8); + CFStringRef cfrouter = CFStringCreateWithCString(NULL, ipStr2, kCFStringEncodingUTF8); + + const int SIZE = 4; + CFStringRef keys[SIZE]; + keys[0] = CFSTR("Addresses"); + keys[1] = CFSTR("InterfaceName"); + keys[2] = CFSTR("ServerAddress"); + keys[3] = CFSTR("Router"); + + CFTypeRef values[SIZE]; + values[0] = addrArray; + values[1] = cfdev; + values[2] = cfserver; + values[3] = cfrouter; + + + CFDictionaryRef dict = CFDictionaryCreate(NULL, + (const void**)keys, (const void**)values, SIZE, &kCFCopyStringDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + // CFDictionaryApplyFunction(dict, printKeys, NULL); + + CFArrayRef list = SCDynamicStoreCopyKeyList(ds, key); + CFIndex i = 0, j = CFArrayGetCount(list); + bool addrsChanged = true; + CFPropertyListRef oldAddrs = NULL; + + bool ret = TRUE; + if (j > 0) { + oldAddrs = SCDynamicStoreCopyValue(ds, (CFStringRef)CFArrayGetValueAtIndex(list, i)); + addrsChanged = !CFEqual(oldAddrs,dict); + } + if (addrsChanged) { + if (j <= 0) { + ret &= SCDynamicStoreAddValue(ds, key, dict); + } else { + ret &= SCDynamicStoreSetValue(ds, (CFStringRef)CFArrayGetValueAtIndex(list, i), dict); + } + if (!ret) { + fprintf(stderr, "Error writing IPv6 configuration\n"); + } + } + if (oldAddrs != NULL) { + CFRelease(oldAddrs); + } + + CFRelease(cfaddr); + + CFRelease(addrArray); + CFRelease(cfdev); + CFRelease(cfserver); + CFRelease(cfrouter); + + CFRelease(ds); + CFRelease(key); + + // for (unsigned int i = 0; i < SIZE; ++i) { + // values[i] = NULL; + // } + + CFRelease(list); + CFRelease(dict); + + return ret; + +} +bool MacDNSHelper::addIps6(uint64_t nwid, const MAC mac, const char *dev, const std::vector& addrs) +{ bool hasV6 = false; for (unsigned int i = 0; i < addrs.size(); ++i) { if (addrs[i].isV6()) { @@ -107,7 +212,7 @@ bool MacDNSHelper::addIps(uint64_t nwid, const MAC mac, const char *dev, const s } if (!hasV6) { - MacDNSHelper::removeIps(nwid); + MacDNSHelper::removeIps6(nwid); return true; } @@ -204,7 +309,7 @@ bool MacDNSHelper::addIps(uint64_t nwid, const MAC mac, const char *dev, const s return ret; } -bool MacDNSHelper::removeIps(uint64_t nwid) +bool MacDNSHelper::removeIps6(uint64_t nwid) { SCDynamicStoreRef ds = SCDynamicStoreCreate(NULL, CFSTR("zerotier"), NULL, NULL); @@ -218,4 +323,20 @@ bool MacDNSHelper::removeIps(uint64_t nwid) return res; } + +bool MacDNSHelper::removeIps4(uint64_t nwid) +{ + SCDynamicStoreRef ds = SCDynamicStoreCreate(NULL, CFSTR("zerotier"), NULL, NULL); + + char buf[256] = {0}; + sprintf(buf, "State:/Network/Service/%.16llx/IPv4", nwid); + CFStringRef key = CFStringCreateWithCString(NULL, buf, kCFStringEncodingUTF8); + bool res = SCDynamicStoreRemoveValue(ds, key); + CFRelease(key); + CFRelease(ds); + + return res; +} + + } diff --git a/osdep/MacEthernetTap.cpp b/osdep/MacEthernetTap.cpp index 392f222b8..37f27f87a 100644 --- a/osdep/MacEthernetTap.cpp +++ b/osdep/MacEthernetTap.cpp @@ -245,7 +245,8 @@ MacEthernetTap::~MacEthernetTap() pid_t pid0,pid1; MacDNSHelper::removeDNS(_nwid); - MacDNSHelper::removeIps(_nwid); + MacDNSHelper::removeIps4(_nwid); + MacDNSHelper::removeIps6(_nwid); Mutex::Lock _gl(globalTapCreateLock); ::write(_shutdownSignalPipe[1],"\0",1); // causes thread to exit diff --git a/service/OneService.cpp b/service/OneService.cpp index edaca9c8c..ead7a8346 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -2531,8 +2531,13 @@ public: } #ifdef __APPLE__ - if (!MacDNSHelper::addIps(n.config().nwid, n.config().mac, n.tap()->deviceName().c_str(), newManagedIps)) + if (!MacDNSHelper::addIps6(n.config().nwid, n.config().mac, n.tap()->deviceName().c_str(), newManagedIps)) { fprintf(stderr, "ERROR: unable to add v6 addresses to system configuration" ZT_EOL_S); + } + + if (!MacDNSHelper::addIps4(n.config().nwid, n.config().mac, n.tap()->deviceName().c_str(), newManagedIps)) { + fprintf(stderr, "ERROR: unable to add v4 addresses to system configuration" ZT_EOL_S); + } #endif n.setManagedIps(newManagedIps); } From 5b5ef073508d2f341a9c0579e5156914ceb38e15 Mon Sep 17 00:00:00 2001 From: travisladuke Date: Tue, 25 Jul 2023 11:54:01 -0700 Subject: [PATCH 3/5] Add search domain to macos dns configuration Stumbled upon this while debugging something else. If we add search domain to our system configuration for network DNS, then search domains work: ``` ping server1 ~ PING server1.my.domain (10.123.3.1): 56 data bytes 64 bytes from 10.123.3.1 ``` --- osdep/MacDNSHelper.mm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/osdep/MacDNSHelper.mm b/osdep/MacDNSHelper.mm index 66de9e8cb..aab244f74 100644 --- a/osdep/MacDNSHelper.mm +++ b/osdep/MacDNSHelper.mm @@ -25,19 +25,23 @@ void MacDNSHelper::setDNS(uint64_t nwid, const char *domain, const std::vector Date: Mon, 31 Jul 2023 17:11:57 -0700 Subject: [PATCH 4/5] Fix reporting of secondaryPort and tertiaryPort See: #2039 --- service/OneService.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/OneService.cpp b/service/OneService.cpp index ead7a8346..5b4621569 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -1056,7 +1056,7 @@ public: if (_secondaryPort) { _ports[1] = _secondaryPort; } else { - _ports[1] = _getRandomPort(); + _ports[1] = _secondaryPort = _getRandomPort(); } } #ifdef ZT_USE_MINIUPNPC @@ -1067,7 +1067,7 @@ public: if (_tertiaryPort) { _ports[2] = _tertiaryPort; } else { - _ports[2] = _getRandomPort(); + _ports[2] = _tertiaryPort = _getRandomPort(); } if (_ports[2]) { From e36127283cc58ac184a9d4497852a5ed8b9c515b Mon Sep 17 00:00:00 2001 From: Brenton Bostick Date: Tue, 1 Aug 2023 11:53:55 -0400 Subject: [PATCH 5/5] Fix typos (#2075) --- node/Constants.hpp | 2 +- node/Node.cpp | 4 ++-- osdep/LinuxNetLink.cpp | 2 +- service/OneService.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/node/Constants.hpp b/node/Constants.hpp index 32492293a..54995c29a 100644 --- a/node/Constants.hpp +++ b/node/Constants.hpp @@ -299,7 +299,7 @@ /** * Delay between checks of peer pings, etc., and also related housekeeping tasks */ -#define ZT_PING_CHECK_INVERVAL 5000 +#define ZT_PING_CHECK_INTERVAL 5000 /** * How often the local.conf file is checked for changes (service, should be moved there) diff --git a/node/Node.cpp b/node/Node.cpp index d50905e45..e2d5f7bf3 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -307,7 +307,7 @@ ZT_ResultCode Node::processBackgroundTasks(void *tptr,int64_t now,volatile int64 Mutex::Lock bl(_backgroundTasksLock); // Process background bond tasks - unsigned long bondCheckInterval = ZT_PING_CHECK_INVERVAL; + unsigned long bondCheckInterval = ZT_PING_CHECK_INTERVAL; if (RR->bc->inUse()) { bondCheckInterval = std::max(RR->bc->minReqMonitorInterval(), ZT_CORE_TIMER_TASK_GRANULARITY); if ((now - _lastGratuitousPingCheck) >= ZT_CORE_TIMER_TASK_GRANULARITY) { @@ -316,7 +316,7 @@ ZT_ResultCode Node::processBackgroundTasks(void *tptr,int64_t now,volatile int64 } } - unsigned long timeUntilNextPingCheck = _lowBandwidthMode ? (ZT_PING_CHECK_INVERVAL * 5) : ZT_PING_CHECK_INVERVAL; + unsigned long timeUntilNextPingCheck = _lowBandwidthMode ? (ZT_PING_CHECK_INTERVAL * 5) : ZT_PING_CHECK_INTERVAL; const int64_t timeSinceLastPingCheck = now - _lastPingCheck; if (timeSinceLastPingCheck >= timeUntilNextPingCheck) { try { diff --git a/osdep/LinuxNetLink.cpp b/osdep/LinuxNetLink.cpp index 348aa96e3..d5886dfa6 100644 --- a/osdep/LinuxNetLink.cpp +++ b/osdep/LinuxNetLink.cpp @@ -546,7 +546,7 @@ void LinuxNetLink::_requestIPv4Routes() la.nl_pid = 0; //getpid(); la.nl_groups = RTMGRP_IPV4_ROUTE; if(bind(fd, (struct sockaddr*)&la, sizeof(la))) { - fprintf(stderr, "Error binding RTNETLINK (_requiestIPv4Routes #1): %s\n", strerror(errno)); + fprintf(stderr, "Error binding RTNETLINK (_requestIPv4Routes #1): %s\n", strerror(errno)); close(fd); return; } diff --git a/service/OneService.cpp b/service/OneService.cpp index 5b4621569..ba321282c 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -3393,7 +3393,7 @@ public: void *tmpptr = (void *)_tcpFallbackTunnel; phyOnTcpWritable(_tcpFallbackTunnel->sock,&tmpptr); } - } else if (_forceTcpRelay || (((now - _lastSendToGlobalV4) < ZT_TCP_FALLBACK_AFTER)&&((now - _lastSendToGlobalV4) > (ZT_PING_CHECK_INVERVAL / 2)))) { + } else if (_forceTcpRelay || (((now - _lastSendToGlobalV4) < ZT_TCP_FALLBACK_AFTER)&&((now - _lastSendToGlobalV4) > (ZT_PING_CHECK_INTERVAL / 2)))) { const InetAddress addr(_fallbackRelayAddress); TcpConnection *tc = new TcpConnection(); {