Changeset 2967
- Timestamp:
- Sep 1, 2007, 1:37:41 PM (15 years ago)
- Location:
- branches/encryption/libtransmission
- Files:
-
- 1 added
- 1 deleted
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/encryption/libtransmission/Makefile.am
r2966 r2967 65 65 peer-io.h \ 66 66 peer-mgr.h \ 67 peer-mgr-private.h \ 67 68 peer-msgs.h \ 68 69 platform.h \ -
branches/encryption/libtransmission/peer-mgr.c
r2965 r2967 14 14 #include <string.h> /* memcpy, memcmp */ 15 15 16 #include <arpa/inet.h>17 18 16 #include "transmission.h" 19 17 #include "handshake.h" … … 22 20 #include "peer-io.h" 23 21 #include "peer-mgr.h" 24 #include "peer-work.h" 22 #include "peer-mgr-private.h" 23 #include "peer-msgs.h" 25 24 #include "ptrarray.h" 26 25 #include "utils.h" … … 30 29 typedef struct 31 30 { 32 struct in_addr in_addr;33 uint16_t port;34 tr_peerIo * io;35 int from;36 }37 Peer;38 39 typedef struct40 {41 31 uint8_t hash[SHA_DIGEST_LENGTH]; 42 tr_ptrArray * peers; /* Peer */32 tr_ptrArray * peers; /* tr_peer */ 43 33 } 44 34 Torrent; … … 97 87 peerCompare( const void * va, const void * vb ) 98 88 { 99 const Peer * a = (const Peer *) va;100 const Peer * b = (const Peer *) vb;89 const tr_peer * a = (const tr_peer *) va; 90 const tr_peer * b = (const tr_peer *) vb; 101 91 return memcmp( &a->in_addr, &b->in_addr, sizeof(struct in_addr) ); 102 92 } … … 105 95 peerCompareToAddr( const void * va, const void * vb ) 106 96 { 107 const Peer * a = (const Peer *) va;97 const tr_peer * a = (const tr_peer *) va; 108 98 const struct in_addr * b = (const struct in_addr *) vb; 109 99 return memcmp( &a->in_addr, b, sizeof(struct in_addr) ); 110 100 } 111 101 112 static Peer*102 static tr_peer* 113 103 getExistingPeer( Torrent * torrent, const struct in_addr * in_addr ) 114 104 { 115 return ( Peer*) tr_ptrArrayFindSorted( torrent->peers,116 in_addr,117 peerCompareToAddr );118 } 119 120 static Peer*105 return (tr_peer*) tr_ptrArrayFindSorted( torrent->peers, 106 in_addr, 107 peerCompareToAddr ); 108 } 109 110 static tr_peer* 121 111 getPeer( Torrent * torrent, const struct in_addr * in_addr ) 122 112 { 123 Peer * peer = getExistingPeer( torrent, in_addr );113 tr_peer * peer = getExistingPeer( torrent, in_addr ); 124 114 if( peer == NULL ) 125 115 { 126 peer = tr_new0( Peer, 1 );116 peer = tr_new0( tr_peer, 1 ); 127 117 memcpy( &peer->in_addr, in_addr, sizeof(struct in_addr) ); 128 118 tr_ptrArrayInsertSorted( torrent->peers, peer, peerCompare ); … … 132 122 133 123 static void 134 freePeer( Peer * peer ) 135 { 136 #warning free the peer-work state here 124 freePeer( tr_peer * peer ) 125 { 126 tr_peerMsgsFree( peer->msgs ); 127 tr_bitfieldFree( peer->have ); 128 tr_bitfieldFree( peer->blame ); 129 tr_bitfieldFree( peer->banned ); 137 130 tr_peerIoFree( peer->io ); 131 tr_free( peer->client ); 138 132 tr_free( peer ); 139 133 } … … 143 137 { 144 138 int i, size; 145 Peer ** peers = (Peer **) tr_ptrArrayPeek( t->peers, &size );139 tr_peer ** peers = (tr_peer **) tr_ptrArrayPeek( t->peers, &size ); 146 140 for( i=0; i<size; ++i ) 147 141 freePeer( peers[i] ); … … 201 195 } else { 202 196 uint16_t port; 203 Peer * peer = getPeer( t, tr_peerIoGetAddress(io,&port) );197 tr_peer * peer = getPeer( t, tr_peerIoGetAddress(io,&port) ); 204 198 peer->port = port; 205 199 peer->io = io; 206 tr_peerWorkAdd( tr_torrentFindFromHash(manager->handle,hash), io);200 peer->msgs = tr_peerMsgsNew( tr_torrentFindFromHash(manager->handle,hash), peer ); 207 201 } 208 202 } … … 234 228 for( i=0; i<peerCount; ++i ) 235 229 { 236 Peer * peer;230 tr_peer * peer; 237 231 struct in_addr addr; 238 232 uint16_t port; … … 273 267 const Torrent * t = getExistingTorrent( (tr_peerMgr*)manager, torrentHash ); 274 268 int i, peerCount; 275 const Peer ** peers = (const Peer **) tr_ptrArrayPeek( t->peers, &peerCount );269 const tr_peer ** peers = (const tr_peer **) tr_ptrArrayPeek( t->peers, &peerCount ); 276 270 uint8_t * ret = tr_new( uint8_t, peerCount * 6 ); 277 271 uint8_t * walk = ret; … … 326 320 else { 327 321 int j, peerCount; 328 const Peer ** peers = (const Peer **) tr_ptrArrayPeek( t->peers, &peerCount );322 const tr_peer ** peers = (const tr_peer **) tr_ptrArrayPeek( t->peers, &peerCount ); 329 323 for( j=0; j<peerCount; ++j ) 330 if( peers[i].ccc)324 if( tr_bitfieldHas( peers[i]->have, j ) ) 331 325 ++tab[i]; 332 326 } … … 346 340 int i, size; 347 341 const Torrent * t = getExistingTorrent( (tr_peerMgr*)manager, torrentHash ); 348 const Peer ** peers = (const Peer **) tr_ptrArrayPeek( t->peers, &size );342 const tr_peer ** peers = (const tr_peer **) tr_ptrArrayPeek( t->peers, &size ); 349 343 350 344 *setmePeersTotal = size; … … 355 349 for( i=0; i<size; ++i ) 356 350 { 357 const Peer * peer = peers[i];351 const tr_peer * peer = peers[i]; 358 352 359 353 if( peer->io == NULL ) /* not connected */ … … 379 373 int i, size; 380 374 const Torrent * t = getExistingTorrent( (tr_peerMgr*)manager, torrentHash ); 381 const Peer ** peers = (const Peer **) tr_ptrArrayPeek( t->peers, &size );375 const tr_peer ** peers = (const tr_peer **) tr_ptrArrayPeek( t->peers, &size ); 382 376 tr_peer_stat * ret; 383 377 … … 386 380 for( i=0; i<size; ++i ) 387 381 { 388 const Peer * peer = peers[i];382 const tr_peer * peer = peers[i]; 389 383 const int live = peer->io != NULL; 390 384 tr_peer_stat * stat = ret + i; 391 385 392 386 tr_netNtop( &peer->in_addr, stat->addr, sizeof(stat->addr) ); 393 stat->port = peer->port; 394 stat->from = peer->from; 395 stat->isConnected = live; 387 stat->port = peer->port; 388 stat->from = peer->from; 389 stat->client = peer->client; 390 stat->progress = peer->progress; 391 stat->isConnected = live; 396 392 stat->uploadToRate = tr_peerIoGetRateToPeer( peer->io ); 397 393 stat->downloadFromRate = tr_peerIoGetRateToClient( peer->io ); 398 stat->isDownloading = stat->uploadToRate > 0.01; 399 stat->isUploading = stat->downloadFromRate > 0.01; 400 401 #warning FIXME 402 //stat->progress = tr_peerProgress( peer ); 403 //stat->client = tr_peerClient( peer ); 394 stat->isDownloading = stat->uploadToRate > 0.01; 395 stat->isUploading = stat->downloadFromRate > 0.01; 404 396 } 405 397 … … 409 401 410 402 void 411 tr_peerMgrDisablePex( tr_peerMgr * manager UNUSED, 412 const uint8_t * torrentHash UNUSED, 413 int disable UNUSED) 414 { 415 #warning FIXME 416 #if 0 417 if( ( tor->pexDisabled != disable ) && ! ( TR_FLAG_PRIVATE & tor->info.flags ) ) { 418 int i; 403 tr_peerMgrDisablePex( tr_peerMgr * manager, 404 const uint8_t * torrentHash, 405 int disable) 406 { 407 tr_torrent * tor = tr_torrentFindFromHash( manager->handle, torrentHash ); 408 409 if( ( tor->pexDisabled != disable ) && ! ( TR_FLAG_PRIVATE & tor->info.flags ) ) 410 { 411 int i, size; 412 Torrent * t = getExistingTorrent( manager, torrentHash ); 413 tr_peer ** peers = (tr_peer **) tr_ptrArrayPeek( t->peers, &size ); 414 for( i=0; i<size; ++i ) { 415 peers[i]->pexEnabled = disable ? 0 : 1; 416 peers[i]->lastPexTime = 0; 417 } 418 419 419 tor->pexDisabled = disable; 420 for( i=0; i<tor->peerCount; ++i ) 421 tr_peerSetPrivate( tor->peers[i], disable ); 422 } 423 #endif 424 } 420 } 421 } -
branches/encryption/libtransmission/peer-msgs.c
r2966 r2967 29 29 #include "peer-io.h" 30 30 #include "peer-mgr.h" 31 #include "peer-mgr-private.h" 32 #include "peer-msgs.h" 31 33 #include "ratecontrol.h" 32 34 #include "timer.h" … … 99 101 } 100 102 101 typedef struct 102 { 103 struct tr_peermsgs 104 { 105 tr_peer * peer; 106 103 107 tr_handle * handle; 104 108 tr_torrent * torrent; 105 109 tr_peerIo * io; 106 tr_bitfield * bitfield; /* the peer's bitfield */107 tr_bitfield * banfield; /* bad pieces from the peer */108 tr_bitfield * blamefield; /* lists pieces that this peer helped us with */109 110 110 111 struct evbuffer * outMessages; /* buffer of all the non-piece messages */ … … 131 132 uint64_t gotKeepAliveTime; 132 133 133 float progress;134 135 134 uint16_t ut_pex; 136 135 uint16_t listeningPort; 137 138 /* the client name from the `v' string in LTEP's handshake dictionary */ 139 char * client; 140 } 141 tr_peer; 136 }; 142 137 143 138 /** … … 146 141 147 142 static int 148 isPieceInteresting( const tr_peer * peer,149 int piece )143 isPieceInteresting( const tr_peermsgs * peer, 144 int piece ) 150 145 { 151 146 const tr_torrent * torrent = peer->torrent; … … 154 149 if( tr_cpPieceIsComplete( torrent->completion, piece ) ) /* we already have it */ 155 150 return FALSE; 156 if( !tr_bitfieldHas( peer-> bitfield, piece ) ) /* peer doesn't have it */151 if( !tr_bitfieldHas( peer->peer->have, piece ) ) /* peer doesn't have it */ 157 152 return FALSE; 158 if( tr_bitfieldHas( peer-> banfield, piece ) ) /* peer is banned for it */153 if( tr_bitfieldHas( peer->peer->banned, piece ) ) /* peer is banned for it */ 159 154 return FALSE; 160 155 return TRUE; … … 162 157 163 158 static int 164 isInteresting( const tr_peer * peer )159 isInteresting( const tr_peermsgs * peer ) 165 160 { 166 161 int i; … … 168 163 const tr_bitfield * bitfield = tr_cpPieceBitfield( torrent->completion ); 169 164 170 if( !peer-> bitfield) /* We don't know what this peer has */165 if( !peer->peer->have ) /* We don't know what this peer has */ 171 166 return FALSE; 172 167 173 assert( bitfield->len == peer-> bitfield->len );168 assert( bitfield->len == peer->peer->have->len ); 174 169 175 170 for( i=0; i<torrent->info.pieceCount; ++i ) … … 181 176 182 177 static void 183 sendInterest( tr_peer * peer, int weAreInterested )178 sendInterest( tr_peermsgs * peer, int weAreInterested ) 184 179 { 185 180 const uint32_t len = sizeof(uint8_t); … … 192 187 193 188 static void 194 updateInterest( tr_peer * peer )189 updateInterest( tr_peermsgs * peer ) 195 190 { 196 191 const int i = isInteresting( peer ); … … 200 195 201 196 void 202 setChoke( tr_peer * peer, int choke )197 setChoke( tr_peermsgs * peer, int choke ) 203 198 { 204 199 if( peer->peerIsChoked != !!choke ) … … 225 220 226 221 static void 227 parseLtepHandshake( tr_peer * peer, int len, struct evbuffer * inbuf )222 parseLtepHandshake( tr_peermsgs * peer, int len, struct evbuffer * inbuf ) 228 223 { 229 224 benc_val_t val, * sub; … … 253 248 if( tr_bencIsStr( sub ) ) { 254 249 int i; 255 tr_free( peer-> client );250 tr_free( peer->peer->client ); 256 251 fprintf( stderr, "dictionary says client is [%s]\n", sub->val.s.s ); 257 252 for( i=0; i<sub->val.s.i; ++i ) fprintf( stderr, "[%c] (%d)\n", sub->val.s.s[i], (int)sub->val.s.s[i] ); 258 peer-> client = tr_strndup( sub->val.s.s, sub->val.s.i );259 fprintf( stderr, "peer->client is now [%s]\n", peer-> client );253 peer->peer->client = tr_strndup( sub->val.s.s, sub->val.s.i ); 254 fprintf( stderr, "peer->client is now [%s]\n", peer->peer->client ); 260 255 } 261 256 … … 272 267 273 268 static void 274 parseUtPex( tr_peer * peer, int msglen, struct evbuffer * inbuf )269 parseUtPex( tr_peermsgs * peer, int msglen, struct evbuffer * inbuf ) 275 270 { 276 271 benc_val_t val, * sub; … … 304 299 305 300 static void 306 parseLtep( tr_peer * peer, int msglen, struct evbuffer * inbuf )301 parseLtep( tr_peermsgs * peer, int msglen, struct evbuffer * inbuf ) 307 302 { 308 303 uint8_t ltep_msgid; … … 329 324 330 325 static int 331 readBtLength( tr_peer * peer, struct evbuffer * inbuf )326 readBtLength( tr_peermsgs * peer, struct evbuffer * inbuf ) 332 327 { 333 328 uint32_t len; … … 350 345 351 346 static int 352 readBtMessage( tr_peer * peer, struct evbuffer * inbuf )347 readBtMessage( tr_peermsgs * peer, struct evbuffer * inbuf ) 353 348 { 354 349 uint8_t id; … … 402 397 fprintf( stderr, "got a BT_HAVE\n" ); 403 398 tr_peerIoReadUint32( peer->io, inbuf, &ui32 ); 404 tr_bitfieldAdd( peer-> bitfield, ui32 );405 peer->p rogress = tr_bitfieldCountTrueBits( peer->bitfield) / (float)peer->torrent->info.pieceCount;399 tr_bitfieldAdd( peer->peer->have, ui32 ); 400 peer->peer->progress = tr_bitfieldCountTrueBits( peer->peer->have ) / (float)peer->torrent->info.pieceCount; 406 401 updateInterest( peer ); 407 402 break; 408 403 409 404 case BT_BITFIELD: 410 assert( msglen == peer-> bitfield->len );405 assert( msglen == peer->peer->have->len ); 411 406 fprintf( stderr, "got a BT_BITFIELD\n" ); 412 tr_peerIoReadBytes( peer->io, inbuf, peer-> bitfield->bits, msglen );413 peer->p rogress = tr_bitfieldCountTrueBits( peer->bitfield) / (float)peer->torrent->info.pieceCount;414 fprintf( stderr, "peer progress is %f\n", peer->p rogress );407 tr_peerIoReadBytes( peer->io, inbuf, peer->peer->have->bits, msglen ); 408 peer->peer->progress = tr_bitfieldCountTrueBits( peer->peer->have ) / (float)peer->torrent->info.pieceCount; 409 fprintf( stderr, "peer progress is %f\n", peer->peer->progress ); 415 410 updateInterest( peer ); 416 411 /* FIXME: maybe unchoke */ … … 482 477 483 478 static int 484 canDownload( const tr_peer * peer )479 canDownload( const tr_peermsgs * peer ) 485 480 { 486 481 tr_torrent * tor = peer->torrent; 487 482 488 483 #if 0 489 /* FIXME: was swift worth it? did anyone notice a difference? :)*/484 /* FIXME: was swift worth it? did anyone notice a difference? */ 490 485 if( SWIFT_ENABLED && !isSeeding && (peer->credit<0) ) 491 486 return FALSE; … … 502 497 503 498 static void 504 gotBlock( tr_peer * peer, int pieceIndex, int offset, struct evbuffer * inbuf )499 gotBlock( tr_peermsgs * peer, int pieceIndex, int offset, struct evbuffer * inbuf ) 505 500 { 506 501 tr_torrent * tor = peer->torrent; … … 523 518 524 519 /* make a note that this peer helped us with this piece */ 525 if( !peer-> blamefield)526 peer-> blamefield= tr_bitfieldNew( tor->info.pieceCount );527 tr_bitfieldAdd( peer-> blamefield, pieceIndex );520 if( !peer->peer->blame ) 521 peer->peer->blame = tr_bitfieldNew( tor->info.pieceCount ); 522 tr_bitfieldAdd( peer->peer->blame, pieceIndex ); 528 523 529 524 tr_cpBlockAdd( tor->completion, block ); … … 538 533 539 534 static ReadState 540 readBtPiece( tr_peer * peer, struct evbuffer * inbuf )535 readBtPiece( tr_peermsgs * peer, struct evbuffer * inbuf ) 541 536 { 542 537 assert( peer->blockToUs.length > 0 ); … … 575 570 { 576 571 ReadState ret; 577 tr_peer * peer = (tr_peer*) vpeer;572 tr_peermsgs * peer = (tr_peermsgs *) vpeer; 578 573 struct evbuffer * inbuf = EVBUFFER_INPUT ( evin ); 579 574 fprintf( stderr, "peer %p got a canRead; state is [%s]\n", peer, getStateName(peer->state) ); … … 594 589 595 590 static int 596 canUpload( const tr_peer * peer )591 canUpload( const tr_peermsgs * peer ) 597 592 { 598 593 const tr_torrent * tor = peer->torrent; … … 610 605 pulse( void * vpeer ) 611 606 { 612 tr_peer * peer = (tr_peer*) vpeer;607 tr_peermsgs * peer = (tr_peermsgs *) vpeer; 613 608 size_t len; 614 609 … … 658 653 didWrite( struct bufferevent * evin UNUSED, void * vpeer ) 659 654 { 660 tr_peer * peer = (tr_peer*) vpeer;655 tr_peermsgs * peer = (tr_peermsgs *) vpeer; 661 656 fprintf( stderr, "peer %p got a didWrite...\n", peer ); 662 657 pulse( vpeer ); … … 666 661 gotError( struct bufferevent * evbuf UNUSED, short what, void * vpeer ) 667 662 { 668 tr_peer * peer = (tr_peer*) vpeer;663 tr_peermsgs * peer = (tr_peermsgs *) vpeer; 669 664 fprintf( stderr, "peer %p got an error in %d\n", peer, (int)what ); 670 665 } 671 666 672 667 static void 673 sendBitfield( tr_peer * peer )668 sendBitfield( tr_peermsgs * peer ) 674 669 { 675 670 const tr_bitfield * bitfield = tr_cpPieceBitfield( peer->torrent->completion ); … … 683 678 } 684 679 685 void 686 tr_peerWorkAdd( struct tr_torrent * torrent, 687 struct tr_peerIo * io ) 688 { 689 tr_peer * peer; 690 691 peer = tr_new0( tr_peer, 1 ); 680 tr_peermsgs* 681 tr_peerMsgsNew( struct tr_torrent * torrent, struct tr_peer * peer_in ) 682 { 683 tr_peermsgs * peer; 684 685 assert( peer_in != NULL ); 686 assert( peer_in->io != NULL ); 687 688 peer = tr_new0( tr_peermsgs, 1 ); 689 peer->peer = peer_in; 692 690 peer->handle = torrent->handle; 693 691 peer->torrent = torrent; 694 peer->io = io;692 peer->io = peer_in->io; 695 693 peer->weAreChoked = 1; 696 694 peer->peerIsChoked = 1; … … 698 696 peer->peerIsInterested = 0; 699 697 peer->pulseTag = tr_timerNew( peer->handle, pulse, peer, NULL, 200 ); 700 peer-> bitfield= tr_bitfieldNew( torrent->info.pieceCount );698 peer->peer->have = tr_bitfieldNew( torrent->info.pieceCount ); 701 699 peer->outMessages = evbuffer_new( ); 702 700 peer->outBlock = evbuffer_new( ); 703 701 peer->inBlock = evbuffer_new( ); 704 702 705 tr_peerIoSetIOFuncs( io, canRead, didWrite, gotError, peer );706 tr_peerIoSetIOMode( io, EV_READ|EV_WRITE, 0 );703 tr_peerIoSetIOFuncs( peer->io, canRead, didWrite, gotError, peer ); 704 tr_peerIoSetIOMode( peer->io, EV_READ|EV_WRITE, 0 ); 707 705 708 706 sendBitfield( peer ); 709 } 707 708 return peer; 709 } 710 711 void 712 tr_peerMsgsFree( tr_peermsgs* p ) 713 { 714 tr_timerFree( &p->pulseTag ); 715 evbuffer_free( p->outMessages ); 716 evbuffer_free( p->outBlock ); 717 evbuffer_free( p->inBlock ); 718 tr_free( p ); 719 } -
branches/encryption/libtransmission/peer-msgs.h
r2966 r2967 15 15 16 16 struct tr_torrent; 17 struct tr_peer Io;17 struct tr_peer; 18 18 19 void tr_peerWorkAdd( struct tr_torrent * torrent, 20 struct tr_peerIo * io ); 19 typedef struct tr_peermsgs tr_peermsgs; 20 21 tr_peermsgs* tr_peerMsgsNew( struct tr_torrent * torrent, 22 struct tr_peer * peer ); 23 24 void tr_peerMsgsFree( tr_peermsgs* ); 21 25 22 26 #endif -
branches/encryption/libtransmission/torrent.c
r2965 r2967 735 735 &s->peersSendingToUs, 736 736 &s->peersGettingFromUs, 737 &s->peersFrom );737 s->peersFrom ); 738 738 739 739 s->percentComplete = tr_cpPercentComplete ( tor->completion );
Note: See TracChangeset
for help on using the changeset viewer.