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

Last change on this file since 11295 was 11295, checked in by charles, 11 years ago

(trunk libT) remove 120 unused ints and 2 unused time_t fields per-peer, whoo

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