#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_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;
}

@ -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;

@ -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);
}
}

@ -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
};

@ -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;

@ -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<std::string> parms);
virtual void close();

Loading…
Cancel
Save

Powered by TurnKey Linux.