From 0e1fc06a6f3b5c7aaa06ba370f85337176ae8a85 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Tue, 1 Apr 2014 15:55:05 -0700 Subject: [PATCH] The remove paths on send fail thing in Peer.cpp was not well thought out, and there is no point in mallocing the TCP write buffer. --- node/Peer.cpp | 35 ++++++++++++++--------------------- node/TcpSocket.cpp | 25 +++---------------------- node/TcpSocket.hpp | 9 +++------ 3 files changed, 20 insertions(+), 49 deletions(-) diff --git a/node/Peer.cpp b/node/Peer.cpp index 6e8ecc015..28926f97c 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -121,30 +121,23 @@ bool Peer::send(const RuntimeEnvironment *_r,const void *data,unsigned int len,u { Mutex::Lock _l(_lock); - for(;;) { - std::vector::iterator p(_paths.begin()); - if (p == _paths.end()) - return false; + std::vector::iterator p(_paths.begin()); + if (p == _paths.end()) + return false; - uint64_t bestPathLastReceived = p->lastReceived(); - std::vector::iterator bestPath = p; - while (++p != _paths.end()) { - uint64_t lr = p->lastReceived(); - if (lr > bestPathLastReceived) { - bestPathLastReceived = lr; - bestPath = p; - } + uint64_t bestPathLastReceived = p->lastReceived(); + std::vector::iterator bestPath = p; + while (++p != _paths.end()) { + uint64_t lr = p->lastReceived(); + if (lr > bestPathLastReceived) { + bestPathLastReceived = lr; + bestPath = p; } + } - if (_r->sm->send(bestPath->address(),bestPath->tcp(),bestPath->type() == Path::PATH_TYPE_TCP_OUT,data,len)) { - bestPath->sent(now); - return true; - } else { - if (bestPath->fixed()) - return false; - _paths.erase(bestPath); - // ... try again and pick a different path - } + if (_r->sm->send(bestPath->address(),bestPath->tcp(),bestPath->type() == Path::PATH_TYPE_TCP_OUT,data,len)) { + bestPath->sent(now); + return true; } return false; diff --git a/node/TcpSocket.cpp b/node/TcpSocket.cpp index b21cbd5e8..bc0357fd4 100644 --- a/node/TcpSocket.cpp +++ b/node/TcpSocket.cpp @@ -48,8 +48,6 @@ #include #endif -#define ZT_TCP_MAX_SENDQ_LENGTH (ZT_SOCKET_MAX_MESSAGE_LEN * 8) - namespace ZeroTier { TcpSocket::~TcpSocket() @@ -59,8 +57,6 @@ TcpSocket::~TcpSocket() #else ::close(_sock); #endif - if (_outbuf) - ::free(_outbuf); //printf("!!! TCP SOCKET DESTROYED @%.16llx to %s\r\n",(unsigned long long)this,_remote.toString().c_str()); } @@ -72,26 +68,11 @@ bool TcpSocket::send(const InetAddress &to,const void *msg,unsigned int msglen) return true; // sanity check Mutex::Lock _l(_writeLock); + bool writeInProgress = ((_outptr != 0)||(_connecting)); - // Ensure that _outbuf is large enough - unsigned int newptr = _outptr + 5 + msglen; - if (newptr > _outbufsize) { - unsigned int newbufsize = _outbufsize; - while (newbufsize < newptr) - newbufsize += ZT_SOCKET_MAX_MESSAGE_LEN; - if (newbufsize > ZT_TCP_MAX_SENDQ_LENGTH) - return false; // cannot send, outbuf full - unsigned char *newbuf = (unsigned char *)::malloc(newbufsize); - if (!newbuf) - return false; // cannot send, no memory - _outbufsize = newbufsize; - if (_outbuf) { - memcpy(newbuf,_outbuf,_outptr); - ::free(_outbuf); - } - _outbuf = newbuf; - } + if ((_outptr + 5 + msglen) > (unsigned int)sizeof(_outbuf)) + return false; _outbuf[_outptr++] = 0x17; // look like TLS data _outbuf[_outptr++] = 0x03; diff --git a/node/TcpSocket.hpp b/node/TcpSocket.hpp index 8a9a7095e..59d1ec0b2 100644 --- a/node/TcpSocket.hpp +++ b/node/TcpSocket.hpp @@ -78,10 +78,8 @@ protected: Socket(t,s), _lastActivity(Utils::now()), _sm(sm), - _outbuf((unsigned char *)0), - _outptr(0), - _outbufsize(0), _inptr(0), + _outptr(0), _connecting(c), _remote(r) { @@ -93,12 +91,11 @@ protected: private: unsigned char _inbuf[ZT_SOCKET_MAX_MESSAGE_LEN]; + unsigned char _outbuf[ZT_SOCKET_MAX_MESSAGE_LEN * 4]; uint64_t _lastActivity; // updated whenever data is received, checked directly by SocketManager for stale TCP cleanup SocketManager *_sm; - unsigned char *_outbuf; - unsigned int _outptr; - unsigned int _outbufsize; unsigned int _inptr; + unsigned int _outptr; bool _connecting; // manipulated directly by SocketManager, true if connect() is in progress InetAddress _remote; Mutex _writeLock;