* added DETERMINISTIC_SYMMETRIC NAT type to Connect Logic. (CBS_NETSTATE_EXCLUSIVENAT)

* added DETERMINISTIC_SYMMETRIC NAT to retroshare/rsconfig and NetStateBox.
 * added ExclusiveMode to udpStunner.
 * Tweaked UdpStunner ping logic.
 * added TCP_WAIT to Connect Logic.

NB: This stuff is still to be tested!



git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-netupgrade@4440 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
drbob 2011-07-13 11:41:25 +00:00
parent d6938721b0
commit 85d232ff4f
8 changed files with 245 additions and 43 deletions

View file

@ -30,6 +30,7 @@
#include <sstream>
#define FAILED_WAIT_TIME (300) //(1800) // 30 minutes.
#define TCP_WAIT_TIME (60) // 1 minutes.
#define DIRECT_WAIT_TIME (60) // 1 minutes.
#define PROXY_WAIT_TIME (60) // 1 minutes.
#define RELAY_WAIT_TIME (60) // 1 minutes.
@ -64,6 +65,10 @@ std::string NetStateAsString(uint32_t netstate)
str = "StableNat";
break;
case CSB_NETSTATE_EXCLUSIVENAT:
str = "ExclusiveNat";
break;
case CSB_NETSTATE_FIREWALLED:
str = "Firewalled";
break;
@ -82,6 +87,10 @@ std::string StateAsString(uint32_t state)
case CSB_START:
str = "Start";
break;
case CSB_TCP_WAIT:
str = "TCP Wait";
break;
case CSB_DIRECT_ATTEMPT:
str = "Direct Attempt";
@ -210,6 +219,10 @@ uint32_t convertNetStateToInternal(uint32_t netmode, uint32_t nattype)
{
connNet = CSB_NETSTATE_STABLENAT;
}
else if (nattype == RSNET_NATTYPE_DETERM_SYM)
{
connNet = CSB_NETSTATE_EXCLUSIVENAT;
}
else
{
connNet = CSB_NETSTATE_FIREWALLED;
@ -278,6 +291,7 @@ uint32_t PeerConnectStateBox::connectCb_direct()
switch(mState)
{
case CSB_DIRECT_ATTEMPT:
{
errorMsg(std::cerr, "mState == DIRECT_ATTEMPT", 0);
@ -302,7 +316,7 @@ uint32_t PeerConnectStateBox::connectCb_direct()
case CSB_FAILED_WAIT:
{
/* if too soon */
if (now - mStateTS < FAILED_WAIT_TIME)
if (now - mStateTS < FAILED_WAIT_TIME)
{
/* same state */
retval = CSB_ACTION_WAIT;
@ -325,13 +339,32 @@ uint32_t PeerConnectStateBox::connectCb_direct()
case CSB_START:
{
/* starting up the connection */
mState = CSB_DIRECT_ATTEMPT;
retval = CSB_ACTION_DIRECT_CONN | CSB_ACTION_DHT_PORT;
mState = CSB_TCP_WAIT;
retval = CSB_ACTION_TCP_CONN;
mStateTS = now;
mNoAttempts = 0;
}
break;
case CSB_TCP_WAIT:
{
/* if too soon */
if (now - mStateTS < TCP_WAIT_TIME)
{
/* same state */
retval = CSB_ACTION_WAIT;
}
else
{
/* try again */
mState = CSB_DIRECT_ATTEMPT;
retval = CSB_ACTION_DIRECT_CONN | CSB_ACTION_DHT_PORT;
mStateTS = now;
mNoAttempts = 0;
}
}
break;
case CSB_DIRECT_WAIT:
{
/* if too soon */
@ -430,23 +463,42 @@ uint32_t PeerConnectStateBox::connectCb_unreachable()
} /* FALLTHROUGH TO START CASE */
case CSB_START:
{
/* starting up the connection */
if (mState != CSB_NETSTATE_FIREWALLED)
mState = CSB_TCP_WAIT;
retval = CSB_ACTION_WAIT; /* NO POINT TRYING A TCP_CONN */
mStateTS = now;
mNoAttempts = 0;
}
break;
case CSB_TCP_WAIT:
{
/* if too soon */
if (now - mStateTS < TCP_WAIT_TIME)
{
stateMsg(std::cerr, "not Firewalled => PROXY_ATTEMPT", 0);
mState = CSB_PROXY_ATTEMPT;
retval = CSB_ACTION_PROXY_CONN | proxyPortMode;
/* same state */
retval = CSB_ACTION_WAIT;
}
else
{
stateMsg(std::cerr, "Firewalled => RELAY_ATTEMPT", 0);
mState = CSB_RELAY_ATTEMPT;
retval = CSB_ACTION_RELAY_CONN | CSB_ACTION_DHT_PORT;
}
/* starting up the connection */
if (mState != CSB_NETSTATE_FIREWALLED)
{
stateMsg(std::cerr, "not Firewalled => PROXY_ATTEMPT", 0);
mState = CSB_PROXY_ATTEMPT;
retval = CSB_ACTION_PROXY_CONN | proxyPortMode;
}
else
{
stateMsg(std::cerr, "Firewalled => RELAY_ATTEMPT", 0);
mState = CSB_RELAY_ATTEMPT;
retval = CSB_ACTION_RELAY_CONN | CSB_ACTION_DHT_PORT;
mStateTS = now;
mNoAttempts = 0;
}
mStateTS = now;
mNoAttempts = 0;
}
}
break;

View file

@ -29,21 +29,23 @@
/* a connect state box */
#define CSB_START 1
#define CSB_DIRECT_ATTEMPT 2
#define CSB_DIRECT_WAIT 3
#define CSB_PROXY_ATTEMPT 4
#define CSB_PROXY_WAIT 5
#define CSB_RELAY_ATTEMPT 6
#define CSB_RELAY_WAIT 7
#define CSB_REVERSE_WAIT 8
#define CSB_FAILED_WAIT 9
#define CSB_CONNECTED 10
#define CSB_TCP_WAIT 2
#define CSB_DIRECT_ATTEMPT 3
#define CSB_DIRECT_WAIT 4
#define CSB_PROXY_ATTEMPT 5
#define CSB_PROXY_WAIT 6
#define CSB_RELAY_ATTEMPT 7
#define CSB_RELAY_WAIT 8
#define CSB_REVERSE_WAIT 9
#define CSB_FAILED_WAIT 10
#define CSB_CONNECTED 11
#define CSB_NETSTATE_UNKNOWN 0
#define CSB_NETSTATE_FORWARD 1
#define CSB_NETSTATE_STABLENAT 2
#define CSB_NETSTATE_FIREWALLED 3
#define CSB_NETSTATE_EXCLUSIVENAT 3
#define CSB_NETSTATE_FIREWALLED 4
#define CSB_CONNECT_DIRECT 1
#define CSB_CONNECT_UNREACHABLE 2
@ -53,9 +55,10 @@
#define CSB_ACTION_MASK_PORT 0xff00
#define CSB_ACTION_WAIT 0x0001
#define CSB_ACTION_DIRECT_CONN 0x0002
#define CSB_ACTION_PROXY_CONN 0x0004
#define CSB_ACTION_RELAY_CONN 0x0008
#define CSB_ACTION_TCP_CONN 0x0002
#define CSB_ACTION_DIRECT_CONN 0x0004
#define CSB_ACTION_PROXY_CONN 0x0008
#define CSB_ACTION_RELAY_CONN 0x0010
#define CSB_ACTION_DHT_PORT 0x0100
#define CSB_ACTION_PROXY_PORT 0x0200