Changeset 9532


Ignore:
Timestamp:
Nov 20, 2009, 7:47:31 AM (12 years ago)
Author:
charles
Message:

(trunk libT) #2575: PEX is not meant to do forwarding

Location:
trunk/libtransmission
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/peer-mgr.c

    r9530 r9532  
    17761776
    17771777int
    1778 tr_peerMgrGetPeers( tr_torrent * tor, tr_pex ** setme_pex, uint8_t af, int maxPeerCount )
    1779 {
     1778tr_peerMgrGetPeers( tr_torrent   * tor,
     1779                    tr_pex      ** setme_pex,
     1780                    uint8_t        af,
     1781                    uint8_t        list_mode,
     1782                    int            maxCount )
     1783{
     1784    int i;
     1785    int n;
    17801786    int count = 0;
     1787    int atomCount = 0;
    17811788    const Torrent * t = tor->torrentPeers;
     1789    struct peer_atom ** atoms = NULL;
     1790    tr_pex * pex;
     1791    tr_pex * walk;
     1792
     1793    assert( tr_isTorrent( tor ) );
     1794    assert( setme_pex != NULL );
     1795    assert( setme_pex != NULL );
     1796    assert( af==TR_AF_INET || af==TR_AF_INET6 );
     1797    assert( list_mode==TR_PEERS_CONNECTED || list_mode==TR_PEERS_ALL );
    17821798
    17831799    managerLock( t->manager );
    17841800
     1801    /**
     1802    ***  build a list of atoms
     1803    **/
     1804
     1805    if( list_mode == TR_PEERS_CONNECTED ) /* connected peers only */
    17851806    {
    17861807        int i;
    1787         const int atomCount = tr_ptrArraySize( &t->pool );
    1788         const int pexCount = MIN( atomCount, maxPeerCount );
     1808        const tr_peer ** peers = (const tr_peer **) tr_ptrArrayBase( &t->peers );
     1809        atomCount = tr_ptrArraySize( &t->peers );
     1810        atoms = tr_new( struct peer_atom *, atomCount );
     1811        for( i=0; i<atomCount; ++i )
     1812            atoms[i] = peers[i]->atom;
     1813    }
     1814    else /* TR_PEERS_ALL */
     1815    {
    17891816        const struct peer_atom ** atomsBase = (const struct peer_atom**) tr_ptrArrayBase( &t->pool );
    1790         struct peer_atom ** atoms = tr_memdup( atomsBase, atomCount * sizeof( struct peer_atom * ) );
    1791         /* for now, this will waste memory on torrents that have both
    1792          * ipv6 and ipv4 peers */
    1793         tr_pex * pex = tr_new0( tr_pex, atomCount );
    1794         tr_pex * walk = pex;
    1795 
    1796         qsort( atoms, atomCount, sizeof( struct peer_atom * ), compareAtomsByUsefulness );
    1797 
    1798         for( i=0; i<atomCount && count<pexCount; ++i )
     1817        atomCount = tr_ptrArraySize( &t->pool );
     1818        atoms = tr_memdup( atomsBase, atomCount * sizeof( struct peer_atom * ) );
     1819    }
     1820
     1821    qsort( atoms, atomCount, sizeof( struct peer_atom * ), compareAtomsByUsefulness );
     1822
     1823    /**
     1824    ***  add the first N of them into our return list
     1825    **/
     1826
     1827    n = MIN( atomCount, maxCount );
     1828    pex = walk = tr_new0( tr_pex, n );
     1829
     1830    for( i=0; i<atomCount && count<n; ++i )
     1831    {
     1832        const struct peer_atom * atom = atoms[i];
     1833        if( atom->addr.type == af )
    17991834        {
    1800             const struct peer_atom * atom = atoms[i];
    1801             if( atom->addr.type == af )
    1802             {
    1803                 assert( tr_isAddress( &atom->addr ) );
    1804                 walk->addr = atom->addr;
    1805                 walk->port = atom->port;
    1806                 walk->flags = atom->flags;
    1807                 ++count;
    1808                 ++walk;
    1809             }
    1810         }
    1811 
    1812         assert( ( walk - pex ) == count );
    1813         *setme_pex = pex;
    1814 
    1815         tr_free( atoms );
    1816     }
    1817 
     1835            assert( tr_isAddress( &atom->addr ) );
     1836            walk->addr = atom->addr;
     1837            walk->port = atom->port;
     1838            walk->flags = atom->flags;
     1839            ++count;
     1840            ++walk;
     1841        }
     1842    }
     1843
     1844    qsort( pex, count, sizeof( tr_pex ), tr_pexCompare );
     1845
     1846    assert( ( walk - pex ) == count );
     1847    *setme_pex = pex;
     1848
     1849    /* cleanup */
     1850    tr_free( atoms );
    18181851    managerUnlock( t->manager );
    18191852    return count;
  • trunk/libtransmission/peer-mgr.h

    r9494 r9532  
    161161                         int                 success );
    162162
     163enum
     164{
     165    TR_PEERS_CONNECTED,
     166    TR_PEERS_ALL
     167};
     168
    163169int  tr_peerMgrGetPeers( tr_torrent      * tor,
    164170                         tr_pex         ** setme_pex,
    165                          uint8_t           af,
    166                          int               maxPeerCount );
     171                         uint8_t           address_type,
     172                         uint8_t           peer_list_mode,
     173                         int               max_peer_count );
    167174
    168175void tr_peerMgrStartTorrent( tr_torrent * tor );
  • trunk/libtransmission/peer-msgs.c

    r9517 r9532  
    19181918        tr_pex * newPex = NULL;
    19191919        tr_pex * newPex6 = NULL;
    1920         const int newCount = tr_peerMgrGetPeers( msgs->torrent, &newPex, TR_AF_INET, MAX_PEX_PEER_COUNT );
    1921         const int newCount6 = tr_peerMgrGetPeers( msgs->torrent, &newPex6, TR_AF_INET6, MAX_PEX_PEER_COUNT );
     1920        const int newCount = tr_peerMgrGetPeers( msgs->torrent, &newPex, TR_AF_INET, TR_PEERS_CONNECTED, MAX_PEX_PEER_COUNT );
     1921        const int newCount6 = tr_peerMgrGetPeers( msgs->torrent, &newPex6, TR_AF_INET6, TR_PEERS_CONNECTED, MAX_PEX_PEER_COUNT );
    19221922
    19231923        /* build the diffs */
  • trunk/libtransmission/resume.c

    r9328 r9532  
    8484    tr_pex * pex;
    8585
    86     count = tr_peerMgrGetPeers( (tr_torrent*) tor, &pex, TR_AF_INET, MAX_REMEMBERED_PEERS );
     86    count = tr_peerMgrGetPeers( (tr_torrent*) tor, &pex, TR_AF_INET, TR_PEERS_ALL, MAX_REMEMBERED_PEERS );
    8787    if( count > 0 )
    8888        tr_bencDictAddRaw( dict, KEY_PEERS, pex, sizeof( tr_pex ) * count );
    8989    tr_free( pex );
    9090
    91     count = tr_peerMgrGetPeers( (tr_torrent*) tor, &pex, TR_AF_INET6, MAX_REMEMBERED_PEERS );
     91    count = tr_peerMgrGetPeers( (tr_torrent*) tor, &pex, TR_AF_INET6, TR_PEERS_ALL, MAX_REMEMBERED_PEERS );
    9292    if( count > 0 )
    9393        tr_bencDictAddRaw( dict, KEY_PEERS6, pex, sizeof( tr_pex ) * count );
Note: See TracChangeset for help on using the changeset viewer.