diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-10-03 14:38:07 -0400 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-10-03 14:38:07 -0400 |
commit | c7590634e881f573dd07437ca8b719df621e8777 (patch) | |
tree | 77870fb71e7ad94d8c694cd9ad090a0b0bc64fd9 | |
parent | 58538500f26d6e362bac0275c11628222fdcac02 (diff) | |
download | infinitytier-c7590634e881f573dd07437ca8b719df621e8777.tar.gz infinitytier-c7590634e881f573dd07437ca8b719df621e8777.zip |
Eliminate a lot of redundant WHOIS requests, clean up WHOIS clutter in TRACE, flesh out multicast tracing a bit.
-rw-r--r-- | node/Constants.hpp | 2 | ||||
-rw-r--r-- | node/PacketDecoder.cpp | 23 | ||||
-rw-r--r-- | node/Switch.cpp | 9 |
3 files changed, 24 insertions, 10 deletions
diff --git a/node/Constants.hpp b/node/Constants.hpp index 8f36421b..d29df4e4 100644 --- a/node/Constants.hpp +++ b/node/Constants.hpp @@ -238,7 +238,7 @@ error_no_ZT_ARCH_defined; /** * Default number of bits in multicast propagation prefix */ -#define ZT_DEFAULT_MULTICAST_PREFIX_BITS 2 +#define ZT_DEFAULT_MULTICAST_PREFIX_BITS 1 /** * Default max depth (TTL) for multicast propagation diff --git a/node/PacketDecoder.cpp b/node/PacketDecoder.cpp index c8d33a43..c982bf2b 100644 --- a/node/PacketDecoder.cpp +++ b/node/PacketDecoder.cpp @@ -350,7 +350,7 @@ bool PacketDecoder::_doWHOIS(const RuntimeEnvironment *_r,const SharedPtr<Peer> p->identity().serialize(outp,false); outp.armor(peer->key(),true); _r->demarc->send(_localPort,_remoteAddress,outp.data(),outp.size(),-1); - TRACE("sent WHOIS response to %s for %s",source().toString().c_str(),Address(payload(),ZT_ADDRESS_LENGTH).toString().c_str()); + //TRACE("sent WHOIS response to %s for %s",source().toString().c_str(),Address(payload(),ZT_ADDRESS_LENGTH).toString().c_str()); } else { Packet outp(source(),_r->identity.address(),Packet::VERB_ERROR); outp.append((unsigned char)Packet::VERB_WHOIS); @@ -359,7 +359,7 @@ bool PacketDecoder::_doWHOIS(const RuntimeEnvironment *_r,const SharedPtr<Peer> outp.append(payload(),ZT_ADDRESS_LENGTH); outp.armor(peer->key(),true); _r->demarc->send(_localPort,_remoteAddress,outp.data(),outp.size(),-1); - TRACE("sent WHOIS ERROR to %s for %s (not found)",source().toString().c_str(),Address(payload(),ZT_ADDRESS_LENGTH).toString().c_str()); + //TRACE("sent WHOIS ERROR to %s for %s (not found)",source().toString().c_str(),Address(payload(),ZT_ADDRESS_LENGTH).toString().c_str()); } } else { TRACE("dropped WHOIS from %s(%s): missing or invalid address",source().toString().c_str(),_remoteAddress.toString().c_str()); @@ -495,7 +495,13 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared #ifdef ZT_TRACE_MULTICAST char mct[256]; - Utils::snprintf(mct,sizeof(mct),"%c %s <- %.16llx %.16llx %s via %s depth:%u len:%u",(_r->topology->amSupernode() ? 'S' : '-'),_r->identity.address().toString().c_str(),nwid,guid,origin.toString().c_str(),source().toString().c_str(),depth,frameLen); + unsigned int startingFifoItems = 0; + for(unsigned int i=0;i<ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_FIFO;i+=ZT_ADDRESS_LENGTH) { + if (Utils::isZero(fifo + i,ZT_ADDRESS_LENGTH)) + break; + else ++startingFifoItems; + } + Utils::snprintf(mct,sizeof(mct),"%c %s <- %.16llx %.16llx %s via %s depth:%u len:%u fifo:%u",(_r->topology->amSupernode() ? 'S' : '-'),_r->identity.address().toString().c_str(),nwid,guid,origin.toString().c_str(),source().toString().c_str(),depth,frameLen,startingFifoItems); _r->demarc->send(Demarc::ANY_PORT,ZT_DEFAULTS.multicastTraceWatcher,mct,strlen(mct),-1); #endif @@ -590,7 +596,13 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared } // Add any next hops we know about to FIFO +#ifdef ZT_TRACE_MULTICAST + unsigned char *beforeAdd = newFifoPtr; +#endif _r->mc->getNextHops(nwid,dest,Multicaster::AddToPropagationQueue(&newFifoPtr,newFifoEnd,bloom,bloomNonce,origin,prefixBits,prefix)); +#ifdef ZT_TRACE_MULTICAST + unsigned int numAdded = (unsigned int)(newFifoPtr - beforeAdd) / ZT_ADDRESS_LENGTH; +#endif // Zero-terminate new FIFO if not completely full while (newFifoPtr != newFifoEnd) @@ -604,7 +616,7 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared nextHop = supernode->address(); } if ((!nextHop)||(nextHop == _r->identity.address())) { // check against our addr is a sanity check - TRACE("not forwarding MULTICAST_FRAME from %s(%s): no next hop",source().toString().c_str(),_remoteAddress.toString().c_str()); + //TRACE("not forwarding MULTICAST_FRAME from %s(%s): no next hop",source().toString().c_str(),_remoteAddress.toString().c_str()); return true; } @@ -612,8 +624,7 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared memcpy(fifo,newFifo + ZT_ADDRESS_LENGTH,ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_FIFO); #ifdef ZT_TRACE_MULTICAST - char mct[256]; - Utils::snprintf(mct,sizeof(mct),"%c %s -> %.16llx %.16llx %s via %s",(_r->topology->amSupernode() ? 'S' : '-'),_r->identity.address().toString().c_str(),nwid,guid,origin.toString().c_str(),nextHop.toString().c_str()); + Utils::snprintf(mct,sizeof(mct),"%c %s -> %.16llx %.16llx %s to next hop %s +fifo:%u",(_r->topology->amSupernode() ? 'S' : '-'),_r->identity.address().toString().c_str(),nwid,guid,origin.toString().c_str(),nextHop.toString().c_str(),numAdded); _r->demarc->send(Demarc::ANY_PORT,ZT_DEFAULTS.multicastTraceWatcher,mct,strlen(mct),-1); #endif diff --git a/node/Switch.cpp b/node/Switch.cpp index f471700c..55c21f09 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -438,14 +438,17 @@ void Switch::announceMulticastGroups(const SharedPtr<Peer> &peer) void Switch::requestWhois(const Address &addr) { - TRACE("requesting WHOIS for %s",addr.toString().c_str()); + //TRACE("requesting WHOIS for %s",addr.toString().c_str()); + bool inserted = false; { Mutex::Lock _l(_outstandingWhoisRequests_m); std::pair< std::map< Address,WhoisRequest >::iterator,bool > entry(_outstandingWhoisRequests.insert(std::pair<Address,WhoisRequest>(addr,WhoisRequest()))); - entry.first->second.lastSent = Utils::now(); + if ((inserted = entry.second)) + entry.first->second.lastSent = Utils::now(); entry.first->second.retries = 0; // reset retry count if entry already existed } - _sendWhoisRequest(addr,(const Address *)0,0); + if (inserted) + _sendWhoisRequest(addr,(const Address *)0,0); } void Switch::doAnythingWaitingForPeer(const SharedPtr<Peer> &peer) |