#5 Handle G2 Nat traversal

pull/32/head
Geoffrey Merck 5 years ago
parent 64c94c9e23
commit 7d50a078b1

@ -76,9 +76,7 @@ m_dextraPool(NULL),
m_dplusPool(NULL), m_dplusPool(NULL),
m_dcsPool(NULL), m_dcsPool(NULL),
m_g2Handler(NULL), m_g2Handler(NULL),
#if defined(ENABLE_NAT_TRAVERSAL)
m_natTraversal(NULL), m_natTraversal(NULL),
#endif
m_aprsWriter(NULL), m_aprsWriter(NULL),
m_irc(NULL), m_irc(NULL),
m_cache(), m_cache(),
@ -209,12 +207,10 @@ void* CDStarGatewayThread::Entry()
m_g2Handler = NULL; m_g2Handler = NULL;
} }
#if defined(ENABLE_NAT_TRAVERSAL)
if(m_g2Handler != NULL) { if(m_g2Handler != NULL) {
m_natTraversal = new CNatTraversalHandler(); m_natTraversal = new CNatTraversalHandler();
m_natTraversal->setG2Handler(m_g2Handler); m_natTraversal->setG2Handler(m_g2Handler);
} }
#endif
// Wait here until we have the essentials to run // 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())) 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()) { if (!address.empty()) {
CLog::logDebug("USER: %s %s %s %s", user.c_str(), repeater.c_str(), gateway.c_str(), address.c_str()); 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); m_cache.updateUser(user, repeater, gateway, address, timestamp, DP_DEXTRA, false, false);
#if defined(ENABLE_NAT_TRAVERSAL)
m_natTraversal->traverseNatG2(address);
#endif
} else { } else {
CLog::logDebug("USER: %s NOT FOUND", user.c_str()); CLog::logDebug("USER: %s NOT FOUND", user.c_str());
} }
@ -767,9 +760,6 @@ void CDStarGatewayThread::processIrcDDB()
if (!address.empty()) { if (!address.empty()) {
CLog::logDebug("REPEATER: %s %s %s", repeater.c_str(), gateway.c_str(), address.c_str()); 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); m_cache.updateRepeater(repeater, gateway, address, DP_DEXTRA, false, false);
#if defined(ENABLE_NAT_TRAVERSAL)
m_natTraversal->traverseNatG2(address);
#endif
} else { } else {
CLog::logDebug("REPEATER: %s NOT FOUND", repeater.c_str()); CLog::logDebug("REPEATER: %s NOT FOUND", repeater.c_str());
} }
@ -787,16 +777,23 @@ void CDStarGatewayThread::processIrcDDB()
if (!address.empty()) { if (!address.empty()) {
CLog::logDebug("GATEWAY: %s %s", gateway.c_str(), address.c_str()); CLog::logDebug("GATEWAY: %s %s", gateway.c_str(), address.c_str());
m_cache.updateGateway(gateway, address, DP_DEXTRA, false, false); m_cache.updateGateway(gateway, address, DP_DEXTRA, false, false);
#if defined(ENABLE_NAT_TRAVERSAL)
m_natTraversal->traverseNatG2(address);
#endif
} else { } else {
CLog::logDebug("GATEWAY: %s NOT FOUND", gateway.c_str()); CLog::logDebug("GATEWAY: %s NOT FOUND", gateway.c_str());
} }
} }
break; 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; break;
case IDRT_NONE:
return;
default: default:
return; return;
} }

@ -37,9 +37,7 @@
#include "Timer.h" #include "Timer.h"
#include "Defs.h" #include "Defs.h"
#include "Thread.h" #include "Thread.h"
#if defined(ENABLE_NAT_TRAVERSAL)
#include "NatTraversalHandler.h" #include "NatTraversalHandler.h"
#endif
class CDStarGatewayThread : public CThread{ class CDStarGatewayThread : public CThread{
public: public:
@ -106,9 +104,7 @@ private:
CDPlusProtocolHandlerPool* m_dplusPool; CDPlusProtocolHandlerPool* m_dplusPool;
CDCSProtocolHandlerPool* m_dcsPool; CDCSProtocolHandlerPool* m_dcsPool;
CG2ProtocolHandler* m_g2Handler; CG2ProtocolHandler* m_g2Handler;
#if defined(ENABLE_NAT_TRAVERSAL)
CNatTraversalHandler* m_natTraversal; CNatTraversalHandler* m_natTraversal;
#endif
CAPRSHandler* m_aprsWriter; CAPRSHandler* m_aprsWriter;
CIRCDDB* m_irc; CIRCDDB* m_irc;
CCacheManager m_cache; CCacheManager m_cache;

@ -178,7 +178,7 @@ void CG2ProtocolHandler::traverseNat(const std::string& address)
in_addr addr = CUDPReaderWriter::lookup(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); m_socket.write(buffer, 1, addr, G2_DV_PORT);
} }

@ -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 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 virtual void close() = 0; // Implictely kills any threads in the IRC code
}; };

@ -183,6 +183,7 @@ bool CIRCDDBMultiClient::findUser(const std::string & userCallsign)
bool CIRCDDBMultiClient::notifyRepeaterNatTraversal(const std::string& repeater) bool CIRCDDBMultiClient::notifyRepeaterNatTraversal(const std::string& repeater)
{ {
// NAT traversal message does not expect a response over IRC
bool result = true; bool result = true;
for (unsigned int i = 0; i < m_clients.size(); i++) { for (unsigned int i = 0; i < m_clients.size(); i++) {
result = m_clients[i]->notifyRepeaterNatTraversal(repeater) && result; result = m_clients[i]->notifyRepeaterNatTraversal(repeater) && result;
@ -191,6 +192,17 @@ bool CIRCDDBMultiClient::notifyRepeaterNatTraversal(const std::string& repeater)
return result; 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() IRCDDB_RESPONSE_TYPE CIRCDDBMultiClient::getMessageType()
{ {
//procees the inner clients at each call //procees the inner clients at each call
@ -218,6 +230,11 @@ IRCDDB_RESPONSE_TYPE CIRCDDBMultiClient::getMessageType()
key = repeater; key = repeater;
break; break;
} }
case IDRT_NATTRAVERSAL_G2: {
if (!m_clients[i]->receiveNATTraversalG2(address))
type = IDRT_NATTRAVERSAL_G2;
key = "NAT_TRAVERSAL_G2";
}
case IDRT_NONE: { case IDRT_NONE: {
default: default:
break; break;

@ -156,6 +156,7 @@ public:
virtual bool receiveGateway(std::string & gatewayCallsign, std::string & address); 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);
virtual bool receiveUser(std::string & userCallsign, std::string & repeaterCallsign, std::string & gatewayCallsign, std::string & address, std::string & timeStamp); 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<std::string> parms); virtual void sendDStarGatewayInfo(const std::string subcommand, const std::vector<std::string> parms);
virtual void close(); virtual void close();

Loading…
Cancel
Save

Powered by TurnKey Linux.