diff --git a/libretroshare/src/tcponudp/tcpstream.cc b/libretroshare/src/tcponudp/tcpstream.cc index f3d135b90..df5ebff68 100644 --- a/libretroshare/src/tcponudp/tcpstream.cc +++ b/libretroshare/src/tcponudp/tcpstream.cc @@ -63,7 +63,7 @@ int checkData(uint8 *data, int size, int idx); int setupBinaryCheck(std::string fname); #endif -static const uint32 kMaxQueueSize = 100; +static const uint32 kMaxQueueSize = 300; // Was 100, which means max packet size of 100k (smaller than max packet size). static const uint32 kMaxPktRetransmit = 20; static const uint32 kMaxSynPktRetransmit = 100; // 100 => 200secs = over 3 minutes startup static const int TCP_STD_TTL = 64; diff --git a/libretroshare/src/tcponudp/udpstunner.cc b/libretroshare/src/tcponudp/udpstunner.cc index a30a4fb4e..a03de1cac 100644 --- a/libretroshare/src/tcponudp/udpstunner.cc +++ b/libretroshare/src/tcponudp/udpstunner.cc @@ -49,6 +49,7 @@ const int32_t TOU_STUN_MAX_RECV_RATE = 25; /* every 25 seconds */ const int32_t TOU_STUN_DEFAULT_TARGET_RATE = 15; /* 20 secs is minimum to keep a NAT UDP port open */ const double TOU_SUCCESS_LPF_FACTOR = 0.90; +#define EXCLUSIVE_MODE_TIMEOUT 300 UdpStunner::UdpStunner(UdpPublisher *pub) :UdpSubReceiver(pub), stunMtx("UdpSubReceiver"), eaddrKnown(false), eaddrStable(false), @@ -108,26 +109,48 @@ void UdpStunner::SimSymmetricNat() #endif -int UdpStunner::grabExclusiveMode() /* returns seconds since last send/recv */ + +int UdpStunner::grabExclusiveMode(std::string holder) /* returns seconds since last send/recv */ { RsStackMutex stack(stunMtx); /********** LOCK MUTEX *********/ + time_t now = time(NULL); + #ifdef DEBUG_UDP_STUNNER_FILTER - std::cerr << "UdpStunner::setExclusiveMode(); + std::cerr << "UdpStunner::grabExclusiveMode();" std::cerr << std::endl; #endif + if (mExclusiveMode) { #ifdef DEBUG_UDP_STUNNER_FILTER - std::cerr << "UdpStunner::setExclusiveMode() FAILED; + std::cerr << "UdpStunner::grabExclusiveMode() FAILED"; std::cerr << std::endl; #endif + + std::cerr << "UdpStunner::grabExclusiveMode() FAILED, already held by: " << mExclusiveHolder; + std::cerr << std::endl; + std::cerr << "UdpStunner::grabExclusiveMode() Was Grabbed: " << now - mExclusiveModeTS; + std::cerr << " secs ago"; + std::cerr << std::endl; + + /* This can happen if AUTH, but START never received! (occasionally). + */ + if (now - mExclusiveModeTS > EXCLUSIVE_MODE_TIMEOUT) + { + mExclusiveMode = false; + mForceRestun = true; + + std::cerr << "UdpStunner::grabExclusiveMode() Held for too Long... TIMEOUT & Stun Forced"; + std::cerr << std::endl; + } + return 0; } - time_t now = time(NULL); mExclusiveMode = true; mExclusiveModeTS = now; + mExclusiveHolder = holder; int lastcomms = mStunLastRecvAny; if (mStunLastSendAny > lastcomms) @@ -143,24 +166,26 @@ int UdpStunner::grabExclusiveMode() /* returns seconds since last send/recv */ commsage = 1; } #ifdef DEBUG_UDP_STUNNER_FILTER - std::cerr << "UdpStunner::setExclusiveMode() SUCCESS. last comms: " << commsage; +#endif + std::cerr << "UdpStunner::grabExclusiveMode() SUCCESS. last comms: " << commsage; std::cerr << " ago"; std::cerr << std::endl; -#endif + std::cerr << "UdpStunner::grabExclusiveMode() Exclusive held by: " << mExclusiveHolder; + std::cerr << std::endl; return commsage; } -int UdpStunner::releaseExclusiveMode(bool forceStun) +int UdpStunner::releaseExclusiveMode(std::string holder, bool forceStun) { RsStackMutex stack(stunMtx); /********** LOCK MUTEX *********/ if (!mExclusiveMode) { #ifdef DEBUG_UDP_STUNNER_FILTER +#endif std::cerr << "UdpStunner::cancelExclusiveMode() ERROR, not in exclusive Mode"; std::cerr << std::endl; -#endif return 0; } @@ -183,12 +208,21 @@ int UdpStunner::releaseExclusiveMode(bool forceStun) } #endif + if (mExclusiveHolder != holder) + { + std::cerr << "UdpStunner::cancelExclusiveMode() ERROR release MisMatch: "; + std::cerr << " Original Grabber: "; + std::cerr << mExclusiveHolder; + std::cerr << " Releaser: "; + std::cerr << holder; + std::cerr << std::endl; + } #ifdef DEBUG_UDP_STUNNER_FILTER +#endif std::cerr << "UdpStunner::cancelExclusiveMode() Canceled. Was in ExclusiveMode for: " << now - mExclusiveModeTS; std::cerr << " secs"; std::cerr << std::endl; -#endif return 1; } diff --git a/libretroshare/src/tcponudp/udpstunner.h b/libretroshare/src/tcponudp/udpstunner.h index 5e68d2c41..9054ad721 100644 --- a/libretroshare/src/tcponudp/udpstunner.h +++ b/libretroshare/src/tcponudp/udpstunner.h @@ -88,8 +88,8 @@ virtual ~UdpStunner() { return; } void SimSymmetricNat(); #endif -int grabExclusiveMode(); /* returns seconds since last send/recv */ -int releaseExclusiveMode(bool forceStun); +int grabExclusiveMode(std::string holder); /* returns seconds since last send/recv */ +int releaseExclusiveMode(std::string holder, bool forceStun); void setTargetStunPeriod(int32_t sec_per_stun); @@ -156,6 +156,7 @@ bool locked_checkExternalAddress(); bool mExclusiveMode; /* when this is switched on, the stunner stays silent (and extAddr is maintained) */ time_t mExclusiveModeTS; + std::string mExclusiveHolder; bool mForceRestun; };