@ -566,7 +566,7 @@ void Cluster::removeMember(uint16_t memberId)
_memberIds = newMemberIds ;
}
bool Cluster : : redirectPeer ( const Address & peerAddress , const InetAddress & peerPhysicalAddress , bool offload )
bool Cluster : : redirectPeer ( const SharedPtr < Peer > & peer , const InetAddress & local Address, const InetAddress & peerPhysicalAddress , bool offload )
{
if ( ! peerPhysicalAddress ) // sanity check
return false ;
@ -575,7 +575,7 @@ bool Cluster::redirectPeer(const Address &peerAddress,const InetAddress &peerPhy
// Pick based on location if it can be determined
int px = 0 , py = 0 , pz = 0 ;
if ( _addressToLocationFunction ( _addressToLocationFunctionArg , reinterpret_cast < const struct sockaddr_storage * > ( & peerPhysicalAddress ) , & px , & py , & pz ) = = 0 ) {
TRACE ( " no geolocation available for %s" , peerPhysicalAddress . toIpString ( ) . c_str ( ) ) ;
TRACE ( " NO GEOLOCATION available for %s" , peerPhysicalAddress . toIpString ( ) . c_str ( ) ) ;
return false ;
}
@ -585,7 +585,7 @@ bool Cluster::redirectPeer(const Address &peerAddress,const InetAddress &peerPhy
const double currentDistance = _dist3d ( _x , _y , _z , px , py , pz ) ;
double bestDistance = ( offload ? 2147483648.0 : currentDistance ) ;
unsigned int bestMember = _id ;
//TRACE(" %s is at %d,%d,%d -- looking for anyone closer than %d,%d,%d (%fkm)",peerPhysicalAddress.toString().c_str(),px,py,pz,_x,_y,_z,bestDistance);
TRACE ( " %s is at %d,%d,%d -- looking for anyone closer than %d,%d,%d (%fkm) " , peerPhysicalAddress . toString ( ) . c_str ( ) , px , py , pz , _x , _y , _z , bestDistance ) ;
{
Mutex : : Lock _l ( _memberIds_m ) ;
for ( std : : vector < uint16_t > : : const_iterator mid ( _memberIds . begin ( ) ) ; mid ! = _memberIds . end ( ) ; + + mid ) {
@ -605,7 +605,7 @@ bool Cluster::redirectPeer(const Address &peerAddress,const InetAddress &peerPhy
}
if ( best . size ( ) > 0 ) {
TRACE ( " %s seems closer to %u at %fkm, suggesting redirect... " , peerAddress . toString ( ) . c_str ( ) , bestMember , bestDistance ) ;
TRACE ( " %s seems closer to %u at %fkm, suggesting redirect... " , peer - > address ( ) . toString ( ) . c_str ( ) , bestMember , bestDistance ) ;
/* if (peer->remoteVersionProtocol() >= 5) {
// If it's a newer peer send VERB_PUSH_DIRECT_PATHS which is more idiomatic
@ -613,7 +613,7 @@ bool Cluster::redirectPeer(const Address &peerAddress,const InetAddress &peerPhy
// Otherwise send VERB_RENDEZVOUS for ourselves, which will trick peers into trying other endpoints for us even if they're too old for PUSH_DIRECT_PATHS
for ( std : : vector < InetAddress > : : const_iterator a ( best . begin ( ) ) ; a ! = best . end ( ) ; + + a ) {
if ( a - > ss_family = = peerPhysicalAddress . ss_family ) {
Packet outp ( peerAddress , RR - > identity . address ( ) , Packet : : VERB_RENDEZVOUS ) ;
Packet outp ( peer - > address ( ) , RR - > identity . address ( ) , Packet : : VERB_RENDEZVOUS ) ;
outp . append ( ( uint8_t ) 0 ) ; // no flags
RR - > identity . address ( ) . appendTo ( outp ) ; // HACK: rendezvous with ourselves! with really old peers this will only work if I'm a root server!
outp . append ( ( uint16_t ) a - > port ( ) ) ;
@ -624,14 +624,16 @@ bool Cluster::redirectPeer(const Address &peerAddress,const InetAddress &peerPhy
outp . append ( ( uint8_t ) 16 ) ;
outp . append ( a - > rawIpData ( ) , 16 ) ;
}
RR - > sw - > send ( outp , true , 0 ) ;
outp . armor ( peer - > key ( ) , true ) ;
RR - > antiRec - > logOutgoingZT ( outp . data ( ) , outp . size ( ) ) ;
RR - > node - > putPacket ( localAddress , peerPhysicalAddress , outp . data ( ) , outp . size ( ) ) ;
}
}
//}
return true ;
} else {
//TRACE("peer %s is at [%d,%d,%d], distance to us is %f and this seems to be the best",peerAddress .toString().c_str(),px,py,pz,currentDistance);
//TRACE("peer %s is at [%d,%d,%d], distance to us is %f and this seems to be the best",peer->address() .toString().c_str(),px,py,pz,currentDistance);
return false ;
}
} else {