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

Last change on this file since 11945 was 11945, checked in by jordan, 11 years ago

if we successfully finish a handshake using uTP, mark the peer as supporting uTP

  • Property svn:keywords set to Date Rev Author Id
File size: 7.5 KB
Line 
1/*
2 * This file Copyright (C) Mnemosyne LLC
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 11945 2011-02-18 00:41:06Z jordan $
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 "bitset.h"
28#include "history.h"
29#include "net.h"
30#include "peer-common.h" /* struct peer_request */
31
32/**
33 * @addtogroup peers Peers
34 * @{
35 */
36
37struct UTPSocket;
38struct tr_peer_stat;
39struct tr_torrent;
40typedef struct tr_peerMgr tr_peerMgr;
41
42/* added_f's bitwise-or'ed flags */
43enum
44{
45    /* true if the peer supports encryption */
46    ADDED_F_ENCRYPTION_FLAG = 1,
47
48    /* true if the peer is a seed or partial seed */
49    ADDED_F_SEED_FLAG = 2,
50
51    /* true if the peer supports uTP */
52    ADDED_F_UTP_FLAGS = 4,
53
54    /* true if the peer has holepunch support */
55    ADDED_F_HOLEPUNCH = 8,
56
57    /* true if the peer telling us about this peer
58     * initiated the connection (implying that it is connectible) */ 
59   ADDED_F_CONNECTABLE = 16 
60};
61
62typedef struct tr_pex
63{
64    tr_address addr;
65    tr_port    port; /* this field is in network byte order */
66    uint8_t    flags;
67}
68tr_pex;
69
70
71struct tr_bandwidth;
72struct tr_peerIo;
73struct tr_peermsgs;
74
75enum
76{
77    ENCRYPTION_PREFERENCE_UNKNOWN,
78    ENCRYPTION_PREFERENCE_YES,
79    ENCRYPTION_PREFERENCE_NO
80};
81
82/* opaque forward declaration */
83struct peer_atom;
84
85/**
86 * State information about a connected peer.
87 *
88 * @see struct peer_atom
89 * @see tr_peermsgs
90 */
91typedef struct tr_peer
92{
93    tr_bool                  peerIsChoked;
94    tr_bool                  peerIsInterested;
95    tr_bool                  clientIsChoked;
96    tr_bool                  clientIsInterested;
97    tr_bool                  doPurge;
98
99    /* number of bad pieces they've contributed to */
100    uint8_t                  strikes;
101
102    uint8_t                  encryption_preference;
103    tr_port                  dht_port;
104
105    /* how many requests the peer has made that we haven't responded to yet */
106    int                      pendingReqsToClient;
107
108    /* how many requests we've made and are currently awaiting a response for */
109    int                      pendingReqsToPeer;
110
111    struct tr_peerIo       * io;
112    struct peer_atom       * atom;
113
114    struct tr_bitfield     * blame;
115    struct tr_bitset         have;
116
117    /** how complete the peer's copy of the torrent is. [0.0...1.0] */
118    float                    progress;
119
120    /* the client name from the `v' string in LTEP's handshake dictionary */
121    char                   * client;
122
123    time_t                   chokeChangedAt;
124
125    tr_recentHistory       * blocksSentToClient;
126    tr_recentHistory       * blocksSentToPeer;
127
128    tr_recentHistory       * cancelsSentToClient;
129    tr_recentHistory       * cancelsSentToPeer;
130
131    struct tr_peermsgs     * msgs;
132}
133tr_peer;
134
135static inline tr_bool
136tr_isPex( const tr_pex * pex )
137{
138    return pex && tr_isAddress( &pex->addr );
139}
140
141const tr_address * tr_peerAddress( const tr_peer * );
142
143int tr_pexCompare( const void * a, const void * b );
144
145tr_peerMgr* tr_peerMgrNew( tr_session * );
146
147void tr_peerMgrFree( tr_peerMgr * manager );
148
149tr_bool tr_peerMgrPeerIsSeed( const tr_torrent * tor,
150                              const tr_address * addr );
151
152void tr_peerMgrSetUtpSupported( tr_torrent       * tor,
153                                const tr_address * addr );
154
155void tr_peerMgrGetNextRequests( tr_torrent          * torrent,
156                                tr_peer             * peer,
157                                int                   numwant,
158                                tr_block_index_t    * setme,
159                                int                 * numgot );
160
161tr_bool tr_peerMgrDidPeerRequest( const tr_torrent  * torrent,
162                                  const tr_peer     * peer,
163                                  tr_block_index_t    block );
164
165void tr_peerMgrRebuildRequests( tr_torrent * torrent );
166
167void tr_peerMgrAddIncoming( tr_peerMgr  * manager,
168                            tr_address  * addr,
169                            tr_port       port,
170                            int           socket,
171                            struct UTPSocket *utp_socket );
172
173tr_pex * tr_peerMgrCompactToPex( const void    * compact,
174                                 size_t          compactLen,
175                                 const uint8_t * added_f,
176                                 size_t          added_f_len,
177                                 size_t        * setme_pex_count );
178
179tr_pex * tr_peerMgrCompact6ToPex( const void    * compact,
180                                  size_t          compactLen,
181                                  const uint8_t * added_f,
182                                  size_t          added_f_len,
183                                  size_t        * pexCount );
184
185tr_pex * tr_peerMgrArrayToPex( const void * array,
186                               size_t       arrayLen,
187                               size_t      * setme_pex_count );
188
189/**
190 * @param seedProbability [0..100] for likelihood that the peer is a seed; -1 for unknown
191 */
192void tr_peerMgrAddPex( tr_torrent     * tor,
193                       uint8_t          from,
194                       const tr_pex   * pex,
195                       int8_t           seedProbability );
196
197void tr_peerMgrMarkAllAsSeeds( tr_torrent * tor );
198
199void tr_peerMgrSetBlame( tr_torrent        * tor,
200                         tr_piece_index_t    pieceIndex,
201                         int                 success );
202
203enum
204{
205    TR_PEERS_CONNECTED,
206    TR_PEERS_ALL
207};
208
209int  tr_peerMgrGetPeers( tr_torrent      * tor,
210                         tr_pex         ** setme_pex,
211                         uint8_t           address_type,
212                         uint8_t           peer_list_mode,
213                         int               max_peer_count );
214
215void tr_peerMgrStartTorrent( tr_torrent * tor );
216
217void tr_peerMgrStopTorrent( tr_torrent * tor );
218
219void tr_peerMgrAddTorrent( tr_peerMgr         * manager,
220                           struct tr_torrent  * tor );
221
222void tr_peerMgrRemoveTorrent( tr_torrent * tor );
223
224void tr_peerMgrTorrentAvailability( const tr_torrent * tor,
225                                    int8_t           * tab,
226                                    unsigned int       tabCount );
227
228struct tr_bitfield* tr_peerMgrGetAvailable( const tr_torrent * tor );
229
230void tr_peerMgrOnBlocklistChanged( tr_peerMgr * manager );
231
232void tr_peerMgrTorrentStats( tr_torrent * tor,
233                             int * setmePeersKnown,
234                             int * setmePeersConnected,
235                             int * setmeSeedsConnected,
236                             int * setmeWebseedsSendingToUs,
237                             int * setmePeersSendingToUs,
238                             int * setmePeersGettingFromUs,
239                             int * setmePeersFrom ); /* TR_PEER_FROM__MAX */
240
241struct tr_peer_stat* tr_peerMgrPeerStats( const tr_torrent * tor,
242                                          int              * setmeCount );
243
244int tr_peerMgrGetWebseedSpeed_Bps( const tr_torrent * tor, uint64_t now );
245
246double* tr_peerMgrWebSpeeds_KBps( const tr_torrent * tor );
247
248
249int tr_peerGetPieceSpeed_Bps( const tr_peer    * peer,
250                              uint64_t           now,
251                              tr_direction       direction );
252
253void tr_peerMgrClearInterest( tr_torrent * tor );
254
255/* @} */
256
257#endif
Note: See TracBrowser for help on using the repository browser.