]> granicus.if.org Git - transmission/commitdiff
(libT) #1532: patch from jhujhiti to remove (unused) fast extensions
authorCharles Kerr <charles@transmissionbt.com>
Sat, 29 Nov 2008 20:37:34 +0000 (20:37 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Sat, 29 Nov 2008 20:37:34 +0000 (20:37 +0000)
libtransmission/Makefile.am
libtransmission/handshake.c
libtransmission/peer-io.c
libtransmission/peer-io.h
libtransmission/peer-mgr.c
libtransmission/peer-mgr.h
libtransmission/peer-msgs.c
libtransmission/test-fastset.c [deleted file]

index eb2b990b462f1355a9c22c3a43be60b30a216c66..726341ddc0a99b06b900d2d67393e36c8f8fd729 100644 (file)
@@ -110,7 +110,6 @@ TESTS = \
     clients-test \
     json-test \
     rpc-test \
-    test-fastset \
     test-peer-id \
     utils-test
 
@@ -151,10 +150,6 @@ rpc_test_SOURCES = rpc-test.c
 rpc_test_LDADD = ${apps_ldadd}
 rpc_test_LDFLAGS = ${apps_ldflags}
 
-test_fastset_SOURCES = test-fastset.c
-test_fastset_LDADD = ${apps_ldadd}
-test_fastset_LDFLAGS = ${apps_ldflags}
-
 test_peer_id_SOURCES = test-peer-id.c
 test_peer_id_LDADD = ${apps_ldadd}
 test_peer_id_LDFLAGS = ${apps_ldflags}
index c13dd2bf0712e9b131c70a3c91fb4d56f2571df9..f151c2df521b84acd0f9291d596d3da16f21c3ab 100644 (file)
@@ -72,14 +72,6 @@ enum
  #define HANDSHAKE_SET_LTEP( bits ) ( (void)0 )
 #endif
 
-#ifdef ENABLE_FASTPEER
- #define HANDSHAKE_HAS_FASTEXT( bits ) ( ( ( bits )[7] & 0x04 ) ? 1 : 0 )
- #define HANDSHAKE_SET_FASTEXT( bits ) ( ( bits )[7] |= 0x04 )
-#else
- #define HANDSHAKE_HAS_FASTEXT( bits ) ( 0 )
- #define HANDSHAKE_SET_FASTEXT( bits ) ( (void)0 )
-#endif
-
 /* http://www.azureuswiki.com/index.php/Extension_negotiation_protocol
    these macros are to be used if both extended messaging and the
    azureus protocol is supported, they indicate which protocol is preferred */
@@ -214,7 +206,6 @@ buildHandshakeMessage( tr_handshake * handshake,
     walk += HANDSHAKE_NAME_LEN;
     memset( walk, 0, HANDSHAKE_FLAGS_LEN );
     HANDSHAKE_SET_LTEP( walk );
-    HANDSHAKE_SET_FASTEXT( walk );
 
     walk += HANDSHAKE_FLAGS_LEN;
     memcpy( walk, torrentHash, SHA_DIGEST_LENGTH );
@@ -297,12 +288,6 @@ parseHandshake( tr_handshake *    handshake,
         dbgmsg( handshake, "using ltep" );
     }
 
-    if( HANDSHAKE_HAS_FASTEXT( reserved ) )
-    {
-        tr_peerIoEnableFEXT( handshake->io, 1 );
-        dbgmsg( handshake, "using fext" );
-    }
-
     return HANDSHAKE_OK;
 }
 
@@ -669,11 +654,6 @@ readHandshake( tr_handshake *    handshake,
         tr_peerIoEnableLTEP( handshake->io, 1 );
         dbgmsg( handshake, "using ltep" );
     }
-    if( HANDSHAKE_HAS_FASTEXT( reserved ) )
-    {
-        tr_peerIoEnableFEXT( handshake->io, 1 );
-        dbgmsg( handshake, "using fext" );
-    }
 
     /* torrent hash */
     tr_peerIoReadBytes( handshake->io, inbuf, hash, sizeof( hash ) );
index 206aeaad57ef746bbd411351becab4cc58118589..6d381c81c6684fdb37a67aeb09ea572f66b563dc 100644 (file)
@@ -84,7 +84,6 @@ struct tr_peerIo
     tr_bool                  isIncoming;
     tr_bool                  peerIdIsSet;
     tr_bool                  extendedProtocolSupported;
-    tr_bool                  fastPeersSupported;
 
     int                      magicNumber;
 
@@ -499,16 +498,6 @@ tr_peerIoEnableLTEP( tr_peerIo * io,
     io->extendedProtocolSupported = flag;
 }
 
-void
-tr_peerIoEnableFEXT( tr_peerIo * io,
-                     int         flag )
-{
-    assert( isPeerIo( io ) );
-    assert( flag == 0 || flag == 1 );
-
-    io->fastPeersSupported = flag;
-}
-
 int
 tr_peerIoSupportsLTEP( const tr_peerIo * io )
 {
@@ -517,14 +506,6 @@ tr_peerIoSupportsLTEP( const tr_peerIo * io )
     return io->extendedProtocolSupported;
 }
 
-int
-tr_peerIoSupportsFEXT( const tr_peerIo * io )
-{
-    assert( isPeerIo( io ) );
-
-    return io->fastPeersSupported;
-}
-
 /**
 ***
 **/
index 8a9e12702a75da665a82ee0fa3b6f117fed3a5a7..cfc87ba405dff73feb94e91948b6c50f58476c01 100644 (file)
@@ -53,13 +53,8 @@ tr_session*          tr_peerIoGetSession( tr_peerIo * io );
 void                 tr_peerIoEnableLTEP( tr_peerIo * io,
                                           int         flag );
 
-void                 tr_peerIoEnableFEXT( tr_peerIo * io,
-                                          int         flag );
-
 int                  tr_peerIoSupportsLTEP( const tr_peerIo * io );
 
-int                  tr_peerIoSupportsFEXT( const tr_peerIo * io );
-
 /**
 ***
 **/
index ea8a2c4f665cdcc6ecc8ce25240d2dffe8c4cd6b..17e8cb303e6a7c05f768782010d8517c81109857 100644 (file)
@@ -455,54 +455,6 @@ torrentConstructor( tr_peerMgr * manager,
     return t;
 }
 
-/**
- * For explanation, see http://www.bittorrent.org/fast_extensions.html
- * Also see the "test-allowed-set" unit test
- *
- * @param k number of pieces in set
- * @param sz number of pieces in the torrent
- * @param infohash torrent's SHA1 hash
- * @param ip peer's address
- */
-struct tr_bitfield *
-tr_peerMgrGenerateAllowedSet(
-    const uint32_t         k,
-    const uint32_t         sz,
-    const                  uint8_t        *
-                           infohash,
-    const struct in_addr * ip )
-{
-    uint8_t       w[SHA_DIGEST_LENGTH + 4];
-    uint8_t       x[SHA_DIGEST_LENGTH];
-    tr_bitfield * a;
-    uint32_t      a_size;
-
-    *(uint32_t*)w = ntohl( htonl( ip->s_addr ) & 0xffffff00 );   /* (1) */
-    memcpy( w + 4, infohash, SHA_DIGEST_LENGTH );              /* (2) */
-    tr_sha1( x, w, sizeof( w ), NULL );                        /* (3) */
-
-    a = tr_bitfieldNew( sz );
-    a_size = 0;
-
-    while( a_size < k )
-    {
-        int i;
-        for( i = 0; i < 5 && a_size < k; ++i )                      /* (4) */
-        {
-            uint32_t j = i * 4;                                /* (5) */
-            uint32_t y = ntohl( *( uint32_t* )( x + j ) );             /* (6) */
-            uint32_t index = y % sz;                           /* (7) */
-            if( !tr_bitfieldHas( a, index ) )                  /* (8) */
-            {
-                tr_bitfieldAdd( a, index );                    /* (9) */
-                ++a_size;
-            }
-        }
-        tr_sha1( x, x, sizeof( x ), NULL );                    /* (3) */
-    }
-
-    return a;
-}
 
 static int bandwidthPulse( void * vmgr );
 
index d04d8646ca513ab9a7b7dbcbbb2b5a9e8b2e6f7d..2be7d692ac4d16fdf612b9981df398b4bfa8ae4a 100644 (file)
@@ -124,10 +124,4 @@ float* tr_peerMgrWebSpeeds( const tr_peerMgr  * manager,
                             const uint8_t     * torrentHash );
 
 
-struct tr_bitfield * tr_peerMgrGenerateAllowedSet( const uint32_t setCount,
-                                                   const uint32_t pieceCount,
-                                                   const uint8_t infohash[20],
-                                                   const struct in_addr * ip );
-
-
 #endif
index bfce719ff55fe998ce084d2c6c1d6e786583a126..1e70956cde5c3f0fbad7b4a87b53fd71ba35bf65 100644 (file)
@@ -58,7 +58,6 @@ enum
     BT_HAVE_ALL             = 14,
     BT_HAVE_NONE            = 15,
     BT_REJECT               = 16,
-    BT_ALLOWED_FAST         = 17,
     BT_LTEP                 = 20,
 
     LTEP_HANDSHAKE          = 0,
@@ -76,12 +75,6 @@ enum
 
     MAX_QUEUE_SIZE          = ( 100 ),
 
-    /* (fast peers) max number of pieces we fast-allow to another peer */
-    MAX_FAST_ALLOWED_COUNT   = 10,
-
-    /* (fast peers) max threshold for allowing fast-pieces requests */
-    MAX_FAST_ALLOWED_THRESHOLD = 10,
-
     /* how long an unsent request can stay queued before it's returned
        back to the peer-mgr's pool of requests */
     QUEUED_REQUEST_TTL_SECS = 20,
@@ -288,7 +281,6 @@ struct tr_peermsgs
     struct evbuffer *      outMessages; /* all the non-piece messages */
 
     struct request_list    peerAskedFor;
-    struct request_list    peerAskedForFast;
     struct request_list    clientAskedFor;
     struct request_list    clientWillAskFor;
 
@@ -599,7 +591,7 @@ updateInterest( tr_peermsgs * msgs )
 }
 
 static void
