aboutsummaryrefslogtreecommitdiff
path: root/src/include/gnunet_stream_lib.h
blob: e09c264d6aa44ef4c248f6a4769a6cbe1ba286f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
/*
     This file is part of GNUnet.
     (C) 2011, 2012 Christian Grothoff (and other contributing authors)

     GNUnet is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published
     by the Free Software Foundation; either version 3, or (at your
     option) any later version.

     GNUnet is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with GNUnet; see the file COPYING.  If not, write to the
     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.
*/

/**
 * @file include/gnunet_stream_lib.h
 * @brief stream handling using mesh API
 * @author Sree Harsha Totakura
 */

#ifndef GNUNET_STREAM_LIB_H
#define GNUNET_STREAM_LIB_H

#ifdef __cplusplus
extern "C" 
{
#if 0
}
#endif
#endif

#include "gnunet_util_lib.h"
#include "gnunet_mesh_service.h"

/**
 * Stream status 
 */
enum GNUNET_STREAM_Status
  {
    /**
     * All previous read/write operations are successfully done
     */
    GNUNET_STREAM_OK = 0,

    /**
     * A timeout occured while reading/writing the stream
     */
    GNUNET_STREAM_TIMEOUT = 1,

    /**
     * Other side has shutdown the socket for this type of operation
     * (reading/writing)
     */
    GNUNET_STREAM_SHUTDOWN = 2,

    /**
     * A serious error occured while operating on this stream
     */
    GNUNET_STREAM_SYSERR = 3,
    
    /**
     * An error resulted in an unusable stream
     */
    GNUNET_STREAM_BROKEN
  };

/**
 * Opaque handler for stream
 */
struct GNUNET_STREAM_Socket;

/**
 * Functions of this type will be called when a stream is established
 *
 * @param cls the closure from GNUNET_STREAM_open
 * @param socket socket to use to communicate with the other side (read/write)
 */
typedef void (*GNUNET_STREAM_OpenCallback) (void *cls,
					    struct GNUNET_STREAM_Socket *socket);


/**
 * Options for the stream.
 */
enum GNUNET_STREAM_Option
  {
    /**
     * End of the option list.
     */
    GNUNET_STREAM_OPTION_END = 0,

    /**
     * Option to set the initial retransmission timeout (when do we retransmit
     * a packet that did not yield an acknowledgement for the first time?).  
     * Repeated retransmissions will then use an exponential back-off.
     * Takes a 'struct GNUNET_TIME_Relative' as the only argument.  A value
     * of '0' means to use the round-trip time (plus a tiny grace period);
     * this is also the default.
     */
    GNUNET_STREAM_OPTION_INITIAL_RETRANSMIT_TIMEOUT
  };


/**
 * Tries to open a stream to the target peer
 *
 * @param cfg configuration to use
 * @param target the target peer to which the stream has to be opened
 * @param app_port the application port number which uniquely identifies this
 *            stream
 * @param open_cb this function will be called after stream has be established 
 * @param open_cb_cls the closure for open_cb
 * @param ... options to the stream, terminated by GNUNET_STREAM_OPTION_END
 * @return if successful it returns the stream socket; NULL if stream cannot be
 *         opened 
 */
struct GNUNET_STREAM_Socket *
GNUNET_STREAM_open (const struct GNUNET_CONFIGURATION_Handle *cfg,
                    const struct GNUNET_PeerIdentity *target,
                    GNUNET_MESH_ApplicationType app_port,
                    GNUNET_STREAM_OpenCallback open_cb,
		    void *open_cb_cls,
		    ...);


/**
 * Handle for shutdown
 */
struct GNUNET_STREAM_ShutdownHandle;


/**
 * Completion callback for shutdown
 *
 * @param cls the closure from GNUNET_STREAM_shutdown call
 * @param operation the operation that was shutdown (SHUT_RD, SHUT_WR,
 *          SHUT_RDWR) 
 */
typedef void (*GNUNET_STREAM_ShutdownCompletion) (void *cls,
                                                  int operation);


/**
 * Shutdown the stream for reading or writing (similar to man 2 shutdown).
 *
 * @param socket the stream socket
 * @param operation SHUT_RD, SHUT_WR or SHUT_RDWR
 * @param completion_cb the callback that will be called upon successful
 *          shutdown of given operation
 * @param completion_cls the closure for the completion callback
 * @return the shutdown handle; NULL in case of any error
 */
struct GNUNET_STREAM_ShutdownHandle *
GNUNET_STREAM_shutdown (struct GNUNET_STREAM_Socket *socket,
			int operation,
                        GNUNET_STREAM_ShutdownCompletion completion_cb,
                        void *completion_cls);


/**
 * Cancels a pending shutdown
 *
 * @param handle the shutdown handle returned from GNUNET_STREAM_shutdown
 */
void
GNUNET_STREAM_shutdown_cancel (struct GNUNET_STREAM_ShutdownHandle *handle);


/**
 * Closes the stream and frees the associated state. The stream should be
 * shutdown before closing.
 *
 * @param socket the stream socket
 */
void
GNUNET_STREAM_close (struct GNUNET_STREAM_Socket *socket);


/**
 * Functions of this type are called upon new stream connection from other peers
 *
 * @param cls the closure from GNUNET_STREAM_listen
 * @param socket the socket representing the stream
 * @param initiator the identity of the peer who wants to establish a stream
 *            with us
 * @return GNUNET_OK to keep the socket open, GNUNET_SYSERR to close the
 *             stream (the socket will be invalid after the call)
 */
