1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-03-06 11:38:21 +00:00

Clean up the peer message code a little.

This commit is contained in:
Josh Elsasser 2007-01-28 02:23:09 +00:00
parent f884a9c4d4
commit 0ac5a12189
2 changed files with 67 additions and 53 deletions

View file

@ -26,6 +26,17 @@
* 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 )
{
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;
TR_HTONL( 9 + r->length, p );
p[4] = 7;
p[4] = PEER_MSG_PIECE;
TR_HTONL( r->index, p + 5 );
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;
size += 4;
if( 0 <= id )
{
size++;
}
if( peer->outMessagesPos + size > peer->outMessagesSize )
{
peer->outMessagesSize = peer->outMessagesPos + size;
@ -132,6 +149,14 @@ static uint8_t * getPointerForSize( tr_peer_t * peer, int size )
p = &peer->outMessages[peer->outMessagesPos];
peer->outMessagesPos += size;
TR_HTONL( size - 4, p );
p += 4;
if( 0 <= id )
{
*p = id;
p++;
}
return p;
}
@ -144,9 +169,7 @@ static void sendKeepAlive( tr_peer_t * peer )
{
uint8_t * p;
p = getPointerForSize( peer, 4 );
TR_HTONL( 0, p );
p = getMessagePointer( peer, 0, -1 );
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 )
{
uint8_t * p;
int id;
p = getPointerForSize( peer, 5 );
TR_HTONL( 1, p );
p[4] = yes ? 0 : 1;
id = ( yes ? PEER_MSG_CHOKE : PEER_MSG_UNCHOKE );
p = getMessagePointer( peer, 0, id );
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 )
{
uint8_t * p;
int id;
p = getPointerForSize( peer, 5 );
TR_HTONL( 1, p );
p[4] = yes ? 2 : 3;
id = ( yes ? PEER_MSG_INTERESTED : PEER_MSG_UNINTERESTED );
p = getMessagePointer( peer, 0, id );
peer->amInterested = yes;
@ -206,11 +227,9 @@ static void sendHave( tr_peer_t * peer, int piece )
{
uint8_t * p;
p = getPointerForSize( peer, 9 );
p = getMessagePointer( peer, 4, PEER_MSG_HAVE );
TR_HTONL( 5, &p[0] );
p[4] = 4;
TR_HTONL( piece, &p[5] );
TR_HTONL( piece, p );
peer_dbg( "SEND have %d", piece );
}
@ -228,11 +247,9 @@ static void sendBitfield( tr_torrent_t * tor, tr_peer_t * peer )
uint8_t * p;
int bitfieldSize = ( tor->info.pieceCount + 7 ) / 8;
p = getPointerForSize( peer, 5 + bitfieldSize );
p = getMessagePointer( peer, bitfieldSize, PEER_MSG_BITFIELD );
TR_HTONL( 1 + bitfieldSize, p );
p[4] = 5;
memcpy( &p[5], tr_cpPieceBitfield( tor->completion ), bitfieldSize );
memcpy( p, tr_cpPieceBitfield( tor->completion ), bitfieldSize );
peer_dbg( "SEND bitfield" );
}
@ -258,13 +275,11 @@ static void sendRequest( tr_torrent_t * tor, tr_peer_t * peer, int block )
(peer->inRequestCount)++;
/* Build the "ask" message */
p = getPointerForSize( peer, 17 );
p = getMessagePointer( peer, 12, PEER_MSG_REQUEST );
TR_HTONL( 13, p );
p[4] = 6;
TR_HTONL( r->index, p + 5 );
TR_HTONL( r->begin, p + 9 );
TR_HTONL( r->length, p + 13 );
TR_HTONL( r->index, p );
TR_HTONL( r->begin, p + 4 );
TR_HTONL( r->length, p + 8 );
tr_cpDownloaderAdd( tor->completion, block );
@ -297,14 +312,12 @@ static void sendCancel( tr_torrent_t * tor, int block )
continue;
}
p = getPointerForSize( peer, 17 );
p = getMessagePointer( peer, 12, PEER_MSG_CANCEL );
/* Build the "cancel" message */
TR_HTONL( 13, p );
p[4] = 8;
TR_HTONL( r->index, p + 5 );
TR_HTONL( r->begin, p + 9 );
TR_HTONL( r->length, p + 13 );
TR_HTONL( r->index, p );
TR_HTONL( r->begin, p + 4 );
TR_HTONL( r->length, p + 8 );
peer_dbg( "SEND cancel %d/%d (%d bytes)",
r->index, r->begin, r->length );

View file

@ -37,7 +37,7 @@ static inline int parseChoke( tr_torrent_t * tor, tr_peer_t * peer,
tr_request_t * r;
int i;
if( len != 1 )
if( len != 0 )
{
peer_dbg( "GET %schoke, invalid", choking ? "" : "un" );
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,
int interested )
{
if( len != 1 )
if( len != 0 )
{
peer_dbg( "GET %sinterested, invalid", interested ? "" : "un" );
return TR_ERROR_ASSERT;
@ -92,7 +92,7 @@ static inline int parseHave( tr_torrent_t * tor, tr_peer_t * peer,
{
uint32_t piece;
if( len != 5 )
if( len != 4 )
{
peer_dbg( "GET have, invalid" );
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;
if( len != 1 + bitfieldSize )
if( len != bitfieldSize )
{
peer_dbg( "GET bitfield, wrong size" );
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;
tr_request_t * r;
if( len != 13 )
if( len != 12 )
{
peer_dbg( "GET request, invalid" );
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 );
peer_dbg( "GET piece %d/%d (%d bytes)",
index, begin, len - 9 );
index, begin, len - 8 );
updateRequests( tor, peer, index, begin );
tor->downloadedCur += len;
/* Sanity checks */
if( len - 9 != tr_blockSize( block ) )
if( len - 8 != tr_blockSize( block ) )
{
peer_dbg( "wrong size (expecting %d)", tr_blockSize( block ) );
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 );
/* 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;
}
@ -343,7 +343,7 @@ static inline int parseCancel( tr_peer_t * peer, uint8_t * p, int len )
int i;
tr_request_t * r;
if( len != 13 )
if( len != 12 )
{
peer_dbg( "GET cancel, invalid" );
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;
if( len != 3 )
if( len != 2 )
{
peer_dbg( "GET port, invalid" );
return TR_ERROR_ASSERT;
@ -395,28 +395,29 @@ static inline int parseMessage( tr_torrent_t * tor, tr_peer_t * peer,
/* Type of the message */
id = *(p++);
len--;
switch( id )
{
case 0:
case PEER_MSG_CHOKE:
return parseChoke( tor, peer, len, 1 );
case 1:
case PEER_MSG_UNCHOKE:
return parseChoke( tor, peer, len, 0 );
case 2:
case PEER_MSG_INTERESTED:
return parseInterested( peer, len, 1 );
case 3:
case PEER_MSG_UNINTERESTED:
return parseInterested( peer, len, 0 );
case 4:
case PEER_MSG_HAVE:
return parseHave( tor, peer, p, len );
case 5:
case PEER_MSG_BITFIELD:
return parseBitfield( tor, peer, p, len );
case 6:
case PEER_MSG_REQUEST:
return parseRequest( peer, p, len );
case 7:
case PEER_MSG_PIECE:
return parsePiece( tor, peer, p, len );
case 8:
case PEER_MSG_CANCEL:
return parseCancel( peer, p, len );
case 9:
case PEER_MSG_PORT:
return parsePort( peer, p, len );
}