Ignore:
Timestamp:
Dec 15, 2008, 12:17:08 AM (12 years ago)
Author:
charles
Message:

(trunk libT) add ipv6 support by jhujhiti. I think this is the largest user-contributed patch we've ever used... thanks jhujhiti :)

File:
1 edited

Legend:

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

    r7361 r7397  
    13471347    if( !tr_sessionIsAddressBlocked( t->manager->session, &pex->addr ) )
    13481348        ensureAtomExists( t, &pex->addr, pex->port, pex->flags, from );
    1349 
     1349   
    13501350    managerUnlock( manager );
    13511351}
     
    13721372    }
    13731373
     1374    *pexCount = n;
     1375    return pex;
     1376}
     1377
     1378tr_pex *
     1379tr_peerMgrCompact6ToPex( const void    * compact,
     1380                         size_t          compactLen,
     1381                         const uint8_t * added_f,
     1382                         size_t          added_f_len,
     1383                         size_t        * pexCount )
     1384{
     1385    size_t          i;
     1386    size_t          n = compactLen / 18;
     1387    const uint8_t * walk = compact;
     1388    tr_pex *        pex = tr_new0( tr_pex, n );
     1389   
     1390    for( i = 0; i < n; ++i )
     1391    {
     1392        pex[i].addr.type = TR_AF_INET6;
     1393        memcpy( &pex[i].addr.addr.addr6.s6_addr, walk, 16 ); walk += 16;
     1394        memcpy( &pex[i].port, walk, 2 ); walk += 2;
     1395        if( added_f && ( n == added_f_len ) )
     1396            pex[i].flags = added_f[i];
     1397    }
     1398   
     1399    *pexCount = n;
     1400    return pex;
     1401}
     1402
     1403tr_pex *
     1404tr_peerMgrArrayToPex( const void * array,
     1405                      size_t       arrayLen,
     1406                      size_t      * pexCount )
     1407{
     1408    size_t          i;
     1409    size_t          n = arrayLen / ( sizeof( tr_address ) + 2 );
     1410    /*size_t          n = arrayLen / sizeof( tr_peerArrayElement );*/
     1411    const uint8_t * walk = array;
     1412    tr_pex        * pex = tr_new0( tr_pex, n );
     1413   
     1414    for( i = 0 ; i < n ; i++ ) {
     1415        memcpy( &pex[i].addr, walk, sizeof( tr_address ) );
     1416        memcpy( &pex[i].port, walk + sizeof( tr_address ), 2 );
     1417        pex[i].flags = 0x00;
     1418        walk += sizeof( tr_address ) + 2;
     1419    }
     1420   
    13741421    *pexCount = n;
    13751422    return pex;
     
    14351482
    14361483int
    1437 tr_peerMgrGetPeers( tr_peerMgr *    manager,
     1484tr_peerMgrGetPeers( tr_peerMgr    * manager,
    14381485                    const uint8_t * torrentHash,
    1439                     tr_pex **       setme_pex )
     1486                    tr_pex       ** setme_pex,
     1487                    uint8_t         af)
    14401488{
    14411489    int peerCount = 0;
     1490    int peersReturning = 0;
    14421491    const Torrent *  t;
    14431492
     
    14531502        int i;
    14541503        const tr_peer ** peers = (const tr_peer **) tr_ptrArrayPeek( t->peers, &peerCount );
     1504        /* for now, this will waste memory on torrents that have both
     1505         * ipv6 and ipv4 peers */
    14551506        tr_pex * pex = tr_new( tr_pex, peerCount );
    14561507        tr_pex * walk = pex;
     
    14591510        {
    14601511            const tr_peer * peer = peers[i];
    1461             const struct peer_atom * atom = getExistingAtom( t, &peer->addr );
    1462 
    1463             walk->addr = peer->addr;
    1464             walk->port = peer->port;
    1465             walk->flags = 0;
    1466             if( peerPrefersCrypto( peer ) )
    1467                 walk->flags |= ADDED_F_ENCRYPTION_FLAG;
    1468             if( ( atom->uploadOnly == UPLOAD_ONLY_YES ) || ( peer->progress >= 1.0 ) )
    1469                 walk->flags |= ADDED_F_SEED_FLAG;
     1512            if( peer->addr.type == af )
     1513            {
     1514                const struct peer_atom * atom = getExistingAtom( t, &peer->addr );
     1515                memcpy( &walk->addr, &peer->addr, sizeof( walk->addr ) );
     1516                walk->port = peer->port;
     1517                walk->flags = 0;
     1518                if( peerPrefersCrypto( peer ) )
     1519                    walk->flags |= ADDED_F_ENCRYPTION_FLAG;
     1520                if( ( atom->uploadOnly == UPLOAD_ONLY_YES ) ||
     1521                    ( peer->progress >= 1.0 ) )
     1522                    walk->flags |= ADDED_F_SEED_FLAG;
     1523                peersReturning++;
     1524            }
    14701525        }
    14711526
    14721527        assert( ( walk - pex ) == peerCount );
    1473         qsort( pex, peerCount, sizeof( tr_pex ), tr_pexCompare );
     1528        qsort( pex, peersReturning, sizeof( tr_pex ), tr_pexCompare );
    14741529        *setme_pex = pex;
    14751530    }
    14761531
    14771532    managerUnlock( manager );
    1478     return peerCount;
     1533    return peersReturning;
    14791534}
    14801535
     
    17861841        const struct peer_atom * atom = getExistingAtom( t, &peer->addr );
    17871842        tr_peer_stat *           stat = ret + i;
    1788 
    1789         tr_ntop( &peer->addr, stat->addr, sizeof(stat->addr) );
    1790         tr_strlcpy( stat->client, (peer->client ? peer->client : ""), sizeof(stat->client) );
     1843        tr_address               norm_addr;
     1844
     1845        memcpy( &norm_addr, &peer->addr, sizeof( tr_address ) );
     1846        tr_normalizeV4Mapped( &norm_addr );
     1847        tr_ntop( &norm_addr, stat->addr, sizeof( stat->addr ) );
     1848        tr_strlcpy( stat->client, ( peer->client ? peer->client : "" ),
     1849                   sizeof( stat->client ) );
    17911850        stat->port               = ntohs( peer->port );
    17921851        stat->from               = atom->from;
Note: See TracChangeset for help on using the changeset viewer.