mirror of
https://github.com/transmission/transmission
synced 2025-03-06 19:48:15 +00:00
Clean up the peer message code a little.
This commit is contained in:
parent
f884a9c4d4
commit
0ac5a12189
2 changed files with 67 additions and 53 deletions
|
@ -26,6 +26,17 @@
|
||||||
* This file handles all outgoing messages
|
* This file handles all outgoing messages
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
|
#define PEER_MSG_CHOKE 0
|
||||||
|
#define PEER_MSG_UNCHOKE 1
|
||||||
|
#define PEER_MSG_INTERESTED 2
|
||||||
|
#define PEER_MSG_UNINTERESTED 3
|
||||||
|
#define PEER_MSG_HAVE 4
|
||||||
|
#define PEER_MSG_BITFIELD 5
|
||||||
|
#define PEER_MSG_REQUEST 6
|
||||||
|
#define PEER_MSG_PIECE 7
|
||||||
|
#define PEER_MSG_CANCEL 8
|
||||||
|
#define PEER_MSG_PORT 9
|
||||||
|
|
||||||
static uint8_t * messagesPending( tr_peer_t * peer, int * size )
|
static uint8_t * messagesPending( tr_peer_t * peer, int * size )
|
||||||
{
|
{
|
||||||
if( peer->outBlockSending || peer->outMessagesPos < 1 )
|
if( peer->outBlockSending || peer->outMessagesPos < 1 )
|
||||||
|
@ -78,7 +89,7 @@ static uint8_t * blockPending( tr_torrent_t * tor, tr_peer_t * peer,
|
||||||
p = (uint8_t *) peer->outBlock;
|
p = (uint8_t *) peer->outBlock;
|
||||||
|
|
||||||
TR_HTONL( 9 + r->length, p );
|
TR_HTONL( 9 + r->length, p );
|
||||||
p[4] = 7;
|
p[4] = PEER_MSG_PIECE;
|
||||||
TR_HTONL( r->index, p + 5 );
|
TR_HTONL( r->index, p + 5 );
|
||||||
TR_HTONL( r->begin, p + 9 );
|
TR_HTONL( r->begin, p + 9 );
|
||||||
|
|
||||||
|
@ -118,10 +129,16 @@ static void blockSent( tr_peer_t * peer, int size )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t * getPointerForSize( tr_peer_t * peer, int size )
|
static uint8_t * getMessagePointer( tr_peer_t * peer, int size, int id )
|
||||||
{
|
{
|
||||||
uint8_t * p;
|
uint8_t * p;
|
||||||
|
|
||||||
|
size += 4;
|
||||||
|
if( 0 <= id )
|
||||||
|
{
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
|
||||||
if( peer->outMessagesPos + size > peer->outMessagesSize )
|
if( peer->outMessagesPos + size > peer->outMessagesSize )
|
||||||
{
|
{
|
||||||
peer->outMessagesSize = peer->outMessagesPos + size;
|
peer->outMessagesSize = peer->outMessagesPos + size;
|
||||||
|
@ -132,6 +149,14 @@ static uint8_t * getPointerForSize( tr_peer_t * peer, int size )
|
||||||
p = &peer->outMessages[peer->outMessagesPos];
|
p = &peer->outMessages[peer->outMessagesPos];
|
||||||
peer->outMessagesPos += size;
|
peer->outMessagesPos += size;
|
||||||
|
|
||||||
|
TR_HTONL( size - 4, p );
|
||||||
|
p += 4;
|
||||||
|
if( 0 <= id )
|
||||||
|
{
|
||||||
|
*p = id;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,9 +169,7 @@ static void sendKeepAlive( tr_peer_t * peer )
|
||||||
{
|
{
|
||||||
uint8_t * p;
|
uint8_t * p;
|
||||||
|
|
||||||
p = getPointerForSize( peer, 4 );
|
p = getMessagePointer( peer, 0, -1 );
|
||||||
|
|
||||||
TR_HTONL( 0, p );
|
|
||||||
|
|
||||||
peer_dbg( "SEND keep-alive" );
|
peer_dbg( "SEND keep-alive" );
|
||||||
}
|
}
|
||||||
|
@ -160,11 +183,10 @@ static void sendKeepAlive( tr_peer_t * peer )
|
||||||
static void sendChoke( tr_peer_t * peer, int yes )
|
static void sendChoke( tr_peer_t * peer, int yes )
|
||||||
{
|
{
|
||||||
uint8_t * p;
|
uint8_t * p;
|
||||||
|
int id;
|
||||||
|
|
||||||
p = getPointerForSize( peer, 5 );
|
id = ( yes ? PEER_MSG_CHOKE : PEER_MSG_UNCHOKE );
|
||||||
|
p = getMessagePointer( peer, 0, id );
|
||||||
TR_HTONL( 1, p );
|
|
||||||
p[4] = yes ? 0 : 1;
|
|
||||||
|
|
||||||
peer->amChoking = yes;
|
peer->amChoking = yes;
|
||||||
|
|
||||||
|
@ -186,11 +208,10 @@ static void sendChoke( tr_peer_t * peer, int yes )
|
||||||
static void sendInterest( tr_peer_t * peer, int yes )
|
static void sendInterest( tr_peer_t * peer, int yes )
|
||||||
{
|
{
|
||||||
uint8_t * p;
|
uint8_t * p;
|
||||||
|
int id;
|
||||||
|
|
||||||
p = getPointerForSize( peer, 5 );
|
id = ( yes ? PEER_MSG_INTERESTED : PEER_MSG_UNINTERESTED );
|
||||||
|
p = getMessagePointer( peer, 0, id );
|
||||||
TR_HTONL( 1, p );
|
|
||||||
p[4] = yes ? 2 : 3;
|
|
||||||
|
|
||||||
peer->amInterested = yes;
|
peer->amInterested = yes;
|
||||||
|
|
||||||
|
@ -206,11 +227,9 @@ static void sendHave( tr_peer_t * peer, int piece )
|
||||||
{
|
{
|
||||||
uint8_t * p;
|
uint8_t * p;
|
||||||
|
|
||||||
p = getPointerForSize( peer, 9 );
|
p = getMessagePointer( peer, 4, PEER_MSG_HAVE );
|
||||||
|
|
||||||
TR_HTONL( 5, &p[0] );
|
TR_HTONL( piece, p );
|
||||||
p[4] = 4;
|
|
||||||
TR_HTONL( piece, &p[5] );
|
|
||||||
|
|
||||||
peer_dbg( "SEND have %d", piece );
|
peer_dbg( "SEND have %d", piece );
|
||||||
}
|
}
|
||||||
|
@ -228,11 +247,9 @@ static void sendBitfield( tr_torrent_t * tor, tr_peer_t * peer )
|
||||||
uint8_t * p;
|
uint8_t * p;
|
||||||
int bitfieldSize = ( tor->info.pieceCount + 7 ) / 8;
|
int bitfieldSize = ( tor->info.pieceCount + 7 ) / 8;
|
||||||
|
|
||||||
p = getPointerForSize( peer, 5 + bitfieldSize );
|
p = getMessagePointer( peer, bitfieldSize, PEER_MSG_BITFIELD );
|
||||||
|
|
||||||
TR_HTONL( 1 + bitfieldSize, p );
|
memcpy( p, tr_cpPieceBitfield( tor->completion ), bitfieldSize );
|
||||||
p[4] = 5;
|
|
||||||
memcpy( &p[5], tr_cpPieceBitfield( tor->completion ), bitfieldSize );
|
|
||||||
|
|
||||||
peer_dbg( "SEND bitfield" );
|
peer_dbg( "SEND bitfield" );
|
||||||
}
|
}
|
||||||
|
@ -258,13 +275,11 @@ static void sendRequest( tr_torrent_t * tor, tr_peer_t * peer, int block )
|
||||||
(peer->inRequestCount)++;
|
(peer->inRequestCount)++;
|
||||||
|
|
||||||
/* Build the "ask" message */
|
/* Build the "ask" message */
|
||||||
p = getPointerForSize( peer, 17 );
|
p = getMessagePointer( peer, 12, PEER_MSG_REQUEST );
|
||||||
|
|
||||||
TR_HTONL( 13, p );
|
TR_HTONL( r->index, p );
|
||||||
p[4] = 6;
|
TR_HTONL( r->begin, p + 4 );
|
||||||
TR_HTONL( r->index, p + 5 );
|
TR_HTONL( r->length, p + 8 );
|
||||||
TR_HTONL( r->begin, p + 9 );
|
|
||||||
TR_HTONL( r->length, p + 13 );
|
|
||||||
|
|
||||||
tr_cpDownloaderAdd( tor->completion, block );
|
tr_cpDownloaderAdd( tor->completion, block );
|
||||||
|
|
||||||
|
@ -297,14 +312,12 @@ static void sendCancel( tr_torrent_t * tor, int block )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = getPointerForSize( peer, 17 );
|
p = getMessagePointer( peer, 12, PEER_MSG_CANCEL );
|
||||||
|
|
||||||
/* Build the "cancel" message */
|
/* Build the "cancel" message */
|
||||||
TR_HTONL( 13, p );
|
TR_HTONL( r->index, p );
|
||||||
p[4] = 8;
|
TR_HTONL( r->begin, p + 4 );
|
||||||
TR_HTONL( r->index, p + 5 );
|
TR_HTONL( r->length, p + 8 );
|
||||||
TR_HTONL( r->begin, p + 9 );
|
|
||||||
TR_HTONL( r->length, p + 13 );
|
|
||||||
|
|
||||||
peer_dbg( "SEND cancel %d/%d (%d bytes)",
|
peer_dbg( "SEND cancel %d/%d (%d bytes)",
|
||||||
r->index, r->begin, r->length );
|
r->index, r->begin, r->length );
|
||||||
|
|
|
@ -37,7 +37,7 @@ static inline int parseChoke( tr_torrent_t * tor, tr_peer_t * peer,
|
||||||
tr_request_t * r;
|
tr_request_t * r;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( len != 1 )
|
if( len != 0 )
|
||||||
{
|
{
|
||||||
peer_dbg( "GET %schoke, invalid", choking ? "" : "un" );
|
peer_dbg( "GET %schoke, invalid", choking ? "" : "un" );
|
||||||
return TR_ERROR_ASSERT;
|
return TR_ERROR_ASSERT;
|
||||||
|
@ -69,7 +69,7 @@ static inline int parseChoke( tr_torrent_t * tor, tr_peer_t * peer,
|
||||||
static inline int parseInterested( tr_peer_t * peer, int len,
|
static inline int parseInterested( tr_peer_t * peer, int len,
|
||||||
int interested )
|
int interested )
|
||||||
{
|
{
|
||||||
if( len != 1 )
|
if( len != 0 )
|
||||||
{
|
{
|
||||||
peer_dbg( "GET %sinterested, invalid", interested ? "" : "un" );
|
peer_dbg( "GET %sinterested, invalid", interested ? "" : "un" );
|
||||||
return TR_ERROR_ASSERT;
|
return TR_ERROR_ASSERT;
|
||||||
|
@ -92,7 +92,7 @@ static inline int parseHave( tr_torrent_t * tor, tr_peer_t * peer,
|
||||||
{
|
{
|
||||||
uint32_t piece;
|
uint32_t piece;
|
||||||
|
|
||||||
if( len != 5 )
|
if( len != 4 )
|
||||||
{
|
{
|
||||||
peer_dbg( "GET have, invalid" );
|
peer_dbg( "GET have, invalid" );
|
||||||
return TR_ERROR_ASSERT;
|
return TR_ERROR_ASSERT;
|
||||||
|
@ -128,7 +128,7 @@ static inline int parseBitfield( tr_torrent_t * tor, tr_peer_t * peer,
|
||||||
|
|
||||||
bitfieldSize = ( inf->pieceCount + 7 ) / 8;
|
bitfieldSize = ( inf->pieceCount + 7 ) / 8;
|
||||||
|
|
||||||
if( len != 1 + bitfieldSize )
|
if( len != bitfieldSize )
|
||||||
{
|
{
|
||||||
peer_dbg( "GET bitfield, wrong size" );
|
peer_dbg( "GET bitfield, wrong size" );
|
||||||
return TR_ERROR_ASSERT;
|
return TR_ERROR_ASSERT;
|
||||||
|
@ -178,7 +178,7 @@ static inline int parseRequest( tr_peer_t * peer, uint8_t * p, int len )
|
||||||
int index, begin, length;
|
int index, begin, length;
|
||||||
tr_request_t * r;
|
tr_request_t * r;
|
||||||
|
|
||||||
if( len != 13 )
|
if( len != 12 )
|
||||||
{
|
{
|
||||||
peer_dbg( "GET request, invalid" );
|
peer_dbg( "GET request, invalid" );
|
||||||
return TR_ERROR_ASSERT;
|
return TR_ERROR_ASSERT;
|
||||||
|
@ -274,13 +274,13 @@ static inline int parsePiece( tr_torrent_t * tor, tr_peer_t * peer,
|
||||||
block = tr_block( index, begin );
|
block = tr_block( index, begin );
|
||||||
|
|
||||||
peer_dbg( "GET piece %d/%d (%d bytes)",
|
peer_dbg( "GET piece %d/%d (%d bytes)",
|
||||||
index, begin, len - 9 );
|
index, begin, len - 8 );
|
||||||
|
|
||||||
updateRequests( tor, peer, index, begin );
|
updateRequests( tor, peer, index, begin );
|
||||||
tor->downloadedCur += len;
|
tor->downloadedCur += len;
|
||||||
|
|
||||||
/* Sanity checks */
|
/* Sanity checks */
|
||||||
if( len - 9 != tr_blockSize( block ) )
|
if( len - 8 != tr_blockSize( block ) )
|
||||||
{
|
{
|
||||||
peer_dbg( "wrong size (expecting %d)", tr_blockSize( block ) );
|
peer_dbg( "wrong size (expecting %d)", tr_blockSize( block ) );
|
||||||
return TR_ERROR_ASSERT;
|
return TR_ERROR_ASSERT;
|
||||||
|
@ -299,7 +299,7 @@ static inline int parsePiece( tr_torrent_t * tor, tr_peer_t * peer,
|
||||||
tr_bitfieldAdd( peer->blamefield, index );
|
tr_bitfieldAdd( peer->blamefield, index );
|
||||||
|
|
||||||
/* Write to disk */
|
/* Write to disk */
|
||||||
if( ( ret = tr_ioWrite( tor->io, index, begin, len - 9, &p[8] ) ) )
|
if( ( ret = tr_ioWrite( tor->io, index, begin, len - 8, &p[8] ) ) )
|
||||||
{
|
{
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -343,7 +343,7 @@ static inline int parseCancel( tr_peer_t * peer, uint8_t * p, int len )
|
||||||
int i;
|
int i;
|
||||||
tr_request_t * r;
|
tr_request_t * r;
|
||||||
|
|
||||||
if( len != 13 )
|
if( len != 12 )
|
||||||
{
|
{
|
||||||
peer_dbg( "GET cancel, invalid" );
|
peer_dbg( "GET cancel, invalid" );
|
||||||
return TR_ERROR_ASSERT;
|
return TR_ERROR_ASSERT;
|
||||||
|
@ -376,7 +376,7 @@ static inline int parsePort( tr_peer_t * peer, uint8_t * p, int len )
|
||||||
{
|
{
|
||||||
in_port_t port;
|
in_port_t port;
|
||||||
|
|
||||||
if( len != 3 )
|
if( len != 2 )
|
||||||
{
|
{
|
||||||
peer_dbg( "GET port, invalid" );
|
peer_dbg( "GET port, invalid" );
|
||||||
return TR_ERROR_ASSERT;
|
return TR_ERROR_ASSERT;
|
||||||
|
@ -395,28 +395,29 @@ static inline int parseMessage( tr_torrent_t * tor, tr_peer_t * peer,
|
||||||
|
|
||||||
/* Type of the message */
|
/* Type of the message */
|
||||||
id = *(p++);
|
id = *(p++);
|
||||||
|
len--;
|
||||||
|
|
||||||
switch( id )
|
switch( id )
|
||||||
{
|
{
|
||||||
case 0:
|
case PEER_MSG_CHOKE:
|
||||||
return parseChoke( tor, peer, len, 1 );
|
return parseChoke( tor, peer, len, 1 );
|
||||||
case 1:
|
case PEER_MSG_UNCHOKE:
|
||||||
return parseChoke( tor, peer, len, 0 );
|
return parseChoke( tor, peer, len, 0 );
|
||||||
case 2:
|
case PEER_MSG_INTERESTED:
|
||||||
return parseInterested( peer, len, 1 );
|
return parseInterested( peer, len, 1 );
|
||||||
case 3:
|
case PEER_MSG_UNINTERESTED:
|
||||||
return parseInterested( peer, len, 0 );
|
return parseInterested( peer, len, 0 );
|
||||||
case 4:
|
case PEER_MSG_HAVE:
|
||||||
return parseHave( tor, peer, p, len );
|
return parseHave( tor, peer, p, len );
|
||||||
case 5:
|
case PEER_MSG_BITFIELD:
|
||||||
return parseBitfield( tor, peer, p, len );
|
return parseBitfield( tor, peer, p, len );
|
||||||
case 6:
|
case PEER_MSG_REQUEST:
|
||||||
return parseRequest( peer, p, len );
|
return parseRequest( peer, p, len );
|
||||||
case 7:
|
case PEER_MSG_PIECE:
|
||||||
return parsePiece( tor, peer, p, len );
|
return parsePiece( tor, peer, p, len );
|
||||||
case 8:
|
case PEER_MSG_CANCEL:
|
||||||
return parseCancel( peer, p, len );
|
return parseCancel( peer, p, len );
|
||||||
case 9:
|
case PEER_MSG_PORT:
|
||||||
return parsePort( peer, p, len );
|
return parsePort( peer, p, len );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue