@ -6512,7 +6512,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6512,7 +6512,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
const Consensus : : Params & consensusParams = Params ( ) . GetConsensus ( ) ;
{
// Don't send anything until we get its version message
if ( pto - > nVersion = = 0 )
if ( pto - > nVersion = = 0 | | pto - > fDisconnect )
return true ;
//
@ -6548,6 +6548,28 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6548,6 +6548,28 @@ bool SendMessages(CNode* pto, CConnman& connman)
if ( ! lockMain )
return true ;
CNodeState & state = * State ( pto - > GetId ( ) ) ;
BOOST_FOREACH ( const CBlockReject & reject , state . rejects )
connman . PushMessage ( pto , NetMsgType : : REJECT , ( string ) NetMsgType : : BLOCK , reject . chRejectCode , reject . strRejectReason , reject . hashBlock ) ;
state . rejects . clear ( ) ;
if ( state . fShouldBan ) {
state . fShouldBan = false ;
if ( pto - > fWhitelisted )
LogPrintf ( " Warning: not punishing whitelisted peer %s! \n " , pto - > addr . ToString ( ) ) ;
else {
pto - > fDisconnect = true ;
if ( pto - > addr . IsLocal ( ) )
LogPrintf ( " Warning: not banning local peer %s! \n " , pto - > addr . ToString ( ) ) ;
else
{
connman . Ban ( pto - > addr , BanReasonNodeMisbehaving ) ;
}
return true ;
}
}
// Address refresh broadcast
int64_t nNow = GetTimeMicros ( ) ;
if ( ! IsInitialBlockDownload ( ) & & pto - > nNextLocalAddrSend < nNow ) {
@ -6584,26 +6606,6 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6584,26 +6606,6 @@ bool SendMessages(CNode* pto, CConnman& connman)
pto - > vAddrToSend . shrink_to_fit ( ) ;
}
CNodeState & state = * State ( pto - > GetId ( ) ) ;
if ( state . fShouldBan ) {
if ( pto - > fWhitelisted )
LogPrintf ( " Warning: not punishing whitelisted peer %s! \n " , pto - > addr . ToString ( ) ) ;
else {
pto - > fDisconnect = true ;
if ( pto - > addr . IsLocal ( ) )
LogPrintf ( " Warning: not banning local peer %s! \n " , pto - > addr . ToString ( ) ) ;
else
{
connman . Ban ( pto - > addr , BanReasonNodeMisbehaving ) ;
}
}
state . fShouldBan = false ;
}
BOOST_FOREACH ( const CBlockReject & reject , state . rejects )
connman . PushMessage ( pto , NetMsgType : : REJECT , ( string ) NetMsgType : : BLOCK , reject . chRejectCode , reject . strRejectReason , reject . hashBlock ) ;
state . rejects . clear ( ) ;
// Start block sync
if ( pindexBestHeader = = NULL )
pindexBestHeader = chainActive . Tip ( ) ;
@ -6901,6 +6903,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6901,6 +6903,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
// should only happen during initial block download.
LogPrintf ( " Peer=%d is stalling block download, disconnecting \n " , pto - > id ) ;
pto - > fDisconnect = true ;
return true ;
}
// In case there is a block that has been in flight from this peer for 2 + 0.5 * N times the block interval
// (with N the number of peers from which we're downloading validated blocks), disconnect due to timeout.
@ -6913,6 +6916,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6913,6 +6916,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
if ( nNow > state . nDownloadingSince + consensusParams . nPowTargetSpacing * ( BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads ) ) {
LogPrintf ( " Timeout downloading block %s from peer=%d, disconnecting \n " , queuedBlock . hash . ToString ( ) , pto - > id ) ;
pto - > fDisconnect = true ;
return true ;
}
}