@ -374,9 +374,21 @@ namespace llarp
return inbound_routing_msg_parser . ParseMessageBuffer ( buf , h , rxid , this ) ;
}
bool
Router : : LooksDeregistered ( ) const
{
return IsServiceNode ( ) and whitelistRouters and _rcLookupHandler . HaveReceivedWhitelist ( )
and not _rcLookupHandler . RemoteIsAllowed ( pubkey ( ) ) ;
}
bool
Router : : ConnectionToRouterAllowed ( const RouterID & router ) const
{
if ( LooksDeregistered ( ) )
{
// we are deregistered don't allow any connections outbound at all
return false ;
}
return _rcLookupHandler . RemoteIsAllowed ( router ) ;
}
@ -766,7 +778,9 @@ namespace llarp
_rcLookupHandler . PeriodicUpdate ( now ) ;
const bool gotWhitelist = _rcLookupHandler . HaveReceivedWhitelist ( ) ;
const bool isSvcNode = IsServiceNode ( ) ;
const bool looksDeregistered = LooksDeregistered ( ) ;
if ( _rc . ExpiresSoon ( now , std : : chrono : : milliseconds ( randint ( ) % 10000 ) )
| | ( now - _rc . last_updated ) > rcRegenInterval )
@ -775,11 +789,10 @@ namespace llarp
if ( ! UpdateOurRC ( false ) )
LogError ( " Failed to update our RC " ) ;
}
else
else if ( not looksDeregistered )
{
GossipRCIfNeeded ( _rc ) ;
}
const bool gotWhitelist = _rcLookupHandler . HaveReceivedWhitelist ( ) ;
// remove RCs for nodes that are no longer allowed by network policy
nodedb ( ) - > RemoveIf ( [ & ] ( const RouterContact & rc ) - > bool {
// don't purge bootstrap nodes from nodedb
@ -847,7 +860,7 @@ namespace llarp
const int interval = isSvcNode ? 5 : 2 ;
const auto timepoint_now = Clock_t : : now ( ) ;
if ( timepoint_now > = m_NextExploreAt )
if ( timepoint_now > = m_NextExploreAt and not looksDeregistered )
{
_rcLookupHandler . ExploreNetwork ( ) ;
m_NextExploreAt = timepoint_now + std : : chrono : : seconds ( interval ) ;
@ -859,7 +872,17 @@ namespace llarp
connectToNum = strictConnect ;
}
if ( connected < connectToNum )
if ( looksDeregistered )
{
// kill all sessions that are open because we think we are deregistered
_linkManager . ForEachPeer ( [ ] ( auto * peer ) {
if ( peer )
peer - > Close ( ) ;
} ) ;
// complain about being deregistered
LogError ( " We are running as a service node but we seem to be decommissioned " ) ;
}
else if ( connected < connectToNum )
{
size_t dlt = connectToNum - connected ;
LogDebug ( " connecting to " , dlt , " random routers to keep alive " ) ;
@ -886,7 +909,16 @@ namespace llarp
if ( m_peerDb - > shouldFlush ( now ) )
{
LogDebug ( " Queing database flush... " ) ;
QueueDiskIO ( [ this ] ( ) { m_peerDb - > flushDatabase ( ) ; } ) ;
QueueDiskIO ( [ this ] ( ) {
try
{
m_peerDb - > flushDatabase ( ) ;
}
catch ( std : : exception & ex )
{
LogError ( " Could not flush peer stats database: " , ex . what ( ) ) ;
}
} ) ;
}
}