typedef int (*GNUNET_STREAM_ListenCallback) (void *cls,
                                             struct GNUNET_STREAM_Socket *socket,
                                             const struct 
                                             GNUNET_PeerIdentity *initiator);


/**
 * A socket for listening.
 */
struct GNUNET_STREAM_ListenSocket;

/**
 * Listens for stream connections for a specific application ports
 *
 * @param cfg the configuration to use
 * @param app_port the application port for which new streams will be accepted
 * @param listen_cb this function will be called when a peer tries to establish
 *            a stream with us
 * @param listen_cb_cls closure for listen_cb
 * @return listen socket, NULL for any error
 */
struct GNUNET_STREAM_ListenSocket *
GNUNET_STREAM_listen (const struct GNUNET_CONFIGURATION_Handle *cfg,
                      GNUNET_MESH_ApplicationType app_port,
                      GNUNET_STREAM_ListenCallback listen_cb,
                      void *listen_cb_cls);


/**
 * Closes the listen socket
 *
 * @param lsocket the listen socket
 */
void
GNUNET_STREAM_listen_close (struct GNUNET_STREAM_ListenSocket *lsocket);


/**
 * Functions of this signature are called whenever writing operations
 * on a stream are executed
 *
 * @param cls the closure from GNUNET_STREAM_write
 * @param status the status of the stream at the time this function is called
 * @param size the number of bytes written
 */
typedef void (*GNUNET_STREAM_CompletionContinuation) (void *cls,
						      enum GNUNET_STREAM_Status
						      status,
						      size_t size);


/**
 * Handle to cancel IO write operations.
 */
struct GNUNET_STREAM_IOWriteHandle;


/**
 * Handle to cancel IO read operations.
 */
struct GNUNET_STREAM_IOReadHandle;

/**
 * Tries to write the given data to the stream. The maximum size of data that
 * can be written as part of a write operation is (64 * (64000 - sizeof (struct
 * GNUNET_STREAM_DataMessage))). If size is greater than this it is not an API
 * violation, however only the said number of maximum bytes will be written.
 *
 * @param socket the socket representing a stream
 * @param data the data buffer from where the data is written into the stream
 * @param size the number of bytes to be written from the data buffer
 * @param timeout the timeout period
 * @param write_cont the function to call upon writing some bytes into the
 *          stream 
 * @param write_cont_cls the closure
 *
 * @return handle to cancel the operation; if a previous write is pending or
 *           the stream has been shutdown for this operation then write_cont is
 *           immediately called and NULL is returned.
 */
struct GNUNET_STREAM_IOWriteHandle *
GNUNET_STREAM_write (struct GNUNET_STREAM_Socket *socket,
                     const void *data,
                     size_t size,
                     struct GNUNET_TIME_Relative timeout,
                     GNUNET_STREAM_CompletionContinuation write_cont,
                     void *write_cont_cls);


/**
 * Functions of this signature are called whenever data is available from the
 * stream.
 *
 * @param cls the closure from GNUNET_STREAM_read
 * @param status the status of the stream at the time this function is called
 * @param data traffic from the other side
 * @param size the number of bytes available in data read; will be 0 on timeout 
 * @return number of bytes of processed from 'data' (any data remaining should be
 *         given to the next time the read processor is called).
 */
typedef size_t (*GNUNET_STREAM_DataProcessor) (void *cls,
                                               enum GNUNET_STREAM_Status status,
                                               const void *data,
                                               size_t size);


/**
 * Tries to read data from the stream.
 *
 * @param socket the socket representing a stream
 * @param timeout the timeout period
 * @param proc function to call with data (once only)
 * @param proc_cls the closure for proc
 *
 * @return handle to cancel the operation; if the stream has been shutdown for
 *           this type of opeartion then the DataProcessor is immediately
 *           called with GNUNET_STREAM_SHUTDOWN as status and NULL if returned
 */
struct GNUNET_STREAM_IOReadHandle *
GNUNET_STREAM_read (struct GNUNET_STREAM_Socket *socket,
                    struct GNUNET_TIME_Relative timeout,
		    GNUNET_STREAM_DataProcessor proc,
		    void *proc_cls);


/**
 * Cancels pending write operation. Also cancels packet retransmissions which
 * may have resulted otherwise.
 *
 * CAUTION: Normally a write operation is considered successful if the data
 * given to it is sent and acknowledged by the receiver. As data is divided
 * into packets, it is possible that not all packets are received by the
 * receiver. Any missing packets are then retransmitted till the receiver
 * acknowledges all packets or until a timeout . During this scenario if the
 * write operation is cancelled all such retransmissions are also
 * cancelled. This may leave the receiver's receive buffer incompletely filled
 * as some missing packets are never retransmitted. So this operation should be
 * used before shutting down transmission from our side or before closing the
 * socket.
 *
 * @param ioh handle to operation to cancel
 */
void
GNUNET_STREAM_io_write_cancel (struct GNUNET_STREAM_IOWriteHandle *iowh);


/**
 * Cancel pending read operation.
 *
 * @param ioh handle to operation to cancel
 */
void
GNUNET_STREAM_io_read_cancel (struct GNUNET_STREAM_IOReadHandle *iorh);


#if 0
{
#endif
#ifdef __cplusplus
}
#endif

#endif  /* STREAM_PROTOCOL_H */