diff --git a/src/network/networktransport.cc b/src/network/networktransport.cc index 150f444..127e80c 100644 --- a/src/network/networktransport.cc +++ b/src/network/networktransport.cc @@ -45,6 +45,7 @@ Transport::Transport( MyState &initial_state, RemoteState : connection( desired_ip, desired_port ), sender( &connection, initial_state ), received_states( 1, TimestampedState( timestamp(), 0, initial_remote ) ), + receiver_quench_timer( 0 ), last_receiver_state( initial_remote ), fragments(), verbose( false ) @@ -58,6 +59,7 @@ Transport::Transport( MyState &initial_state, RemoteState : connection( key_str, ip, port ), sender( &connection, initial_state ), received_states( 1, TimestampedState( timestamp(), 0, initial_remote ) ), + receiver_quench_timer( 0 ), last_receiver_state( initial_remote ), fragments(), verbose( false ) @@ -116,11 +118,16 @@ void Transport::recv( void ) process_throwaway_until( inst.throwaway_num() ); if ( received_states.size() > 1024 ) { /* limit on state queue */ - if ( verbose ) { - fprintf( stderr, "[%u] Receiver queue full, discarding %d (malicious sender or long-unidirectional connectivity?)\n", - (unsigned int)(timestamp() % 100000), (int)inst.new_num() ); + uint64_t now = timestamp(); + if ( now < receiver_quench_timer ) { /* deny letting state grow further */ + if ( verbose ) { + fprintf( stderr, "[%u] Receiver queue full, discarding %d (malicious sender or long-unidirectional connectivity?)\n", + (unsigned int)(timestamp() % 100000), (int)inst.new_num() ); + } + return; + } else { + receiver_quench_timer = now + 15000; } - return; } /* apply diff to reference state */ diff --git a/src/network/networktransport.h b/src/network/networktransport.h index 99ece2c..c23d0bd 100644 --- a/src/network/networktransport.h +++ b/src/network/networktransport.h @@ -60,6 +60,7 @@ namespace Network { /* simple receiver */ list< TimestampedState > received_states; + uint64_t receiver_quench_timer; RemoteState last_receiver_state; /* the state we were in when user last queried state */ FragmentAssembly fragments; bool verbose;