1
0
Fork 0
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:
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 * 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 );

View file

@ -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 );
} }