-cancelAllRequestsToClientExceptFast( tr_peermsgs * msgs )
+cancelAllRequestsToClient( tr_peermsgs * msgs )
 {
     reqListClear( &msgs->peerAskedFor );
 }
@@ -624,7 +616,7 @@ tr_peerMsgsSetChoke( tr_peermsgs * msgs,
     {
         msgs->info->peerIsChoked = choke;
         if( choke )
-            cancelAllRequestsToClientExceptFast( msgs );
+            cancelAllRequestsToClient( msgs );
         protocolSendChoke( msgs, choke );
         msgs->info->chokeChangedAt = now;
     }
@@ -644,121 +636,6 @@ tr_peerMsgsHave( tr_peermsgs * msgs,
     updateInterest( msgs );
 }
 
-#if 0
-static void
-sendFastSuggest( tr_peermsgs * msgs,
-                 uint32_t      pieceIndex )
-{
-    assert( msgs );
-
-    if( tr_peerIoSupportsFEXT( msgs->io ) )
-    {
-        tr_peerIoWriteUint32( msgs->io, msgs->outMessages,
-                             sizeof( uint8_t ) + sizeof( uint32_t ) );
-        tr_peerIoWriteUint8( msgs->io, msgs->outMessages, BT_SUGGEST );
-        tr_peerIoWriteUint32( msgs->io, msgs->outMessages, pieceIndex );
-    }
-}
-
-static void
-sendFastHave( tr_peermsgs * msgs,
-              int           all )
-{
-    assert( msgs );
-
-    if( tr_peerIoSupportsFEXT( msgs->io ) )
-    {
-        tr_peerIoWriteUint32( msgs->io, msgs->outMessages, sizeof( uint8_t ) );
-        tr_peerIoWriteUint8( msgs->io, msgs->outMessages,
-                            ( all ? BT_HAVE_ALL
-                              : BT_HAVE_NONE ) );
-        updateInterest( msgs );
-    }
-}
-
-#endif
-
-static void
-sendFastReject( tr_peermsgs * msgs,
-                uint32_t      pieceIndex,
-                uint32_t      offset,
-                uint32_t      length )
-{
-    assert( msgs );
-
-    if( tr_peerIoSupportsFEXT( msgs->io ) )
-    {
-        struct evbuffer * out = msgs->outMessages;
-        const uint32_t    len = sizeof( uint8_t ) + 3 * sizeof( uint32_t );
-        dbgmsg( msgs, "sending fast reject %u:%u->%u", pieceIndex, offset,
-                length );
-        tr_peerIoWriteUint32( msgs->io, out, len );
-        tr_peerIoWriteUint8( msgs->io, out, BT_REJECT );
-        tr_peerIoWriteUint32( msgs->io, out, pieceIndex );
-        tr_peerIoWriteUint32( msgs->io, out, offset );
-        tr_peerIoWriteUint32( msgs->io, out, length );
-        pokeBatchPeriod( msgs, LOW_PRIORITY_INTERVAL_SECS );
-        dbgmsg( msgs, "outMessage size is now %d",
-               (int)EVBUFFER_LENGTH( out ) );
-    }
-}
-
-static tr_bitfield*
-getPeerAllowedPieces( tr_peermsgs * msgs )
-{
-    if( !msgs->peerAllowedPieces && tr_peerIoSupportsFEXT( msgs->io ) )
-    {
-        msgs->peerAllowedPieces = tr_peerMgrGenerateAllowedSet(
-            MAX_FAST_ALLOWED_COUNT,
-            msgs->torrent->info.pieceCount,
-            msgs->torrent->info.hash,
-            tr_peerIoGetAddress( msgs->io, NULL ) );
-    }
-
-    return msgs->peerAllowedPieces;
-}
-
-static void
-sendFastAllowed( tr_peermsgs * msgs,
-                 uint32_t      pieceIndex )
-{
-    assert( msgs );
-
-    if( tr_peerIoSupportsFEXT( msgs->io ) )
-    {
-        struct evbuffer * out = msgs->outMessages;
-        dbgmsg( msgs, "sending fast allowed" );
-        tr_peerIoWriteUint32( msgs->io, out,  sizeof( uint8_t ) +
-                             sizeof( uint32_t ) );
-        tr_peerIoWriteUint8( msgs->io, out, BT_ALLOWED_FAST );
-        tr_peerIoWriteUint32( msgs->io, out, pieceIndex );
-        pokeBatchPeriod( msgs, LOW_PRIORITY_INTERVAL_SECS );
-        dbgmsg( msgs, "outMessage size is now %d",
-               (int)EVBUFFER_LENGTH( out ) );
-    }
-}
-
-static void
-sendFastAllowedSet( tr_peermsgs * msgs )
-{
-    tr_piece_index_t i = 0;
-
-    while( i <= msgs->torrent->info.pieceCount )
-    {
-        if( tr_bitfieldHas( getPeerAllowedPieces( msgs ), i ) )
-            sendFastAllowed( msgs, i );
-        i++;
-    }
-}
-
-static void
-maybeSendFastAllowedSet( tr_peermsgs * msgs )
-{
-    if( tr_bitfieldCountTrueBits( msgs->info->have ) <=
-        MAX_FAST_ALLOWED_THRESHOLD )
-        sendFastAllowedSet( msgs );
-}
-
 /**
 ***
 **/
@@ -1207,24 +1084,6 @@ updatePeerProgress( tr_peermsgs * msgs )
     firePeerProgress( msgs );
 }
 
