Significant changes to aid UDP connections.

* Added Period and Delay parameters to connections.
   - Delay is used to avoid simultaneous TCP connections.
   - Period is used to regulate UDP connections.
 * added Delay code to pqissl.
 * added Period code to tcponudp / pqissludp.
 * modified TTL modification code.
 * increased SynPktRetransmit value.
 * fixed retrans() timeout (one reason code wasn't working before!)
 * fixed tou_close() SEGV bug.
 * modified pqissludp tou_socket creation. (non permanent now).
 * Modified format of peerConnectRequest() CB to make it more useful and rewrote function.
 * Enabled pqissludp NetInterface.
 * using Id comparision to determine Active/Passive UDP connection state.
 * added #def to disable TCP connections. (for testing)
 * enabled UDP connections from retryConnect() function.
 * corrected EXT check in retryConnect() function.
 * + lots of debug output and other stuff.



git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@358 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
drbob 2008-02-27 02:32:20 +00:00
parent e87b7b75e7
commit 8b230a55cf
24 changed files with 381 additions and 87 deletions

View file

@ -232,7 +232,7 @@ int connect_socket_pair(int fd1, int fd2,
std::cerr << "Socket1 Connecting to: " << addr2 << std::endl;
err = tou_connect(fd1, (struct sockaddr *) &addr2, sizeof(addr2));
err = tou_connect(fd1, (struct sockaddr *) &addr2, sizeof(addr2), 30);
if (err < 0)
{
err_num = tou_errno(fd1);

View file

@ -198,7 +198,7 @@ int main(int argc, char **argv)
#ifdef USE_TCP_SOCKET
err = connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr));
#else
err = tou_connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr));
err = tou_connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr), 30);
#endif
if (err < 0)
{

View file

@ -236,7 +236,7 @@ int connect_socket_pair(int fd1, int fd2,
std::cerr << "Socket1 Connecting to: " << addr2 << std::endl;
err = tou_connect(fd1, (struct sockaddr *) &addr2, sizeof(addr2));
err = tou_connect(fd1, (struct sockaddr *) &addr2, sizeof(addr2), 30);
if (err < 0)
{
err_num = tou_errno(fd1);

View file

@ -60,7 +60,7 @@ class TcpPacket
/* other variables */
double ts; /* transmit time */
uint8 retrans; /* retransmit counter */
uint16 retrans; /* retransmit counter */
TcpPacket(uint8 *ptr, int size);
TcpPacket(); /* likely control packet */

View file

@ -56,9 +56,9 @@ int setupBinaryCheck(std::string fname);
static const uint32 kMaxQueueSize = 100;
static const uint32 kMaxPktRetransmit = 20;
static const uint32 kMaxSynPktRetransmit = 200; // max TTL of 40?
static const uint32 kMaxSynPktRetransmit = 1000; // up to 1000 (16 min?) startup
static const int TCP_STD_TTL = 64;
static const int TCP_STARTUP_COUNT_PER_TTL = 2;
static const int TCP_DEFAULT_FIREWALL_TTL = 4;
static const double RTT_ALPHA = 0.875;
@ -84,6 +84,9 @@ TcpStream::TcpStream(UdpSorter *lyr)
congestThreshold(TCP_MAX_WIN),
congestWinSize(MAX_SEG),
congestUpdate(0),
mTTL_period(0),
mTTL_start(0),
mTTL_end(0),
peerKnown(false),
udp(lyr)
{
@ -91,7 +94,7 @@ TcpStream::TcpStream(UdpSorter *lyr)
}
/* Stream Control! */
int TcpStream::connect(const struct sockaddr_in &raddr)
int TcpStream::connect(const struct sockaddr_in &raddr, uint32_t conn_period)
{
tcpMtx.lock(); /********** LOCK MUTEX *********/
@ -148,6 +151,10 @@ int TcpStream::connect(const struct sockaddr_in &raddr)
setTTL(1);
mTTL_start = getCurrentTS();
mTTL_period = conn_period;
mTTL_end = mTTL_start + mTTL_period;
toSend(pkt);
/* change state */
state = TCP_SYN_SENT;
@ -1864,25 +1871,39 @@ int TcpStream::retrans()
if ((pkt->hasSyn()) && (getTTL() < TCP_STD_TTL))
{
setTTL(1 + pkt->retrans /
TCP_STARTUP_COUNT_PER_TTL);
std::cerr << "TcpStream::retrans() Startup SYNs";
std::cerr << std::endl;
std::cerr << "TcpStream::retrans() retransTimeout: ";
std::cerr << retransTimeout << std::endl;
//setTTL(1 + pkt->retrans /
// TCP_STARTUP_COUNT_PER_TTL);
/* calculate a new TTL */
if (mTTL_end > cts)
{
setTTL(TCP_DEFAULT_FIREWALL_TTL);
}
else
{
setTTL(getTTL() + 1);
}
std::cerr << "TcpStream::retrans() retrans count: ";
std::cerr << pkt->retrans << std::endl;
std::cerr << "TcpStream::retrans() Setting TTL to: ";
std::cerr << (int) (1 + pkt->retrans /
TCP_STARTUP_COUNT_PER_TTL) << std::endl;
std::cerr << getTTL() << std::endl;
}
/* catch excessive retransmits
* (Allow Syn case more.... )
* - Allow Syn case more....
* - if not SYN or TTL has reached STD then timeout quickly.
*/
if ((pkt->hasSyn() && (pkt->retrans > kMaxSynPktRetransmit)) ||
(pkt->retrans > kMaxPktRetransmit))
(((!pkt->hasSyn()) || (TCP_STD_TTL == getTTL()))
&& (pkt->retrans > kMaxPktRetransmit)))
{
/* too many attempts close stream */
#ifdef DEBUG_TCP_STREAM

View file

@ -78,7 +78,7 @@ virtual ~TcpStream() { return; }
/* user interface */
int status(std::ostream &out);
int connect(const struct sockaddr_in &raddr);
int connect(const struct sockaddr_in &raddr, uint32_t conn_period);
int listenfor(const struct sockaddr_in &raddr);
bool isConnected();
@ -223,6 +223,10 @@ uint32 int_rbytes();
/* existing TTL for this stream (tweaked at startup) */
int ttl;
double mTTL_period;
double mTTL_start;
double mTTL_end;
struct sockaddr_in peeraddr;
bool peerKnown;

View file

@ -186,7 +186,7 @@ int main(int argc, char **argv)
#ifdef USE_TCP_SOCKET
err = connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr));
#else
err = tou_connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr));
err = tou_connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr), 30);
#endif
if (err < 0)
{

View file

@ -166,7 +166,7 @@ int tou_bind(int sockfd, const struct sockaddr *my_addr,
* - always non blocking.
*/
int tou_connect(int sockfd, const struct sockaddr *serv_addr,
socklen_t addrlen)
socklen_t addrlen, uint32_t conn_period)
{
if (tou_streams[sockfd] == NULL)
{
@ -189,7 +189,7 @@ int tou_connect(int sockfd, const struct sockaddr *serv_addr,
*((const struct sockaddr_in *) serv_addr));
}
tous->tcp->connect(*(const struct sockaddr_in *) serv_addr);
tous->tcp->connect(*(const struct sockaddr_in *) serv_addr, conn_period);
tous->tcp->tick();
tou_tick_all();
if (tous->tcp->isConnected())
@ -377,12 +377,17 @@ int tou_close(int sockfd)
}
TcpOnUdp *tous = tou_streams[sockfd];
tous->tcp->tick();
tou_tick_all();
/* shut it down */
tous->tcp->close();
delete tous->tcp;
if (tous->tcp)
{
tous->tcp->tick();
/* shut it down */
tous->tcp->close();
delete tous->tcp;
}
delete tous;
tou_streams[sockfd] = NULL;
return 1;

View file

@ -78,6 +78,9 @@ int tou_stunpeer(const struct sockaddr *ext_addr, socklen_t addrlen, const char
* (2) connect: active: tou_connect() or passive: tou_listenfor().
* (3) use as a normal socket.
*
* connect() now has a conn_period parameter - this is the
* estimate (in seconds) of how slowly the connection should proceed.
*
* tou_bind() is not valid. tou_init performs this role.
* tou_listen() is not valid. (must listen for a specific address) use tou_listenfor() instead.
* tou_accept() can still be used.
@ -87,7 +90,8 @@ int tou_stunpeer(const struct sockaddr *ext_addr, socklen_t addrlen, const char
int tou_socket(int domain, int type, int protocol);
int tou_bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); /* null op now */
int tou_listen(int sockfd, int backlog); /* null op now */
int tou_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
int tou_connect(int sockfd, const struct sockaddr *serv_addr,
socklen_t addrlen, uint32_t conn_period);
int tou_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
/* non-standard bonuses */

View file

@ -128,7 +128,7 @@ int main(int argc, char **argv)
if (toConnect)
{
tcp.connect(raddr);
tcp.connect(raddr, 30);
}
else
{