source: trunk/libtransmission/peer-mgr.h @ 9381

Last change on this file since 9381 was 9381, checked in by charles, 12 years ago

(trunk libT) #2508: atom->port never updated

  • Property svn:keywords set to Date Rev Author Id
File size: 5.7 KB
Line 
1/*
2 * This file Copyright (C) 2007-2009 Charles Kerr <charles@transmissionbt.com>
3 *
4 * This file is licensed by the GPL version 2.  Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id: peer-mgr.h 9381 2009-10-22 15:05:56Z charles $
11 */
12
13#ifndef __TRANSMISSION__
14#error only libtransmission should #include this header.
15#endif
16
17#ifndef TR_PEER_MGR_H
18#define TR_PEER_MGR_H
19
20#include <inttypes.h> /* uint16_t */
21
22#ifdef WIN32
23 #include <winsock2.h> /* struct in_addr */
24#endif
25
26#include "bitfield.h"
27#include "net.h"
28#include "publish.h" /* tr_publisher_tag */
29#include "utils.h"
30
31/**
32 * @addtogroup peers Peers
33 * @{
34 */
35
36struct tr_peer_stat;
37struct tr_torrent;
38typedef struct tr_peerMgr tr_peerMgr;
39
40enum
41{
42    /* corresponds to ut_pex's added.f flags */
43    ADDED_F_ENCRYPTION_FLAG = 1,
44
45    /* corresponds to ut_pex's added.f flags */
46    ADDED_F_SEED_FLAG = 2,
47};
48
49typedef struct tr_pex
50{
51    tr_address addr;
52    tr_port    port;
53    uint8_t    flags;
54}
55tr_pex;
56
57
58struct tr_bandwidth;
59struct tr_peerIo;
60struct tr_peermsgs;
61
62/**
63***
64**/
65
66/* opaque forward declaration */
67struct peer_atom;
68
69const tr_address* tr_atomGetAddr( const struct peer_atom * );
70
71tr_port tr_atomGetPort( const struct peer_atom * atom );
72
73void tr_atomSetPort( struct peer_atom * atom, tr_port port );
74
75const char* tr_atomAddrStr( const struct peer_atom * );
76
77/**
78***
79**/
80
81enum
82{
83    ENCRYPTION_PREFERENCE_UNKNOWN,
84    ENCRYPTION_PREFERENCE_YES,
85    ENCRYPTION_PREFERENCE_NO
86};
87
88/**
89 * State information about a connected peer.
90 *
91 * @see struct peer_atom
92 * @see tr_peermsgs
93 */
94typedef struct tr_peer
95{
96    tr_bool                  peerIsChoked;
97    tr_bool                  peerIsInterested;
98    tr_bool                  clientIsChoked;
99    tr_bool                  clientIsInterested;
100    tr_bool                  doPurge;
101
102    /* number of bad pieces they've contributed to */
103    uint8_t                  strikes;
104
105    uint8_t                  encryption_preference;
106    tr_port                  dht_port;
107    struct tr_peerIo       * io;
108    struct peer_atom       * atom;
109
110    struct tr_bitfield     * blame;
111    struct tr_bitfield     * have;
112
113    /** how complete the peer's copy of the torrent is. [0.0...1.0] */
114    float                    progress;
115
116    /* the client name from the `v' string in LTEP's handshake dictionary */
117    char                   * client;
118
119    time_t                   chokeChangedAt;
120
121    struct tr_peermsgs     * msgs;
122    tr_publisher_tag         msgsTag;
123}
124tr_peer;
125
126/**
127***
128**/
129
130int tr_pexCompare( const void * a, const void * b );
131
132tr_peerMgr* tr_peerMgrNew( tr_session * );
133
134void tr_peerMgrFree( tr_peerMgr * manager );
135
136tr_bool tr_peerMgrPeerIsSeed( const tr_torrent * tor,
137                              const tr_address * addr );
138
139void tr_peerMgrAddIncoming( tr_peerMgr  * manager,
140                            tr_address  * addr,
141                            tr_port       port,
142                            int           socket );
143
144tr_pex * tr_peerMgrCompactToPex( const void    * compact,
145                                 size_t          compactLen,
146                                 const uint8_t * added_f,
147                                 size_t          added_f_len,
148                                 size_t        * setme_pex_count );
149
150tr_pex * tr_peerMgrCompact6ToPex( const void    * compact,
151                                  size_t          compactLen,
152                                  const uint8_t * added_f,
153                                  size_t          added_f_len,
154                                  size_t        * pexCount );
155
156tr_pex * tr_peerMgrArrayToPex( const void * array,
157                               size_t       arrayLen,
158                               size_t      * setme_pex_count );
159
160void tr_peerMgrAddPex( tr_torrent     * tor,
161                       uint8_t          from,
162                       const tr_pex   * pex );
163
164void tr_peerMgrSetBlame( tr_torrent        * tor,
165                         tr_piece_index_t    pieceIndex,
166                         int                 success );
167
168int  tr_peerMgrGetPeers( tr_torrent      * tor,
169                         tr_pex         ** setme_pex,
170                         uint8_t           af,
171                         int               maxPeerCount );
172
173void tr_peerMgrStartTorrent( tr_torrent * tor );
174
175void tr_peerMgrStopTorrent( tr_torrent * tor );
176
177void tr_peerMgrAddTorrent( tr_peerMgr         * manager,
178                           struct tr_torrent  * tor );
179
180void tr_peerMgrRemoveTorrent( tr_torrent * tor );
181
182void tr_peerMgrTorrentAvailability( const tr_torrent * tor,
183                                    int8_t           * tab,
184                                    unsigned int       tabCount );
185
186struct tr_bitfield* tr_peerMgrGetAvailable( const tr_torrent * tor );
187
188void tr_peerMgrTorrentStats( tr_torrent * tor,
189                             int * setmePeersKnown,
190                             int * setmePeersConnected,
191                             int * setmeSeedsConnected,
192                             int * setmeWebseedsSendingToUs,
193                             int * setmePeersSendingToUs,
194                             int * setmePeersGettingFromUs,
195                             int * setmePeersFrom ); /* TR_PEER_FROM__MAX */
196
197struct tr_peer_stat* tr_peerMgrPeerStats( const tr_torrent * tor,
198                                          int              * setmeCount );
199
200float tr_peerMgrGetWebseedSpeed( const tr_torrent * tor, uint64_t now );
201
202float* tr_peerMgrWebSpeeds( const tr_torrent * tor );
203
204
205double tr_peerGetPieceSpeed( const tr_peer    * peer,
206                             uint64_t           now,
207                             tr_direction       direction );
208
209/* @} */
210
211#endif
Note: See TracBrowser for help on using the repository browser.