source: trunk/libtransmission/peer-io.h @ 12170

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

(trunk libT) cpu load improvements based on profiling by gunzip

  • Property svn:keywords set to Date Rev Author Id
File size: 10.9 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-io.h 12170 2011-03-15 18:11:31Z jordan $
11 */
12
13#ifndef __TRANSMISSION__
14#error only libtransmission should #include this header.
15#endif
16
17#ifndef TR_PEER_IO_H
18#define TR_PEER_IO_H
19
20/**
21***
22**/
23
24#include <assert.h>
25
26#include <event2/buffer.h>
27#include <event2/event.h>
28
29#include "transmission.h"
30#include "bandwidth.h"
31#include "list.h" /* tr_list */
32#include "net.h" /* tr_address */
33#include "utils.h" /* tr_time() */
34
35struct evbuffer;
36struct tr_bandwidth;
37struct tr_crypto;
38struct tr_peerIo;
39
40/**
41 * @addtogroup networked_io Networked IO
42 * @{
43 */
44
45typedef enum
46{
47    READ_NOW,
48    READ_LATER,
49    READ_ERR
50}
51ReadState;
52
53typedef ReadState ( *tr_can_read_cb  )( struct tr_peerIo * io,
54                                        void             * user_data,
55                                        size_t           * setme_piece_byte_count );
56
57typedef void      ( *tr_did_write_cb )( struct tr_peerIo * io,
58                                        size_t             bytesWritten,
59                                        int                wasPieceData,
60                                        void             * userData );
61
62typedef void      ( *tr_net_error_cb )( struct tr_peerIo * io,
63                                        short              what,
64                                        void             * userData );
65
66typedef struct tr_peerIo
67{
68    tr_bool               isEncrypted;
69    tr_bool               isIncoming;
70    tr_bool               peerIdIsSet;
71    tr_bool               extendedProtocolSupported;
72    tr_bool               fastExtensionSupported;
73    tr_bool               dhtSupported;
74    tr_bool               utpSupported;
75
76    tr_priority_t         priority;
77
78    short int             pendingEvents;
79
80    int                   magicNumber;
81
82    uint32_t              encryptionMode;
83    tr_bool               isSeed;
84
85    tr_port               port;
86    int                   socket;
87    struct UTPSocket      *utp_socket;
88
89    int                   refCount;
90
91    uint8_t               peerId[SHA_DIGEST_LENGTH];
92    time_t                timeCreated;
93
94    tr_session          * session;
95
96    tr_address            addr;
97
98    tr_can_read_cb        canRead;
99    tr_did_write_cb       didWrite;
100    tr_net_error_cb       gotError;
101    void *                userData;
102
103    struct tr_bandwidth   bandwidth;
104    struct tr_crypto    * crypto;
105
106    struct evbuffer     * inbuf;
107    struct evbuffer     * outbuf;
108    struct tr_list      * outbuf_datatypes; /* struct tr_datatype */
109
110    struct event        * event_read;
111    struct event        * event_write;
112}
113tr_peerIo;
114
115/**
116***
117**/
118
119tr_peerIo*  tr_peerIoNewOutgoing( tr_session              * session,
120                                  struct tr_bandwidth     * parent,
121                                  const struct tr_address * addr,
122                                  tr_port                   port,
123                                  const  uint8_t          * torrentHash,
124                                  tr_bool                   isSeed,
125                                  tr_bool                   utp );
126
127
128tr_peerIo*  tr_peerIoNewIncoming( tr_session              * session,
129                                  struct tr_bandwidth     * parent,
130                                  const struct tr_address * addr,
131                                  tr_port                   port,
132                                  int                       socket,
133                                  struct UTPSocket *        utp_socket );
134
135void tr_peerIoRefImpl           ( const char              * file,
136                                  int                       line,
137                                  tr_peerIo               * io );
138
139#define tr_peerIoRef(io) tr_peerIoRefImpl( __FILE__, __LINE__, (io) );
140
141void tr_peerIoUnrefImpl         ( const char              * file,
142                                  int                       line,
143                                  tr_peerIo               * io );
144
145#define tr_peerIoUnref(io) tr_peerIoUnrefImpl( __FILE__, __LINE__, (io) );
146
147#define PEER_IO_MAGIC_NUMBER 206745
148
149static inline tr_bool
150tr_isPeerIo( const tr_peerIo * io )
151{
152    return ( io != NULL )
153        && ( io->magicNumber == PEER_IO_MAGIC_NUMBER )
154        && ( io->refCount >= 0 )
155        && ( tr_isBandwidth( &io->bandwidth ) )
156        && ( tr_isAddress( &io->addr ) );
157}
158
159/**
160***
161**/
162
163static inline void tr_peerIoEnableFEXT( tr_peerIo * io, tr_bool flag )
164{
165    io->fastExtensionSupported = flag;
166}
167static inline tr_bool tr_peerIoSupportsFEXT( const tr_peerIo * io )
168{
169    return io->fastExtensionSupported;
170}
171
172static inline void tr_peerIoEnableLTEP( tr_peerIo * io, tr_bool flag )
173{
174    io->extendedProtocolSupported = flag;
175}
176static inline tr_bool tr_peerIoSupportsLTEP( const tr_peerIo * io )
177{
178    return io->extendedProtocolSupported;
179}
180
181static inline void tr_peerIoEnableDHT( tr_peerIo * io, tr_bool flag )
182{
183    io->dhtSupported = flag;
184}
185static inline tr_bool tr_peerIoSupportsDHT( const tr_peerIo * io )
186{
187    return io->dhtSupported;
188}
189
190static inline tr_bool tr_peerIoSupportsUTP( const tr_peerIo * io )
191{
192    return io->dhtSupported;
193}
194
195/**
196***
197**/
198
199static inline tr_session* tr_peerIoGetSession ( tr_peerIo * io )
200{
201    assert( tr_isPeerIo( io ) );
202    assert( io->session );
203
204    return io->session;
205}
206
207const char* tr_peerIoAddrStr( const struct tr_address * addr,
208                              tr_port                   port );
209
210const char* tr_peerIoGetAddrStr( const tr_peerIo * io );
211
212const struct tr_address * tr_peerIoGetAddress( const tr_peerIo * io,
213                                               tr_port         * port );
214
215const uint8_t*       tr_peerIoGetTorrentHash( tr_peerIo * io );
216
217int                  tr_peerIoHasTorrentHash( const tr_peerIo * io );
218
219void                 tr_peerIoSetTorrentHash( tr_peerIo *     io,
220                                              const uint8_t * hash );
221
222int                  tr_peerIoReconnect( tr_peerIo * io );
223
224static inline tr_bool tr_peerIoIsIncoming( const tr_peerIo * io )
225{
226    return io->isIncoming;
227}
228
229static inline int    tr_peerIoGetAge( const tr_peerIo * io )
230{
231    return tr_time() - io->timeCreated;
232}
233
234
235/**
236***
237**/
238
239void                 tr_peerIoSetPeersId( tr_peerIo *     io,
240                                          const uint8_t * peer_id );
241
242static inline const uint8_t* tr_peerIoGetPeersId( const tr_peerIo * io )
243{
244    assert( tr_isPeerIo( io ) );
245    assert( io->peerIdIsSet );
246
247    return io->peerId;
248}
249
250/**
251***
252**/
253
254void    tr_peerIoSetIOFuncs      ( tr_peerIo        * io,
255                                   tr_can_read_cb     readcb,
256                                   tr_did_write_cb    writecb,
257                                   tr_net_error_cb    errcb,
258                                   void             * user_data );
259
260void    tr_peerIoClear           ( tr_peerIo        * io );
261
262/**
263***
264**/
265
266void    tr_peerIoWriteBytes     ( tr_peerIo         * io,
267                                  const void        * writeme,
268                                  size_t              writemeLen,
269                                  tr_bool             isPieceData );
270
271void    tr_peerIoWriteBuf       ( tr_peerIo         * io,
272                                  struct evbuffer   * buf,
273                                  tr_bool             isPieceData );
274
275/**
276***
277**/
278
279static inline struct tr_crypto * tr_peerIoGetCrypto( tr_peerIo * io )
280{
281    return io->crypto;
282}
283
284typedef enum
285{
286    /* these match the values in MSE's crypto_select */
287    PEER_ENCRYPTION_NONE  = ( 1 << 0 ),
288    PEER_ENCRYPTION_RC4   = ( 1 << 1 )
289}
290EncryptionMode;
291
292void tr_peerIoSetEncryption( tr_peerIo * io, uint32_t encryptionMode );
293
294static inline tr_bool
295tr_peerIoIsEncrypted( const tr_peerIo * io )
296{
297    return ( io != NULL ) && ( io->encryptionMode == PEER_ENCRYPTION_RC4 );
298}
299
300void evbuffer_add_uint8 ( struct evbuffer * outbuf, uint8_t byte );
301void evbuffer_add_uint16( struct evbuffer * outbuf, uint16_t hs );
302void evbuffer_add_uint32( struct evbuffer * outbuf, uint32_t hl );
303void evbuffer_add_uint64( struct evbuffer * outbuf, uint64_t hll );
304
305static inline void
306evbuffer_add_hton_16( struct evbuffer * buf, uint16_t val )
307{
308   evbuffer_add_uint16( buf, val );
309}
310static inline void
311evbuffer_add_hton_32( struct evbuffer * buf, uint32_t val )
312{
313   evbuffer_add_uint32( buf, val );
314}
315static inline void
316evbuffer_add_hton_64( struct evbuffer * buf, uint64_t val )
317{
318   evbuffer_add_uint64( buf, val );
319}
320
321void tr_peerIoReadBytes( tr_peerIo        * io,
322                         struct evbuffer  * inbuf,
323                         void             * bytes,
324                         size_t             byteCount );
325
326static inline void tr_peerIoReadUint8( tr_peerIo        * io,
327                                          struct evbuffer  * inbuf,
328                                          uint8_t          * setme )
329{
330    tr_peerIoReadBytes( io, inbuf, setme, sizeof( uint8_t ) );
331}
332
333void tr_peerIoReadUint16( tr_peerIo        * io,
334                          struct evbuffer  * inbuf,
335                          uint16_t         * setme );
336
337void tr_peerIoReadUint32( tr_peerIo        * io,
338                          struct evbuffer  * inbuf,
339                          uint32_t         * setme );
340
341void      tr_peerIoDrain( tr_peerIo        * io,
342                          struct evbuffer  * inbuf,
343                          size_t             byteCount );
344
345/**
346***
347**/
348
349size_t    tr_peerIoGetWriteBufferSpace( const tr_peerIo * io, uint64_t now );
350
351static inline void tr_peerIoSetParent( tr_peerIo            * io,
352                                          struct tr_bandwidth  * parent )
353{
354    assert( tr_isPeerIo( io ) );
355
356    tr_bandwidthSetParent( &io->bandwidth, parent );
357}
358
359void      tr_peerIoBandwidthUsed( tr_peerIo           * io,
360                                  tr_direction          direction,
361                                  size_t                byteCount,
362                                  int                   isPieceData );
363
364static inline tr_bool
365tr_peerIoHasBandwidthLeft( const tr_peerIo * io, tr_direction dir )
366{
367    return tr_bandwidthClamp( &io->bandwidth, dir, 1024 ) > 0;
368}
369
370static inline unsigned int
371tr_peerIoGetPieceSpeed_Bps( const tr_peerIo * io, uint64_t now, tr_direction dir )
372{
373    return tr_bandwidthGetPieceSpeed_Bps( &io->bandwidth, now, dir );
374}
375
376/**
377***
378**/
379
380void      tr_peerIoSetEnabled( tr_peerIo    * io,
381                               tr_direction   dir,
382                               tr_bool        isEnabled );
383
384int       tr_peerIoFlush( tr_peerIo     * io,
385                          tr_direction    dir,
386                          size_t          byteLimit );
387
388int       tr_peerIoFlushOutgoingProtocolMsgs( tr_peerIo * io );
389
390/**
391***
392**/
393
394static inline struct evbuffer * tr_peerIoGetReadBuffer( tr_peerIo * io )
395{
396    return io->inbuf;
397}
398
399/* @} */
400
401#endif
Note: See TracBrowser for help on using the repository browser.