mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-02 06:06:10 -04:00
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:
parent
e87b7b75e7
commit
8b230a55cf
24 changed files with 381 additions and 87 deletions
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -128,7 +128,7 @@ int main(int argc, char **argv)
|
|||
|
||||
if (toConnect)
|
||||
{
|
||||
tcp.connect(raddr);
|
||||
tcp.connect(raddr, 30);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue