863
clientCanSendFastBlock( const tr_peermsgs * msgs UNUSED )
865
/* FIXME(tiennou): base this on how many blocks we've already sent this
866
* peer, or maybe how many fast blocks per minute we've sent overall,
867
* or maybe how much bandwidth we're already using up w/o fast peers.
868
* I don't know what the Right Thing here is, but
869
* the previous measurement of how many pieces we have is not enough. */
874
peerMadeRequest( tr_peermsgs * msgs, const struct peer_request * req )
876
const int reqIsValid = requestIsValid( msgs, req );
877
const int clientHasPiece = reqIsValid && tr_cpPieceIsComplete( msgs->torrent->completion, req->index );
878
const int peerIsChoked = msgs->info->peerIsChoked;
879
const int peerIsFast = tr_peerIoSupportsFEXT( msgs->io );
880
const int pieceIsFast = reqIsValid && tr_bitfieldHas( msgs->peerAllowedPieces, req->index );
881
const int canSendFast = clientCanSendFastBlock( msgs );
883
if( !reqIsValid ) /* bad request */
885
dbgmsg( msgs, "rejecting an invalid request." );
886
sendFastReject( msgs, req->index, req->offset, req->length );
888
else if( !clientHasPiece ) /* we don't have it */
890
dbgmsg( msgs, "rejecting request for a piece we don't have." );
891
sendFastReject( msgs, req->index, req->offset, req->length );
893
else if( peerIsChoked && !peerIsFast ) /* maybe he doesn't know he's choked? */
895
tr_peerMsgsSetChoke( msgs, 1 );
896
sendFastReject( msgs, req->index, req->offset, req->length );
898
else if( peerIsChoked && peerIsFast && ( !pieceIsFast || !canSendFast ) )
900
sendFastReject( msgs, req->index, req->offset, req->length );
904
struct peer_request * tmp = tr_new( struct peer_request, 1 );
906
if( peerIsFast && pieceIsFast )
907
tr_list_append( &msgs->peerAskedForFast, tmp );
909
tr_list_append( &msgs->peerAskedFor, tmp );
914
messageLengthIsCorrect( const tr_peermsgs * msg, uint8_t id, uint32_t len )
921
case BT_NOT_INTERESTED:
928
case BT_ALLOWED_FAST:
932
return len == (msg->torrent->info.pieceCount+7u)/8u + 1u;
888
955
readBtMessage( tr_peermsgs * msgs, struct evbuffer * inbuf )
895
962
return READ_MORE;
897
964
tr_peerIoReadUint8( msgs->io, inbuf, &id );
899
965
dbgmsg( msgs, "got BT id %d, len %d", (int)id, (int)msglen );
967
if( !messageLengthIsCorrect( msgs, id, msglen ) )
969
fireGotError( msgs );
904
dbgmsg( msgs, "got Choke" );
905
assert( msglen == 0 );
906
msgs->info->clientIsChoked = 1;
909
for( walk = msgs->peerAskedFor; walk != NULL; )
911
tr_list * next = walk->next;
912
/* We shouldn't reject a peer's fast allowed requests at choke */
913
struct peer_request *req = walk->data;
914
if ( !tr_bitfieldHas( msgs->peerAllowedPieces, req->index ) )
916
tr_list_remove_data( &msgs->peerAskedFor, req );
922
tr_peerMsgsCancelAllRequests( msgs );
926
dbgmsg( msgs, "got Unchoke" );
927
assert( msglen == 0 );
928
msgs->info->clientIsChoked = 0;
933
dbgmsg( msgs, "got Interested" );
934
assert( msglen == 0 );
935
msgs->info->peerIsInterested = 1;
936
tr_peerMsgsSetChoke( msgs, 0 );
939
case BT_NOT_INTERESTED:
940
dbgmsg( msgs, "got Not Interested" );
941
assert( msglen == 0 );
942
msgs->info->peerIsInterested = 0;
946
assert( msglen == 4 );
947
tr_peerIoReadUint32( msgs->io, inbuf, &ui32 );
948
tr_bitfieldAdd( msgs->info->have, ui32 );
949
updatePeerProgress( msgs );
950
tr_rcTransferred( msgs->torrent->swarmspeed, msgs->torrent->info.pieceSize );
951
dbgmsg( msgs, "got Have: %u", ui32 );
955
const int clientIsSeed = tr_torrentIsSeed( msgs->torrent );
956
dbgmsg( msgs, "got a bitfield" );
957
assert( msglen == msgs->info->have->len );
958
tr_peerIoReadBytes( msgs->io, inbuf, msgs->info->have->bits, msglen );
959
updatePeerProgress( msgs );
960
tr_peerMsgsSetChoke( msgs, !clientIsSeed || (msgs->info->progress<1.0) );
966
struct peer_request * req;
967
assert( msglen == 12 );
968
req = tr_new( struct peer_request, 1 );
969
tr_peerIoReadUint32( msgs->io, inbuf, &req->index );
970
tr_peerIoReadUint32( msgs->io, inbuf, &req->offset );
971
tr_peerIoReadUint32( msgs->io, inbuf, &req->length );
972
dbgmsg( msgs, "got Request: %u:%u->%u", req->index, req->offset, req->length );
974
if ( !requestIsValid( msgs, req ) )
976
dbgmsg( msgs, "BT_REQUEST: invalid request, ignoring" );
981
If we're not choking him -> continue
983
it doesn't support FPE -> He's deaf, reCHOKE and bail...
985
If the asked piece is not allowed
986
OR he's above our threshold
987
OR we don't have the requested piece -> Reject
989
Asked piece allowed AND he's below our threshold -> continue...
978
dbgmsg( msgs, "got Choke" );
979
msgs->info->clientIsChoked = 1;
980
cancelAllRequestsToPeer( msgs );
981
cancelAllRequestsToClientExceptFast( msgs );
985
dbgmsg( msgs, "got Unchoke" );
986
msgs->info->clientIsChoked = 0;
991
dbgmsg( msgs, "got Interested" );
992
msgs->info->peerIsInterested = 1;
993
tr_peerMsgsSetChoke( msgs, 0 );
996
case BT_NOT_INTERESTED:
997
dbgmsg( msgs, "got Not Interested" );
998
msgs->info->peerIsInterested = 0;
1002
tr_peerIoReadUint32( msgs->io, inbuf, &ui32 );
1003
dbgmsg( msgs, "got Have: %u", ui32 );
1004
tr_bitfieldAdd( msgs->info->have, ui32 );
1005
updatePeerProgress( msgs );
1006
tr_rcTransferred( msgs->torrent->swarmspeed, msgs->torrent->info.pieceSize );
1010
const int clientIsSeed = tr_torrentIsSeed( msgs->torrent );
1011
dbgmsg( msgs, "got a bitfield" );
1012
tr_peerIoReadBytes( msgs->io, inbuf, msgs->info->have->bits, msglen );
1013
updatePeerProgress( msgs );
1014
tr_peerMsgsSetChoke( msgs, !clientIsSeed || (msgs->info->progress<1.0) );
1015
fireNeedReq( msgs );
1020
struct peer_request req;
1021
tr_peerIoReadUint32( msgs->io, inbuf, &req.index );
1022
tr_peerIoReadUint32( msgs->io, inbuf, &req.offset );
1023
tr_peerIoReadUint32( msgs->io, inbuf, &req.length );
1024
dbgmsg( msgs, "got Request: %u:%u->%u", req.index, req.offset, req.length );
1025
peerMadeRequest( msgs, &req );
1030
struct peer_request req;
1031
tr_peerIoReadUint32( msgs->io, inbuf, &req.index );
1032
tr_peerIoReadUint32( msgs->io, inbuf, &req.offset );
1033
tr_peerIoReadUint32( msgs->io, inbuf, &req.length );
1034
dbgmsg( msgs, "got a Cancel %u:%u->%u", req.index, req.offset, req.length );
1035
tr_free( tr_list_remove( &msgs->peerAskedForFast, &req, compareRequest ) );
1036
tr_free( tr_list_remove( &msgs->peerAskedFor, &req, compareRequest ) );
1041
dbgmsg( msgs, "got a Piece!" );
1042
assert( msgs->blockToUs.length == 0 );
1043
tr_peerIoReadUint32( msgs->io, inbuf, &msgs->blockToUs.index );
1044
tr_peerIoReadUint32( msgs->io, inbuf, &msgs->blockToUs.offset );
1045
msgs->blockToUs.length = msglen - 8;
1046
assert( EVBUFFER_LENGTH(msgs->inBlock) == 0 );
1047
msgs->state = msgs->blockToUs.length ? READING_BT_PIECE : AWAITING_BT_LENGTH;
1053
dbgmsg( msgs, "Got a BT_PORT" );
1054
tr_peerIoReadUint16( msgs->io, inbuf, &msgs->info->port );
993
if ( msgs->info->peerIsChoked )
995
if ( !tr_peerIoSupportsFEXT( msgs->io ) )
997
dbgmsg( msgs, "BT_REQUEST: peer is choked, ignoring" );
998
/* Didn't he get it? */
999
tr_peerMsgsSetChoke( msgs, 1 );
1005
if ( !tr_bitfieldHas( msgs->peerAllowedPieces, req->index )
1006
|| ( msgs->info->progress * (float)msgs->torrent->info.pieceCount) >= MAX_ALLOWED_SET_COUNT
1007
|| !tr_cpPieceIsComplete( msgs->torrent->completion, req->index ) )
1009
dbgmsg( msgs, "BT_REQUEST: peer requests an un-fastallowed piece" );
1010
sendFastReject( msgs, req->index, req->offset, req->length );
1014
dbgmsg( msgs, "BT_REQUEST: fast allowed piece, accepting request" );
1018
tr_list_append( &msgs->peerAskedFor, req );
1023
struct peer_request req;
1025
assert( msglen == 12 );
1026
tr_peerIoReadUint32( msgs->io, inbuf, &req.index );
1027
tr_peerIoReadUint32( msgs->io, inbuf, &req.offset );
1028
tr_peerIoReadUint32( msgs->io, inbuf, &req.length );
1029
dbgmsg( msgs, "got a Cancel %u:%u->%u", req.index, req.offset, req.length );
1030
data = tr_list_remove( &msgs->peerAskedFor, &req, compareRequest );
1036
dbgmsg( msgs, "got a Piece!" );
1037
assert( msgs->blockToUs.length == 0 );
1038
tr_peerIoReadUint32( msgs->io, inbuf, &msgs->blockToUs.index );
1039
tr_peerIoReadUint32( msgs->io, inbuf, &msgs->blockToUs.offset );
1040
msgs->blockToUs.length = msglen - 8;
1041
assert( EVBUFFER_LENGTH(msgs->inBlock) == 0 );
1042
msgs->state = msgs->blockToUs.length ? READING_BT_PIECE : AWAITING_BT_LENGTH;
1048
dbgmsg( msgs, "Got a BT_PORT" );
1049
assert( msglen == 2 );
1050
tr_peerIoReadUint16( msgs->io, inbuf, &msgs->info->port );
1060
assert( msglen == 0 );
1061
dbgmsg( msgs, "Got a BT_HAVE_ALL" );
1062
memset( msgs->info->have->bits, 1, msgs->info->have->len );
1063
updatePeerProgress( msgs );
1067
case BT_HAVE_NONE: {
1068
assert( msglen == 0 );
1069
dbgmsg( msgs, "Got a BT_HAVE_NONE" );
1070
tr_bitfieldClear( msgs->info->have );
1071
updatePeerProgress( msgs );
1076
struct peer_request req;
1078
assert( msglen == 12 );
1079
dbgmsg( msgs, "Got a BT_REJECT" );
1080
tr_peerIoReadUint32( msgs->io, inbuf, &req.index );
1081
tr_peerIoReadUint32( msgs->io, inbuf, &req.offset );
1082
tr_peerIoReadUint32( msgs->io, inbuf, &req.length );
1083
node = tr_list_find( msgs->peerAskedFor, &req, compareRequest );
1084
if( node != NULL ) {
1085
void * data = node->data;
1086
tr_list_remove_data( &msgs->peerAskedFor, data );
1088
dbgmsg( msgs, "found the req that peer has rejected... cancelled." );
1093
case BT_ALLOWED_FAST: {
1094
assert( msglen == 4 );
1095
dbgmsg( msgs, "Got a BT_ALLOWED_FAST" );
1096
tr_peerIoReadUint32( msgs->io, inbuf, &ui32 );
1097
tr_bitfieldAdd( msgs->clientAllowedPieces, ui32 );
1102
dbgmsg( msgs, "Got a BT_LTEP" );
1103
parseLtep( msgs, msglen, inbuf );
1107
dbgmsg( msgs, "peer sent us an UNKNOWN: %d", (int)id );
1108
tr_peerIoDrain( msgs->io, inbuf, msglen );
1059
/* FIXME(tiennou) */
1061
tr_peerIoReadUint32( msgs->io, inbuf, &index );
1066
dbgmsg( msgs, "Got a BT_HAVE_ALL" );
1067
tr_bitfieldAddRange( msgs->info->have, 0, msgs->torrent->info.pieceCount );
1068
updatePeerProgress( msgs );
1072
dbgmsg( msgs, "Got a BT_HAVE_NONE" );
1073
tr_bitfieldClear( msgs->info->have );
1074
updatePeerProgress( msgs );
1078
struct peer_request req;
1079
dbgmsg( msgs, "Got a BT_REJECT" );
1080
tr_peerIoReadUint32( msgs->io, inbuf, &req.index );
1081
tr_peerIoReadUint32( msgs->io, inbuf, &req.offset );
1082
tr_peerIoReadUint32( msgs->io, inbuf, &req.length );
1083
tr_free( tr_list_remove( &msgs->clientAskedFor, &req, compareRequest ) );
1087
case BT_ALLOWED_FAST: {
1088
dbgmsg( msgs, "Got a BT_ALLOWED_FAST" );
1089
tr_peerIoReadUint32( msgs->io, inbuf, &ui32 );
1090
tr_bitfieldAdd( msgs->clientAllowedPieces, ui32 );
1095
dbgmsg( msgs, "Got a BT_LTEP" );
1096
parseLtep( msgs, msglen, inbuf );
1100
dbgmsg( msgs, "peer sent us an UNKNOWN: %d", (int)id );
1101
tr_peerIoDrain( msgs->io, inbuf, msglen );
1112
1105
msgs->incomingMessageLength = -1;
1406
1411
if( !canWrite( msgs ) )
1414
else if(( len = EVBUFFER_LENGTH( msgs->outBlock ) ))
1416
const size_t uploadMax = getUploadMax( msgs );
1417
const size_t outlen = MIN( len, uploadMax );
1418
tr_peerIoWrite( msgs->io, EVBUFFER_DATA( msgs->outBlock ), outlen );
1419
evbuffer_drain( msgs->outBlock, outlen );
1420
msgs->clientSentAnythingAt = now;
1421
peerGotBytes( msgs, outlen );
1423
dbgmsg( msgs, "wrote %d bytes; %d left in block", (int)outlen, (int)len );
1409
1426
else if(( len = EVBUFFER_LENGTH( msgs->outMessages ) ))
1411
1428
tr_peerIoWriteBuf( msgs->io, msgs->outMessages );
1412
1429
msgs->clientSentAnythingAt = now;
1414
else if(( msgs->peerAskedFor ))
1416
if( canUpload( msgs ) )
1418
struct peer_request * r = tr_list_pop_front( &msgs->peerAskedFor );
1419
uint8_t * buf = tr_new( uint8_t, r->length );
1421
if( requestIsValid( msgs, r )
1422
&& tr_cpPieceIsComplete( msgs->torrent->completion, r->index )
1423
&& !tr_ioRead( msgs->torrent, r->index, r->offset, r->length, buf ) )
1425
protocolSendPiece( msgs, r, buf );
1426
peerGotBytes( msgs, r->length );
1427
msgs->clientSentAnythingAt = now;
1434
1431
else if( ( now - msgs->clientSentAnythingAt ) > KEEPALIVE_INTERVAL_SECS )
1436
1433
sendKeepalive( msgs );
1436
if( !EVBUFFER_LENGTH( msgs->outBlock )
1437
&& (( r = popNextRequest( msgs )))
1438
&& requestIsValid( msgs, r )
1439
&& tr_cpPieceIsComplete( msgs->torrent->completion, r->index ) )
1441
uint8_t * buf = tr_new( uint8_t, r->length );
1443
if( !tr_ioRead( msgs->torrent, r->index, r->offset, r->length, buf ) )
1445
tr_peerIo * io = msgs->io;
1446
struct evbuffer * out = msgs->outBlock;
1448
dbgmsg( msgs, "sending block %u:%u->%u", r->index, r->offset, r->length );
1449
tr_peerIoWriteUint32( io, out, sizeof(uint8_t) + 2*sizeof(uint32_t) + r->length );
1450
tr_peerIoWriteUint8 ( io, out, BT_PIECE );
1451
tr_peerIoWriteUint32( io, out, r->index );
1452
tr_peerIoWriteUint32( io, out, r->offset );
1453
tr_peerIoWriteBytes ( io, out, buf, r->length );
1459
pulse( msgs ); /* start sending it right away */
1439
1462
return TRUE; /* loop forever */