-static int
-clientCanSendFastBlock( const tr_peermsgs * msgs UNUSED )
-{
-    /* don't send a fast piece if peer has MAX_FAST_ALLOWED_THRESHOLD pieces */
-    if( tr_bitfieldCountTrueBits( msgs->info->have ) >
-        MAX_FAST_ALLOWED_THRESHOLD )
-        return FALSE;
-
-    /* ...or if we don't have ourself enough pieces */
-    if( tr_bitfieldCountTrueBits( tr_cpPieceBitfield( msgs->torrent->
-                                                      completion ) ) <
-        MAX_FAST_ALLOWED_THRESHOLD )
-        return FALSE;
-
-    /* Maybe a bandwidth limit ? */
-    return TRUE;
-}
-
 static void
 peerMadeRequest( tr_peermsgs *               msgs,
                  const struct peer_request * req )
@@ -1233,36 +1092,22 @@ peerMadeRequest( tr_peermsgs *               msgs,
     const int clientHasPiece = reqIsValid && tr_cpPieceIsComplete(
         msgs->torrent->completion, req->index );
     const int peerIsChoked = msgs->info->peerIsChoked;
-    const int peerIsFast = tr_peerIoSupportsFEXT( msgs->io );
-    const int pieceIsFast = reqIsValid && tr_bitfieldHas(
-        getPeerAllowedPieces( msgs ), req->index );
-    const int canSendFast = clientCanSendFastBlock( msgs );
 
     if( !reqIsValid ) /* bad request */
     {
         dbgmsg( msgs, "rejecting an invalid request." );
-        sendFastReject( msgs, req->index, req->offset, req->length );
     }
     else if( !clientHasPiece ) /* we don't have it */
     {
         dbgmsg( msgs, "rejecting request for a piece we don't have." );
-        sendFastReject( msgs, req->index, req->offset, req->length );
     }
-    else if( peerIsChoked && !peerIsFast ) /* doesn't he know he's choked? */
+    else if( peerIsChoked ) /* doesn't he know he's choked? */
     {
         tr_peerMsgsSetChoke( msgs, 1 );
-        sendFastReject( msgs, req->index, req->offset, req->length );
-    }
-    else if( peerIsChoked && peerIsFast && ( !pieceIsFast || !canSendFast ) )
-    {
-        sendFastReject( msgs, req->index, req->offset, req->length );
     }
     else /* YAY */
     {
-        if( peerIsFast && pieceIsFast )
-            reqListAppend( &msgs->peerAskedForFast, req );
-        else
-            reqListAppend( &msgs->peerAskedFor, req );
+        reqListAppend( &msgs->peerAskedFor, req );
     }
 }
 
