@ -46,7 +46,15 @@ public:
RR ( renv ) ,
_now ( now ) ,
_scope ( scope ) { }
inline void operator ( ) ( Topology & t , const SharedPtr < Peer > & p ) { p - > resetWithinScope ( RR , _scope , _now ) ; }
inline void operator ( ) ( Topology & t , const SharedPtr < Peer > & p )
{
if ( p - > resetWithinScope ( RR , _scope , _now ) )
peersReset . push_back ( p ) ;
}
std : : vector < SharedPtr < Peer > > peersReset ;
private :
const RuntimeEnvironment * RR ;
uint64_t _now ;
@ -84,8 +92,27 @@ void SelfAwareness::iam(const Address &reporter,const InetAddress &reporterPhysi
} else if ( lastPhy ! = myPhysicalAddress ) {
TRACE ( " learned physical address %s for scope %u from reporter %s(%s) (replaced %s, resetting within scope) " , myPhysicalAddress . toString ( ) . c_str ( ) , scope , reporter . toString ( ) . c_str ( ) , reporterPhysicalAddress . toString ( ) . c_str ( ) , lastPhy . toString ( ) . c_str ( ) ) ;
lastPhy = myPhysicalAddress ;
_ResetWithinScope rset ( RR , RR - > node - > now ( ) , ( InetAddress : : IpScope ) scope ) ;
uint64_t now = RR - > node - > now ( ) ;
_ResetWithinScope rset ( RR , now , ( InetAddress : : IpScope ) scope ) ;
RR - > topology - > eachPeer < _ResetWithinScope & > ( rset ) ;
// For all peers for whom we forgot an address, send a packet indirectly if
// they are still considered alive so that we will re-establish direct links.
SharedPtr < Peer > sn ( RR - > topology - > getBestSupernode ( ) ) ;
if ( sn ) {
Path * snp = sn - > getBestPath ( now ) ;
if ( snp ) {
for ( std : : vector < SharedPtr < Peer > > : : const_iterator p ( rset . peersReset . begin ( ) ) ; p ! = rset . peersReset . end ( ) ; + + p ) {
if ( ( * p ) - > alive ( now ) ) {
TRACE ( " sending indirect NOP to %s via %s(%s) to re-establish link " , ( * p ) - > address ( ) . toString ( ) . c_str ( ) , sn - > address ( ) . toString ( ) . c_str ( ) , snp - > address ( ) . toString ( ) . c_str ( ) ) ;
Packet outp ( ( * p ) - > address ( ) , RR - > identity . address ( ) , Packet : : VERB_NOP ) ;
outp . armor ( ( * p ) - > key ( ) , true ) ;
snp - > send ( RR , outp . data ( ) , outp . size ( ) , now ) ;
}
}
}
}
}
}
}