@ -291,7 +291,7 @@ bool PacketDecoder::_doOK(const RuntimeEnvironment *_r,const SharedPtr<Peer> &pe
_r - > topology - > addPeer ( SharedPtr < Peer > ( new Peer ( _r - > identity , Identity ( * this , ZT_PROTO_VERB_WHOIS__OK__IDX_IDENTITY ) ) ) , & PacketDecoder : : _CBaddPeerFromWhois , const_cast < void * > ( ( const void * ) _r ) ) ;
break ;
default :
TRACE ( " %s(%s): OK(%s) " , source ( ) . toString ( ) . c_str ( ) , _remoteAddress . toString ( ) . c_str ( ) , Packet : : verbString ( inReVerb ) ) ;
//TRACE("%s(%s): OK(%s)",source().toString().c_str(),_remoteAddress.toString().c_str(),Packet::verbString(inReVerb));
break ;
}
} catch ( std : : exception & ex ) {
@ -336,13 +336,14 @@ bool PacketDecoder::_doRENDEZVOUS(const RuntimeEnvironment *_r,const SharedPtr<P
{
try {
Address with ( field ( ZT_PROTO_VERB_RENDEZVOUS_IDX_ZTADDRESS , ZT_ADDRESS_LENGTH ) ) ;
if ( _r - > topology - > getPeer ( with ) ) {
SharedPtr < Peer > withPeer ( _r - > topology - > getPeer ( with ) ) ;
if ( withPeer ) {
unsigned int port = at < uint16_t > ( ZT_PROTO_VERB_RENDEZVOUS_IDX_PORT ) ;
unsigned int addrlen = ( * this ) [ ZT_PROTO_VERB_RENDEZVOUS_IDX_ADDRLEN ] ;
if ( ( port > 0 ) & & ( ( addrlen = = 4 ) | | ( addrlen = = 16 ) ) ) {
InetAddress atAddr ( field ( ZT_PROTO_VERB_RENDEZVOUS_IDX_ADDRESS , addrlen ) , addrlen , port ) ;
TRACE ( " RENDEZVOUS from %s says %s might be at %s, starting NAT-t " , source ( ) . toString ( ) . c_str ( ) , with . toString ( ) . c_str ( ) , atAddr . toString ( ) . c_str ( ) ) ;
_r - > sw - > contact ( p eer, atAddr ) ;
_r - > sw - > contact ( withP eer, atAddr ) ;
} else {
TRACE ( " dropped corrupt RENDEZVOUS from %s(%s) (bad address or port) " , source ( ) . toString ( ) . c_str ( ) , _remoteAddress . toString ( ) . c_str ( ) ) ;
}
@ -398,7 +399,7 @@ bool PacketDecoder::_doMULTICAST_LIKE(const RuntimeEnvironment *_r,const SharedP
if ( network - > isAllowed ( source ( ) ) ) {
MAC mac ( field ( ptr , 6 ) ) ; ptr + = 6 ;
uint32_t adi = at < uint32_t > ( ptr ) ; ptr + = 4 ;
TRACE ( " peer %s likes multicast group %s:%.8lx on network %llu " , source ( ) . toString ( ) . c_str ( ) , mac . toString ( ) . c_str ( ) , ( unsigned long ) adi , nwid ) ;
//TRACE(" peer %s likes multicast group %s:%.8lx on network %llu",source().toString().c_str(),mac.toString().c_str(),(unsigned long)adi,nwid);
_r - > multicaster - > likesMulticastGroup ( nwid , MulticastGroup ( mac , adi ) , source ( ) , now ) ;
+ + numAccepted ;
} else {
@ -441,7 +442,9 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared
unsigned int signaturelen = at < uint16_t > ( ZT_PROTO_VERB_MULTICAST_FRAME_IDX_SIGNATURE_LENGTH ) ;
unsigned char * dataAndSignature = field ( ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PAYLOAD , datalen + signaturelen ) ;
bool isDuplicate = _r - > multicaster - > checkAndUpdateMulticastHistory ( fromMac , mg , dataAndSignature , datalen , network - > id ( ) , Utils : : now ( ) ) ;
uint64_t mccrc = Multicaster : : computeMulticastDedupCrc ( network - > id ( ) , fromMac , mg , etherType , dataAndSignature , datalen ) ;
uint64_t now = Utils : : now ( ) ;
bool isDuplicate = _r - > multicaster - > checkDuplicate ( mccrc , now ) ;
if ( originalSubmitterAddress = = _r - > identity . address ( ) ) {
// Technically should not happen, since the original submitter is
@ -458,10 +461,14 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared
_step = DECODE_STEP_WAITING_FOR_ORIGINAL_SUBMITTER_LOOKUP ;
return false ;
} else if ( Multicaster : : verifyMulticastPacket ( originalSubmitter - > identity ( ) , network - > id ( ) , fromMac , mg , etherType , dataAndSignature , datalen , dataAndSignature + datalen , signaturelen ) ) {
_r - > multicaster - > addToDedupHistory ( mccrc , now ) ;
if ( ! isDuplicate )
network - > tap ( ) . put ( fromMac , mg . mac ( ) , etherType , dataAndSignature , datalen ) ;
if ( + + hops < ZT_MULTICAST_PROPAGATION_DEPTH ) {
Address upstream ( source ( ) ) ; // save this since we mangle it
Multicaster : : MulticastBloomFilter bloom ( field ( ZT_PROTO_VERB_MULTICAST_FRAME_IDX_BLOOM_FILTER , ZT_PROTO_VERB_MULTICAST_FRAME_BLOOM_FILTER_SIZE_BYTES ) ) ;
SharedPtr < Peer > propPeers [ ZT_MULTICAST_PROPAGATION_BREADTH ] ;
unsigned int np = _r - > multicaster - > pickNextPropagationPeers (
@ -469,11 +476,16 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared
network - > id ( ) ,
mg ,
originalSubmitterAddress ,
source ( ) ,
upstream ,
bloom ,
ZT_MULTICAST_PROPAGATION_BREADTH ,
propPeers ,
Utils : : now ( ) ) ;
now ) ;
// In a bit of a hack, we re-use this packet to repeat it
// to our multicast propagation recipients. Afterwords we
// return true just to be sure this is the end of this
// packet's life cycle, since it is now mangled.
setSource ( _r - > identity . address ( ) ) ;
( * this ) [ ZT_PROTO_VERB_MULTICAST_FRAME_IDX_HOP_COUNT ] = hops ;
@ -481,13 +493,15 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared
compress ( ) ;
for ( unsigned int i = 0 ; i < np ; + + i ) {
TRACE ( " propagating multicast from original node %s via %s toward %s " , originalSubmitterAddress . toString ( ) . c_str ( ) , source ( ) . toString ( ) . c_str ( ) , propPeers [ i ] - > address ( ) . toString ( ) . c_str ( ) ) ;
TRACE ( " propagating multicast from original node %s: %s -> %s " , originalSubmitterAddress . toString ( ) . c_str ( ) , upstream . toString ( ) . c_str ( ) , propPeers [ i ] - > address ( ) . toString ( ) . c_str ( ) ) ;
// Re-use this packet to re-send multicast frame to everyone
// downstream from us.
newInitializationVector ( ) ;
setDestination ( propPeers [ i ] - > address ( ) ) ;
_r - > sw - > send ( * this , true ) ;
}
return true ;
} else {
TRACE ( " terminating MULTICAST_FRAME propagation from %s(%s): max depth reached " , source ( ) . toString ( ) . c_str ( ) , _remoteAddress . toString ( ) . c_str ( ) ) ;
}