diff --git a/src/network/transportfragment.cc b/src/network/transportfragment.cc index 297dcb8..2aeffd5 100644 --- a/src/network/transportfragment.cc +++ b/src/network/transportfragment.cc @@ -144,6 +144,7 @@ vector Fragmenter::make_fragments( const Instruction &inst, int MTU ) || (inst.new_num() != last_instruction.new_num()) || (inst.ack_num() != last_instruction.ack_num()) || (inst.throwaway_num() != last_instruction.throwaway_num()) + || (inst.chaff() != last_instruction.chaff()) || (inst.protocol_version() != last_instruction.protocol_version()) || (last_MTU != MTU) ) { next_instruction_id++; diff --git a/src/network/transportsender.cc b/src/network/transportsender.cc index 3febd85..66427c9 100644 --- a/src/network/transportsender.cc +++ b/src/network/transportsender.cc @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include "transportsender.h" #include "transportfragment.h" @@ -46,6 +48,7 @@ TransportSender::TransportSender( Connection *s_connection, MyState &in SEND_MINDELAY( 15 ), last_heard( 0 ) { + srand( time( NULL ) ); /* for chaff */ } /* Try to send roughly two frames per RTT, bounded by limits on frame rate */ @@ -257,6 +260,18 @@ void TransportSender::rationalize_states( void ) } } +static const string make_chaff( void ) +{ + const int CHAFF_MAX = 16; + + char chaff[ CHAFF_MAX ]; + for ( int i = 0; i < CHAFF_MAX; i++ ) { + chaff[ i ] = rand() % 256; + } + int chaff_len = rand() % (CHAFF_MAX + 1); + return string( chaff, chaff_len ); +} + template void TransportSender::send_in_fragments( string diff, uint64_t new_num ) { @@ -268,6 +283,7 @@ void TransportSender::send_in_fragments( string diff, uint64_t new_num inst.set_ack_num( ack_num ); inst.set_throwaway_num( sent_states.front().num ); inst.set_diff( diff ); + inst.set_chaff( make_chaff() ); if ( new_num == uint64_t(-1) ) { shutdown_tries++; diff --git a/src/protobufs/transportinstruction.proto b/src/protobufs/transportinstruction.proto index 20009fd..d4a76f7 100644 --- a/src/protobufs/transportinstruction.proto +++ b/src/protobufs/transportinstruction.proto @@ -11,4 +11,6 @@ message Instruction { optional uint64 throwaway_num = 5; optional bytes diff = 6; + + optional bytes chaff = 7; }