Added allowTcpFallbackRelay to local.conf, fixed logic in Binder's route enumeration

This commit is contained in:
Joseph Henry 2018-01-10 12:41:52 -08:00
parent 7e2d614975
commit 640cc22749
2 changed files with 64 additions and 49 deletions

View File

@ -137,6 +137,7 @@ public:
std::map<InetAddress,std::string> localIfAddrs; std::map<InetAddress,std::string> localIfAddrs;
PhySocket *udps,*tcps; PhySocket *udps,*tcps;
Mutex::Lock _l(_lock); Mutex::Lock _l(_lock);
bool interfacesEnumerated = true;
#ifdef __WINDOWS__ #ifdef __WINDOWS__
@ -167,6 +168,9 @@ public:
a = a->Next; a = a->Next;
} }
} }
else {
interfacesEnumerated = false;
}
#else // not __WINDOWS__ #else // not __WINDOWS__
@ -195,6 +199,9 @@ public:
} }
fclose(procf); fclose(procf);
} }
else {
interfacesEnumerated = false;
}
// Get IPv6 addresses (and any device names we don't already know) // Get IPv6 addresses (and any device names we don't already know)
OSUtils::ztsnprintf(fn,sizeof(fn),"/proc/%lu/net/if_inet6",pid); OSUtils::ztsnprintf(fn,sizeof(fn),"/proc/%lu/net/if_inet6",pid);
@ -314,12 +321,15 @@ public:
} }
freeifaddrs(ifatbl); freeifaddrs(ifatbl);
} }
else {
interfacesEnumerated = false;
}
} }
#endif #endif
// Default to binding to wildcard if we can't enumerate addresses // Default to binding to wildcard if we can't enumerate addresses
if (localIfAddrs.empty()) { if (!interfacesEnumerated && localIfAddrs.empty()) {
for(int x=0;x<(int)portCount;++x) { for(int x=0;x<(int)portCount;++x) {
localIfAddrs.insert(std::pair<InetAddress,std::string>(InetAddress((uint32_t)0,ports[x]),std::string())); localIfAddrs.insert(std::pair<InetAddress,std::string>(InetAddress((uint32_t)0,ports[x]),std::string()));
localIfAddrs.insert(std::pair<InetAddress,std::string>(InetAddress((const void *)"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",16,ports[x]),std::string())); localIfAddrs.insert(std::pair<InetAddress,std::string>(InetAddress((const void *)"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",16,ports[x]),std::string()));

View File

@ -398,6 +398,7 @@ public:
PhySocket *_localControlSocket4; PhySocket *_localControlSocket4;
PhySocket *_localControlSocket6; PhySocket *_localControlSocket6;
bool _updateAutoApply; bool _updateAutoApply;
bool _allowTcpFallbackRelay;
unsigned int _primaryPort; unsigned int _primaryPort;
volatile unsigned int _udpPortPickerCounter; volatile unsigned int _udpPortPickerCounter;
@ -1125,6 +1126,7 @@ public:
} }
json &settings = res["config"]["settings"]; json &settings = res["config"]["settings"];
settings["primaryPort"] = OSUtils::jsonInt(settings["primaryPort"],(uint64_t)_primaryPort) & 0xffff; settings["primaryPort"] = OSUtils::jsonInt(settings["primaryPort"],(uint64_t)_primaryPort) & 0xffff;
settings["allowTcpFallbackRelay"] = OSUtils::jsonBool(settings["allowTcpFallbackRelay"],_allowTcpFallbackRelay);
#ifdef ZT_USE_MINIUPNPC #ifdef ZT_USE_MINIUPNPC
settings["portMappingEnabled"] = OSUtils::jsonBool(settings["portMappingEnabled"],true); settings["portMappingEnabled"] = OSUtils::jsonBool(settings["portMappingEnabled"],true);
#else #else
@ -1452,6 +1454,7 @@ public:
json &settings = lc["settings"]; json &settings = lc["settings"];
_primaryPort = (unsigned int)OSUtils::jsonInt(settings["primaryPort"],(uint64_t)_primaryPort) & 0xffff; _primaryPort = (unsigned int)OSUtils::jsonInt(settings["primaryPort"],(uint64_t)_primaryPort) & 0xffff;
_allowTcpFallbackRelay = OSUtils::jsonBool(settings["allowTcpFallbackRelay"],true);
_portMappingEnabled = OSUtils::jsonBool(settings["portMappingEnabled"],true); _portMappingEnabled = OSUtils::jsonBool(settings["portMappingEnabled"],true);
#ifndef ZT_SDK #ifndef ZT_SDK
@ -2161,6 +2164,7 @@ public:
inline int nodeWirePacketSendFunction(const int64_t localSocket,const struct sockaddr_storage *addr,const void *data,unsigned int len,unsigned int ttl) inline int nodeWirePacketSendFunction(const int64_t localSocket,const struct sockaddr_storage *addr,const void *data,unsigned int len,unsigned int ttl)
{ {
#ifdef ZT_TCP_FALLBACK_RELAY #ifdef ZT_TCP_FALLBACK_RELAY
if(_allowTcpFallbackRelay) {
if (addr->ss_family == AF_INET) { if (addr->ss_family == AF_INET) {
// TCP fallback tunnel support, currently IPv4 only // TCP fallback tunnel support, currently IPv4 only
if ((len >= 16)&&(reinterpret_cast<const InetAddress *>(addr)->ipScope() == InetAddress::IP_SCOPE_GLOBAL)) { if ((len >= 16)&&(reinterpret_cast<const InetAddress *>(addr)->ipScope() == InetAddress::IP_SCOPE_GLOBAL)) {
@ -2214,10 +2218,12 @@ public:
_lastSendToGlobalV4 = now; _lastSendToGlobalV4 = now;
} }
} }
}
#endif // ZT_TCP_FALLBACK_RELAY
// Even when relaying we still send via UDP. This way if UDP starts // Even when relaying we still send via UDP. This way if UDP starts
// working we can instantly "fail forward" to it and stop using TCP // working we can instantly "fail forward" to it and stop using TCP
// proxy fallback, which is slow. // proxy fallback, which is slow.
#endif // ZT_TCP_FALLBACK_RELAY
if ((localSocket != -1)&&(localSocket != 0)&&(_binder.isUdpSocketValid((PhySocket *)((uintptr_t)localSocket)))) { if ((localSocket != -1)&&(localSocket != 0)&&(_binder.isUdpSocketValid((PhySocket *)((uintptr_t)localSocket)))) {
if ((ttl)&&(addr->ss_family == AF_INET)) _phy.setIp4UdpTtl((PhySocket *)((uintptr_t)localSocket),ttl); if ((ttl)&&(addr->ss_family == AF_INET)) _phy.setIp4UdpTtl((PhySocket *)((uintptr_t)localSocket),ttl);
@ -2286,7 +2292,6 @@ public:
return 0; return 0;
} }
} }
return 1; return 1;
} }