@@ -1283,8 +1128,6 @@ messageLengthIsCorrect( const tr_peermsgs * msg,
 
         case BT_HAVE:
         case BT_SUGGEST:
-        case BT_ALLOWED_FAST:
-            return len == 5;
 
         case BT_BITFIELD:
             return len == ( msg->torrent->info.pieceCount + 7u ) / 8u + 1u;
@@ -1409,7 +1252,7 @@ readBtMessage( tr_peermsgs *     msgs,
             dbgmsg( msgs, "got Choke" );
             msgs->info->clientIsChoked = 1;
             cancelAllRequestsToPeer( msgs );
-            cancelAllRequestsToClientExceptFast( msgs );
+            cancelAllRequestsToClient( msgs );
             break;
 
         case BT_UNCHOKE:
@@ -1445,7 +1288,6 @@ readBtMessage( tr_peermsgs *     msgs,
             tr_peerIoReadBytes( msgs->io, inbuf, msgs->info->have->bits,
                                 msglen );
             updatePeerProgress( msgs );
-            maybeSendFastAllowedSet( msgs );
             fireNeedReq( msgs );
             break;
         }
@@ -1470,7 +1312,6 @@ readBtMessage( tr_peermsgs *     msgs,
             tr_peerIoReadUint32( msgs->io, inbuf, &r.length );
             dbgmsg( msgs, "got a Cancel %u:%u->%u", r.index, r.offset,
                     r.length );
-            reqListRemove( &msgs->peerAskedForFast, &r );
             reqListRemove( &msgs->peerAskedFor, &r );
             break;
         }
@@ -1497,7 +1338,6 @@ readBtMessage( tr_peermsgs *     msgs,
             tr_bitfieldAddRange( msgs->info->have, 0,
                                  msgs->torrent->info.pieceCount );
             updatePeerProgress( msgs );
-            maybeSendFastAllowedSet( msgs );
             break;
 
 
@@ -1505,7 +1345,6 @@ readBtMessage( tr_peermsgs *     msgs,
             dbgmsg( msgs, "Got a BT_HAVE_NONE" );
             tr_bitfieldClear( msgs->info->have );
             updatePeerProgress( msgs );
-            maybeSendFastAllowedSet( msgs );
             break;
 
         case BT_REJECT:
@@ -1519,14 +1358,6 @@ readBtMessage( tr_peermsgs *     msgs,
             break;
         }
 
-        case BT_ALLOWED_FAST:
-        {
-            dbgmsg( msgs, "Got a BT_ALLOWED_FAST" );
-            tr_peerIoReadUint32( msgs->io, inbuf, &ui32 );
-            /* we don't do anything with this yet */
-            break;
-        }
-
         case BT_LTEP:
             dbgmsg( msgs, "Got a BT_LTEP" );
             parseLtep( msgs, msglen, inbuf );
@@ -1702,8 +1533,7 @@ static int
 popNextRequest( tr_peermsgs *         msgs,
                 struct peer_request * setme )
 {
-    return reqListPop( &msgs->peerAskedForFast, setme )
-        || reqListPop( &msgs->peerAskedFor, setme );
+    return reqListPop( &msgs->peerAskedFor, setme );
 }
 
 static size_t
@@ -2065,7 +1895,6 @@ tr_peerMsgsNew( struct tr_torrent * torrent,
     m->incoming.block = evbuffer_new( );
     m->peerAllowedPieces = NULL;
     m->peerAskedFor = REQUEST_LIST_INIT;
-    m->peerAskedForFast = REQUEST_LIST_INIT;
     m->clientAskedFor = REQUEST_LIST_INIT;
     m->clientWillAskFor = REQUEST_LIST_INIT;
     *setme = tr_publisherSubscribe( m->publisher, func, userData );
@@ -2092,8 +1921,7 @@ tr_peerMsgsFree( tr_peermsgs* msgs )
         tr_publisherFree( &msgs->publisher );
         reqListClear( &msgs->clientWillAskFor );
         reqListClear( &msgs->clientAskedFor );
-        reqListClear( &msgs->peerAskedForFast );
-        reqListClear( &msgs->peerAskedFor );
+
         tr_bitfieldFree( msgs->peerAllowedPieces );
         evbuffer_free( msgs->incoming.block );
         evbuffer_free( msgs->outMessages );
diff --git a/libtransmission/test-fastset.c b/libtransmission/test-fastset.c
deleted file mode 100644 (file)
index 61f84f5..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <stdio.h>
-#include "transmission.h"
-#include "net.h"
-#include "peer-mgr.h"
-#include "utils.h"
-
-#define VERBOSE 0
-
-#define check( A ) \
-    { \
-        ++test; \
-        if( A ){ \
-            if( VERBOSE ) \
-                fprintf( stderr, "PASS test #%d (%s, %d)\n", test, __FILE__,\
-                         __LINE__ );\
-        } else { \
-            if( VERBOSE ) \
-                fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__,\
-                         __LINE__ );\
-            return test; \
-        } \
-    }
-
-int
-main( void )
-{
-    uint32_t         i;
-    int              test = 0;
-    tr_bitfield *    bitfield;
-    uint8_t          infohash[SHA_DIGEST_LENGTH];
-    struct in_addr   addr;
-    uint32_t         sz;
-    uint32_t         k;
-    tr_piece_index_t pieces[] =
-    { 1059, 431, 808, 1217, 287, 376, 1188, 353, 508 };
-
-    for( i = 0; i < SHA_DIGEST_LENGTH; ++i )
-        infohash[i] = 0xaa;
-    tr_netResolve( "80.4.4.200", &addr );
-    sz = 1313;
-
-    k = 7;
-    bitfield = tr_peerMgrGenerateAllowedSet( k, sz, infohash, &addr );
-    check( tr_bitfieldCountTrueBits( bitfield ) == k );
-    for( i = 0; i < k; ++i )
-        check( tr_bitfieldHas( bitfield, pieces[i] ) );
-    tr_bitfieldFree( bitfield );
-
-    k = 9;
-    bitfield = tr_peerMgrGenerateAllowedSet( k, sz, infohash, &addr );
-    check( tr_bitfieldCountTrueBits( bitfield ) == k );
-    for( i = 0; i < k; ++i )
-        check( tr_bitfieldHas( bitfield, pieces[i] ) );
-    tr_bitfieldFree( bitfield );
-
-
-    return 0;
-}
-