mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
improve udp stun and upnp collaboration
Conflicts: libretroshare/src/libretroshare.pro git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1749 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
e7273b0453
commit
324b51e250
@ -52,7 +52,10 @@ const uint32_t RS_STUN_DONE = 0x0002;
|
|||||||
const uint32_t RS_STUN_LIST_MIN = 100;
|
const uint32_t RS_STUN_LIST_MIN = 100;
|
||||||
const uint32_t RS_STUN_FOUND_MIN = 10;
|
const uint32_t RS_STUN_FOUND_MIN = 10;
|
||||||
|
|
||||||
const uint32_t MAX_UPNP_INIT = 10; /* seconds UPnP timeout */
|
const uint32_t MAX_UPNP_INIT = 120; /* seconds UPnP timeout */
|
||||||
|
const uint32_t MAX_UDP_INIT = 150; /* seconds Udp timeout */
|
||||||
|
|
||||||
|
const uint32_t MIN_TIME_BETWEEN_NET_RESET = 150; /* seconds Udp timeout */
|
||||||
|
|
||||||
/****
|
/****
|
||||||
* #define CONN_DEBUG 1
|
* #define CONN_DEBUG 1
|
||||||
@ -272,7 +275,22 @@ void p3ConnectMgr::setOwnNetConfig(uint32_t netMode, uint32_t visState)
|
|||||||
|
|
||||||
void p3ConnectMgr::netReset()
|
void p3ConnectMgr::netReset()
|
||||||
{
|
{
|
||||||
|
|
||||||
std::cerr << "p3ConnectMgr::netReset()" << std::endl;
|
std::cerr << "p3ConnectMgr::netReset()" << std::endl;
|
||||||
|
//don't do a net reset if the MIN_TIME_BETWEEN_NET_RESET is not reached
|
||||||
|
time_t delta = time(NULL) - mNetInitTS;
|
||||||
|
#ifdef CONN_DEBUG
|
||||||
|
std::cerr << "p3ConnectMgr time since last reset : " << delta << std::endl;
|
||||||
|
#endif
|
||||||
|
if (delta < MIN_TIME_BETWEEN_NET_RESET) {
|
||||||
|
#ifdef CONN_DEBUG
|
||||||
|
std::cerr << "p3ConnectMgr::netStartup() don't do a net reset if the MIN_TIME_BETWEEN_NET_RESET is not reached" << std::endl;
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::cerr << "p3ConnectMgr::netReset() shutdown" << std::endl;
|
std::cerr << "p3ConnectMgr::netReset() shutdown" << std::endl;
|
||||||
|
|
||||||
shutdown(); /* blocking shutdown call */
|
shutdown(); /* blocking shutdown call */
|
||||||
@ -351,8 +369,8 @@ void p3ConnectMgr::netStartup()
|
|||||||
RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/
|
RsStackMutex stack(connMtx); /****** STACK LOCK MUTEX *******/
|
||||||
|
|
||||||
mNetInitTS = time(NULL);
|
mNetInitTS = time(NULL);
|
||||||
|
|
||||||
#ifdef CONN_DEBUG
|
#ifdef CONN_DEBUG
|
||||||
|
std::cerr << "p3ConnectMgr::netStartup() resetting mNetInitTS timestamp" << std::endl;
|
||||||
std::cerr << "p3ConnectMgr::netStartup() tou_stunkeepalive() enabled" << std::endl;
|
std::cerr << "p3ConnectMgr::netStartup() tou_stunkeepalive() enabled" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
tou_stunkeepalive(1);
|
tou_stunkeepalive(1);
|
||||||
@ -604,6 +622,9 @@ void p3ConnectMgr::netUpnpCheck()
|
|||||||
connMtx.lock(); /* LOCK MUTEX */
|
connMtx.lock(); /* LOCK MUTEX */
|
||||||
|
|
||||||
time_t delta = time(NULL) - mNetInitTS;
|
time_t delta = time(NULL) - mNetInitTS;
|
||||||
|
#ifdef CONN_DEBUG
|
||||||
|
std::cerr << "p3ConnectMgr time since last reset : " << delta << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
connMtx.unlock(); /* UNLOCK MUTEX */
|
connMtx.unlock(); /* UNLOCK MUTEX */
|
||||||
|
|
||||||
@ -613,6 +634,10 @@ void p3ConnectMgr::netUpnpCheck()
|
|||||||
if ((upnpState < 0) ||
|
if ((upnpState < 0) ||
|
||||||
((upnpState == 0) && (delta > MAX_UPNP_INIT)))
|
((upnpState == 0) && (delta > MAX_UPNP_INIT)))
|
||||||
{
|
{
|
||||||
|
#ifdef CONN_DEBUG
|
||||||
|
std::cerr << "p3ConnectMgr::netUpnpCheck() ";
|
||||||
|
std::cerr << "Upnp Check failed." << std::endl;
|
||||||
|
#endif
|
||||||
/* fallback to UDP startup */
|
/* fallback to UDP startup */
|
||||||
connMtx.lock(); /* LOCK MUTEX */
|
connMtx.lock(); /* LOCK MUTEX */
|
||||||
|
|
||||||
@ -624,6 +649,10 @@ void p3ConnectMgr::netUpnpCheck()
|
|||||||
}
|
}
|
||||||
else if ((upnpState > 0) && netAssistExtAddress(extAddr))
|
else if ((upnpState > 0) && netAssistExtAddress(extAddr))
|
||||||
{
|
{
|
||||||
|
#ifdef CONN_DEBUG
|
||||||
|
std::cerr << "p3ConnectMgr::netUpnpCheck() ";
|
||||||
|
std::cerr << "Upnp Check successed." << std::endl;
|
||||||
|
#endif
|
||||||
/* switch to UDP startup */
|
/* switch to UDP startup */
|
||||||
connMtx.lock(); /* LOCK MUTEX */
|
connMtx.lock(); /* LOCK MUTEX */
|
||||||
|
|
||||||
@ -652,6 +681,15 @@ void p3ConnectMgr::netUdpCheck()
|
|||||||
#endif
|
#endif
|
||||||
struct sockaddr_in tmpip ;
|
struct sockaddr_in tmpip ;
|
||||||
|
|
||||||
|
//don't check it if the udp init is not finished
|
||||||
|
time_t delta = time(NULL) - mNetInitTS;
|
||||||
|
#ifdef CONN_DEBUG
|
||||||
|
std::cerr << "p3ConnectMgr time since last reset : " << delta << std::endl;
|
||||||
|
#endif
|
||||||
|
if (delta < MAX_UDP_INIT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (udpExtAddressCheck() || (mUpnpAddrValid) || (use_extr_addr_finder && mExtAddrFinder->hasValidIP(&tmpip)))
|
if (udpExtAddressCheck() || (mUpnpAddrValid) || (use_extr_addr_finder && mExtAddrFinder->hasValidIP(&tmpip)))
|
||||||
{
|
{
|
||||||
bool extValid = false;
|
bool extValid = false;
|
||||||
|
@ -733,24 +733,31 @@ const std::string CUPnPService::GetStateVariable(
|
|||||||
GetAbsControlURL().c_str(),
|
GetAbsControlURL().c_str(),
|
||||||
stateVariableName.c_str(),
|
stateVariableName.c_str(),
|
||||||
&StVarVal);
|
&StVarVal);
|
||||||
std::cerr << "GetStateVariable pausing in case of an UPnP event incomming.";
|
if (StVarVal != NULL) {
|
||||||
time_t begin_time = time(NULL);
|
std::string varValue = std::string(StVarVal);
|
||||||
while (true) {
|
std::cerr << "GetStateVariable varValue returned by UpnpGetServiceVarStatus : " << varValue << std::endl;
|
||||||
if (time(NULL) - begin_time > 7) {
|
return varValue;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::cerr << "GetStateVariable pause finished.";
|
|
||||||
|
|
||||||
std::cerr << "GetStateVariable(" << stateVariableName << ") = ";
|
|
||||||
std::map<std::string, std::string>::iterator it;
|
|
||||||
it = propertyMap.find(stateVariableName);
|
|
||||||
if (it == propertyMap.end()) {
|
|
||||||
std::cerr << "Empty String" << std::endl;
|
|
||||||
return stdEmptyString;
|
|
||||||
} else {
|
} else {
|
||||||
std::cerr << (*it).second << std::endl;
|
//use event to get state variable
|
||||||
return (*it).second;
|
std::cerr << "GetStateVariable pausing in case of an UPnP event incomming.";
|
||||||
|
time_t begin_time = time(NULL);
|
||||||
|
while (true) {
|
||||||
|
if (time(NULL) - begin_time > 7) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cerr << "GetStateVariable pause finished.";
|
||||||
|
|
||||||
|
std::cerr << "GetStateVariable(" << stateVariableName << ") = ";
|
||||||
|
std::map<std::string, std::string>::iterator it;
|
||||||
|
it = propertyMap.find(stateVariableName);
|
||||||
|
if (it == propertyMap.end()) {
|
||||||
|
std::cerr << "Empty String" << std::endl;
|
||||||
|
return stdEmptyString;
|
||||||
|
} else {
|
||||||
|
std::cerr << (*it).second << std::endl;
|
||||||
|
return (*it).second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1078,14 +1085,6 @@ bool CUPnPControlPoint::DeletePortMappings(
|
|||||||
}
|
}
|
||||||
|
|
||||||
int n = upnpPortMapping.size();
|
int n = upnpPortMapping.size();
|
||||||
bool ok = false;
|
|
||||||
|
|
||||||
// Check the number of port mappings before
|
|
||||||
std::istringstream PortMappingNumberOfEntries(
|
|
||||||
m_WanService->GetStateVariable(
|
|
||||||
"PortMappingNumberOfEntries"));
|
|
||||||
unsigned long oldNumberOfEntries;
|
|
||||||
PortMappingNumberOfEntries >> oldNumberOfEntries;
|
|
||||||
|
|
||||||
// Delete the enabled port mappings
|
// Delete the enabled port mappings
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
@ -1108,21 +1107,8 @@ bool CUPnPControlPoint::DeletePortMappings(
|
|||||||
PrivateDeletePortMapping(upnpPortMapping[i]);
|
PrivateDeletePortMapping(upnpPortMapping[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug only
|
return true;
|
||||||
std::cerr << "CUPnPControlPoint::DeletePortMappings: "
|
|
||||||
"m_ActivePortMappingsMap.size() == " <<
|
|
||||||
m_ActivePortMappingsMap.size() << std::endl;
|
|
||||||
|
|
||||||
// Not very good, must find a better test
|
|
||||||
PortMappingNumberOfEntries.str(
|
|
||||||
m_WanService->GetStateVariable(
|
|
||||||
"PortMappingNumberOfEntries"));
|
|
||||||
unsigned long newNumberOfEntries;
|
|
||||||
PortMappingNumberOfEntries >> newNumberOfEntries;
|
|
||||||
ok = oldNumberOfEntries - newNumberOfEntries >= 4;
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,6 +59,7 @@ class upnpThreadData
|
|||||||
/* Thread routines */
|
/* Thread routines */
|
||||||
extern "C" void* doSetupUPnP(void* p)
|
extern "C" void* doSetupUPnP(void* p)
|
||||||
{
|
{
|
||||||
|
std::cerr << "doSetupUPnP Creating upnp thread." << std::endl;
|
||||||
upnpThreadData *data = (upnpThreadData *) p;
|
upnpThreadData *data = (upnpThreadData *) p;
|
||||||
if ((!data) || (!data->handler))
|
if ((!data) || (!data->handler))
|
||||||
{
|
{
|
||||||
@ -88,7 +89,7 @@ bool upnphandler::background_setup_upnp(bool start, bool stop)
|
|||||||
pthread_t tid;
|
pthread_t tid;
|
||||||
|
|
||||||
/* launch thread */
|
/* launch thread */
|
||||||
std::cerr << "Creating upnp thread." << std::endl;
|
std::cerr << "background_setup_upnp Creating upnp thread." << std::endl;
|
||||||
upnpThreadData *data = new upnpThreadData();
|
upnpThreadData *data = new upnpThreadData();
|
||||||
data->handler = this;
|
data->handler = this;
|
||||||
data->start = start;
|
data->start = start;
|
||||||
@ -249,7 +250,10 @@ bool upnphandler::shutdown_upnp()
|
|||||||
//destroy the upnp object
|
//destroy the upnp object
|
||||||
cUPnPControlPoint->~CUPnPControlPoint();
|
cUPnPControlPoint->~CUPnPControlPoint();
|
||||||
upnpState = RS_UPNP_S_UNINITIALISED;
|
upnpState = RS_UPNP_S_UNINITIALISED;
|
||||||
|
|
||||||
|
//stopping os ok, set starting to true for next net reset
|
||||||
toStop = false;
|
toStop = false;
|
||||||
|
toStart = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -276,6 +280,9 @@ upnphandler::~upnphandler()
|
|||||||
/* RsIface */
|
/* RsIface */
|
||||||
void upnphandler::enable(bool active)
|
void upnphandler::enable(bool active)
|
||||||
{
|
{
|
||||||
|
std::cerr << "upnphandler::enable called with argument active : " << active << std::endl;
|
||||||
|
std::cerr << "toEnable : " << toEnable << std::endl;
|
||||||
|
std::cerr << "toStart : " << toStart << std::endl;
|
||||||
dataMtx.lock(); /*** LOCK MUTEX ***/
|
dataMtx.lock(); /*** LOCK MUTEX ***/
|
||||||
|
|
||||||
if (active != toEnable)
|
if (active != toEnable)
|
||||||
|
@ -12,29 +12,6 @@
|
|||||||
#include "upnp.h"
|
#include "upnp.h"
|
||||||
#include "upnp/UPnPBase.h"
|
#include "upnp/UPnPBase.h"
|
||||||
|
|
||||||
class upnpentry
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
std::string name;
|
|
||||||
std::string id;
|
|
||||||
struct sockaddr_in addr;
|
|
||||||
unsigned int flags;
|
|
||||||
int status;
|
|
||||||
int lastTs;
|
|
||||||
};
|
|
||||||
|
|
||||||
class upnpforward
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
std::string name;
|
|
||||||
unsigned int flags;
|
|
||||||
struct sockaddr_in iaddr;
|
|
||||||
struct sockaddr_in eaddr;
|
|
||||||
int status;
|
|
||||||
int lastTs;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define RS_UPNP_S_UNINITIALISED 0
|
#define RS_UPNP_S_UNINITIALISED 0
|
||||||
#define RS_UPNP_S_UNAVAILABLE 1
|
#define RS_UPNP_S_UNAVAILABLE 1
|
||||||
#define RS_UPNP_S_READY 2
|
#define RS_UPNP_S_READY 2
|
||||||
@ -42,8 +19,6 @@ class upnpforward
|
|||||||
#define RS_UPNP_S_UDP_FAILED 4
|
#define RS_UPNP_S_UDP_FAILED 4
|
||||||
#define RS_UPNP_S_ACTIVE 5
|
#define RS_UPNP_S_ACTIVE 5
|
||||||
|
|
||||||
class uPnPConfigData;
|
|
||||||
|
|
||||||
class upnphandler: public pqiNetAssistFirewall
|
class upnphandler: public pqiNetAssistFirewall
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -95,10 +70,6 @@ class upnphandler: public pqiNetAssistFirewall
|
|||||||
/* info from upnp */
|
/* info from upnp */
|
||||||
struct sockaddr_in upnp_iaddr;
|
struct sockaddr_in upnp_iaddr;
|
||||||
struct sockaddr_in upnp_eaddr;
|
struct sockaddr_in upnp_eaddr;
|
||||||
|
|
||||||
/* active port forwarding */
|
|
||||||
std::list<upnpforward> activeForwards;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* info from upnp */
|
/* info from upnp */
|
||||||
|
Loading…
Reference in New Issue
Block a user