diff --git a/DStarGatewayThread.cpp b/DStarGatewayThread.cpp index 9cd87b6..9641d85 100644 --- a/DStarGatewayThread.cpp +++ b/DStarGatewayThread.cpp @@ -76,9 +76,7 @@ m_dextraPool(NULL), m_dplusPool(NULL), m_dcsPool(NULL), m_g2Handler(NULL), -#if defined(ENABLE_NAT_TRAVERSAL) m_natTraversal(NULL), -#endif m_aprsWriter(NULL), m_irc(NULL), m_cache(), @@ -209,12 +207,10 @@ void* CDStarGatewayThread::Entry() m_g2Handler = NULL; } -#if defined(ENABLE_NAT_TRAVERSAL) if(m_g2Handler != NULL) { m_natTraversal = new CNatTraversalHandler(); m_natTraversal->setG2Handler(m_g2Handler); } -#endif // Wait here until we have the essentials to run while (!m_killed && (m_dextraPool == NULL || m_dplusPool == NULL || m_dcsPool == NULL || m_g2Handler == NULL || (m_icomRepeaterHandler == NULL && m_hbRepeaterHandler == NULL && m_dummyRepeaterHandler == NULL) || m_gatewayCallsign.empty())) @@ -748,9 +744,6 @@ void CDStarGatewayThread::processIrcDDB() if (!address.empty()) { CLog::logDebug("USER: %s %s %s %s", user.c_str(), repeater.c_str(), gateway.c_str(), address.c_str()); m_cache.updateUser(user, repeater, gateway, address, timestamp, DP_DEXTRA, false, false); -#if defined(ENABLE_NAT_TRAVERSAL) - m_natTraversal->traverseNatG2(address); -#endif } else { CLog::logDebug("USER: %s NOT FOUND", user.c_str()); } @@ -767,9 +760,6 @@ void CDStarGatewayThread::processIrcDDB() if (!address.empty()) { CLog::logDebug("REPEATER: %s %s %s", repeater.c_str(), gateway.c_str(), address.c_str()); m_cache.updateRepeater(repeater, gateway, address, DP_DEXTRA, false, false); -#if defined(ENABLE_NAT_TRAVERSAL) - m_natTraversal->traverseNatG2(address); -#endif } else { CLog::logDebug("REPEATER: %s NOT FOUND", repeater.c_str()); } @@ -787,16 +777,23 @@ void CDStarGatewayThread::processIrcDDB() if (!address.empty()) { CLog::logDebug("GATEWAY: %s %s", gateway.c_str(), address.c_str()); m_cache.updateGateway(gateway, address, DP_DEXTRA, false, false); -#if defined(ENABLE_NAT_TRAVERSAL) - m_natTraversal->traverseNatG2(address); -#endif } else { CLog::logDebug("GATEWAY: %s NOT FOUND", gateway.c_str()); } } break; - case IDRT_NATTRAVERSAL_G2: + case IDRT_NATTRAVERSAL_G2: { + std::string address; + bool res = m_irc->receiveNATTraversalG2(address); + if(!res) + return; + + CLog::logInfo("%s wants to G2 route to us, punching UDP Holes through NAT", address.c_str()); + m_g2Handler->traverseNat(address); + } break; + case IDRT_NONE: + return; default: return; } diff --git a/DStarGatewayThread.h b/DStarGatewayThread.h index 5203a68..e6830c1 100644 --- a/DStarGatewayThread.h +++ b/DStarGatewayThread.h @@ -37,9 +37,7 @@ #include "Timer.h" #include "Defs.h" #include "Thread.h" -#if defined(ENABLE_NAT_TRAVERSAL) #include "NatTraversalHandler.h" -#endif class CDStarGatewayThread : public CThread{ public: @@ -106,9 +104,7 @@ private: CDPlusProtocolHandlerPool* m_dplusPool; CDCSProtocolHandlerPool* m_dcsPool; CG2ProtocolHandler* m_g2Handler; -#if defined(ENABLE_NAT_TRAVERSAL) CNatTraversalHandler* m_natTraversal; -#endif CAPRSHandler* m_aprsWriter; CIRCDDB* m_irc; CCacheManager m_cache; diff --git a/G2ProtocolHandler.cpp b/G2ProtocolHandler.cpp index df3fa0e..d6cfd86 100644 --- a/G2ProtocolHandler.cpp +++ b/G2ProtocolHandler.cpp @@ -178,7 +178,7 @@ void CG2ProtocolHandler::traverseNat(const std::string& address) in_addr addr = CUDPReaderWriter::lookup(address); - //wxLogError(wxT("Punching hole to %s"), address.mb_str()); + CLog::logInfo("Punching hole to %s", address.c_str()); m_socket.write(buffer, 1, addr, G2_DV_PORT); -} \ No newline at end of file +} diff --git a/IRCDDB.h b/IRCDDB.h index d55538d..e1f8186 100644 --- a/IRCDDB.h +++ b/IRCDDB.h @@ -138,6 +138,8 @@ public: virtual bool receiveUser(std::string& userCallsign, std::string& repeaterCallsign, std::string& gatewayCallsign, std::string& address, std::string& timeStamp) = 0; + virtual bool receiveNATTraversalG2(std::string& address) = 0; + virtual void close() = 0; // Implictely kills any threads in the IRC code }; diff --git a/IRCDDBMultiClient.cpp b/IRCDDBMultiClient.cpp index 5c13b77..49259de 100644 --- a/IRCDDBMultiClient.cpp +++ b/IRCDDBMultiClient.cpp @@ -183,6 +183,7 @@ bool CIRCDDBMultiClient::findUser(const std::string & userCallsign) bool CIRCDDBMultiClient::notifyRepeaterNatTraversal(const std::string& repeater) { + // NAT traversal message does not expect a response over IRC bool result = true; for (unsigned int i = 0; i < m_clients.size(); i++) { result = m_clients[i]->notifyRepeaterNatTraversal(repeater) && result; @@ -191,6 +192,17 @@ bool CIRCDDBMultiClient::notifyRepeaterNatTraversal(const std::string& repeater) return result; } +bool CIRCDDBMultiClient::receiveNATTraversalG2(std::string& address) +{ + CIRCDDBMultiClientQuery * item = checkAndGetNextResponse(IDRT_NATTRAVERSAL_G2, "CIRCDDBMultiClient::receiveNATTraversalG2: unexpected response type"); + if (item == NULL) + return false; + + address = item->getAddress(); + + return true; +} + IRCDDB_RESPONSE_TYPE CIRCDDBMultiClient::getMessageType() { //procees the inner clients at each call @@ -218,6 +230,11 @@ IRCDDB_RESPONSE_TYPE CIRCDDBMultiClient::getMessageType() key = repeater; break; } + case IDRT_NATTRAVERSAL_G2: { + if (!m_clients[i]->receiveNATTraversalG2(address)) + type = IDRT_NATTRAVERSAL_G2; + key = "NAT_TRAVERSAL_G2"; + } case IDRT_NONE: { default: break; diff --git a/IRCDDBMultiClient.h b/IRCDDBMultiClient.h index f9fcbb7..18c913f 100644 --- a/IRCDDBMultiClient.h +++ b/IRCDDBMultiClient.h @@ -156,6 +156,7 @@ public: virtual bool receiveGateway(std::string & gatewayCallsign, std::string & address); virtual bool receiveUser(std::string & userCallsign, std::string & repeaterCallsign, std::string & gatewayCallsign, std::string & address); virtual bool receiveUser(std::string & userCallsign, std::string & repeaterCallsign, std::string & gatewayCallsign, std::string & address, std::string & timeStamp); + virtual bool receiveNATTraversalG2(std::string& address); virtual void sendDStarGatewayInfo(const std::string subcommand, const std::vector parms); virtual void close();