Fix W32 gauger C bindings - quote arguments
[oweals/gnunet.git] / src / include / gnunet_transport_service.h
1 /*
2      This file is part of GNUnet.
3      (C) 2009, 2010, 2011 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file include/gnunet_transport_service.h
23  * @brief low-level P2P IO
24  * @author Christian Grothoff
25  */
26
27 #ifndef GNUNET_TRANSPORT_SERVICE_H
28 #define GNUNET_TRANSPORT_SERVICE_H
29
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #if 0                           /* keep Emacsens' auto-indent happy */
34 }
35 #endif
36 #endif
37
38 #include "gnunet_util_lib.h"
39 #include "gnunet_ats_service.h"
40
41 /**
42  * Version number of the transport API.
43  */
44 #define GNUNET_TRANSPORT_VERSION 0x00000000
45
46
47 /**
48  * Function called by the transport for each received message.
49  *
50  * @param cls closure
51  * @param peer (claimed) identity of the other peer
52  * @param message the message
53  * @param ats performance data
54  * @param ats_count number of entries in ats
55  */
56 typedef void (*GNUNET_TRANSPORT_ReceiveCallback) (void *cls,
57                                                   const struct
58                                                   GNUNET_PeerIdentity * peer,
59                                                   const struct
60                                                   GNUNET_MessageHeader *
61                                                   message,
62                                                   const struct
63                                                   GNUNET_ATS_Information * ats,
64                                                   uint32_t ats_count);
65
66
67 /**
68  * Opaque handle to the service.
69  */
70 struct GNUNET_TRANSPORT_Handle;
71
72
73 /**
74  * Function called to notify transport users that another
75  * peer connected to us.
76  *
77  * @param cls closure
78  * @param peer the peer that connected
79  * @param ats performance data
80  * @param ats_count number of entries in ats (excluding 0-termination)
81  */
82 typedef void (*GNUNET_TRANSPORT_NotifyConnect) (void *cls,
83                                                 const struct GNUNET_PeerIdentity
84                                                 * peer,
85                                                 const struct
86                                                 GNUNET_ATS_Information * ats,
87                                                 uint32_t ats_count);
88
89 /**
90  * Function called to notify transport users that another
91  * peer disconnected from us.
92  *
93  * @param cls closure
94  * @param peer the peer that disconnected
95  */
96 typedef void (*GNUNET_TRANSPORT_NotifyDisconnect) (void *cls,
97                                                    const struct
98                                                    GNUNET_PeerIdentity * peer);
99
100
101 /**
102  * Function to call with result of the try connect request.
103  *
104  *
105  * @param cls closure
106  * @param result GNUNET_OK if message was transmitted to transport service
107  *               GNUNET_SYSERR if message was not transmitted to transport service
108  */
109 typedef void (*GNUNET_TRANSPORT_TryConnectCallback) (void *cls,
110                                                      const int result);
111
112
113 /**
114  * Function to call with a textual representation of an address.
115  * This function will be called several times with different possible
116  * textual representations, and a last time with NULL to signal the end
117  * of the iteration.
118  *
119  * @param cls closure
120  * @param address NULL on error or end of iteration,
121  *        otherwise 0-terminated printable UTF-8 string
122  */
123 typedef void (*GNUNET_TRANSPORT_AddressToStringCallback) (void *cls,
124                                                           const char *address);
125
126
127 /**
128  * Function to call with a binary format of an address
129  *
130  * @param cls closure
131  * @param peer peer this update is about (never NULL)
132  * @param address address, NULL for disconnect notification in monitor mode
133  */
134 typedef void (*GNUNET_TRANSPORT_PeerIterateCallback) (void *cls,
135                                                       const struct
136                                                       GNUNET_PeerIdentity *
137                                                       peer,
138                                                       const struct
139                                                       GNUNET_HELLO_Address *
140                                                       address);
141
142
143 /**
144  * Connect to the transport service.  Note that the connection may
145  * complete (or fail) asynchronously.
146  *
147  * @param cfg configuration to use
148  * @param self our own identity (API should check that it matches
149  *             the identity found by transport), or NULL (no check)
150  * @param cls closure for the callbacks
151  * @param rec receive function to call
152  * @param nc function to call on connect events
153  * @param nd function to call on disconnect events
154  * @return NULL on error
155  */
156 struct GNUNET_TRANSPORT_Handle *
157 GNUNET_TRANSPORT_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
158                           const struct GNUNET_PeerIdentity *self, void *cls,
159                           GNUNET_TRANSPORT_ReceiveCallback rec,
160                           GNUNET_TRANSPORT_NotifyConnect nc,
161                           GNUNET_TRANSPORT_NotifyDisconnect nd);
162
163
164 /**
165  * Disconnect from the transport service.
166  *
167  * @param handle handle returned from connect
168  */
169 void
170 GNUNET_TRANSPORT_disconnect (struct GNUNET_TRANSPORT_Handle *handle);
171
172
173 /**
174  * Opaque handle for a transmission-ready request.
175  */
176 struct GNUNET_TRANSPORT_TryConnectHandle;
177
178
179 /**
180  * Ask the transport service to establish a connection to
181  * the given peer.
182  *
183  * @param handle connection to transport service
184  * @param target who we should try to connect to
185  * @param cb callback to be called when request was transmitted to transport
186  *         service
187  * @return a GNUNET_TRANSPORT_TryConnectHandle handle or
188  *         NULL on failure (cb will not be called)
189  */
190 struct GNUNET_TRANSPORT_TryConnectHandle *
191 GNUNET_TRANSPORT_try_connect (struct GNUNET_TRANSPORT_Handle *handle,
192                               const struct GNUNET_PeerIdentity *target,
193                               GNUNET_TRANSPORT_TryConnectCallback cb,
194                               void *cb_cls);
195
196
197 /**
198  * Cancel the request to transport to try a connect
199  * Callback will not be called
200  *
201  * @param tch GNUNET_TRANSPORT_TryConnectHandle handle to cancel
202  */
203 void
204 GNUNET_TRANSPORT_try_connect_cancel (struct GNUNET_TRANSPORT_TryConnectHandle *tch);
205
206 /**
207  * Opaque handle for a transmission-ready request.
208  */
209 struct GNUNET_TRANSPORT_TransmitHandle;
210
211
212 /**
213  * Check if we could queue a message of the given size for
214  * transmission.  The transport service will take both its internal
215  * buffers and bandwidth limits imposed by the other peer into
216  * consideration when answering this query.
217  *
218  * @param handle connection to transport service
219  * @param target who should receive the message
220  * @param size how big is the message we want to transmit?
221  * @param priority how important is the message? @deprecated - remove?
222  * @param timeout after how long should we give up (and call
223  *        notify with buf NULL and size 0)?
224  * @param notify function to call when we are ready to
225  *        send such a message
226  * @param notify_cls closure for notify
227  * @return NULL if someone else is already waiting to be notified
228  *         non-NULL if the notify callback was queued (can be used to cancel
229  *         using GNUNET_TRANSPORT_notify_transmit_ready_cancel)
230  */
231 struct GNUNET_TRANSPORT_TransmitHandle *
232 GNUNET_TRANSPORT_notify_transmit_ready (struct GNUNET_TRANSPORT_Handle *handle,
233                                         const struct GNUNET_PeerIdentity
234                                         *target, size_t size, uint32_t priority,
235                                         struct GNUNET_TIME_Relative timeout,
236                                         GNUNET_CONNECTION_TransmitReadyNotify
237                                         notify, void *notify_cls);
238
239
240 /**
241  * Cancel the specified transmission-ready notification.
242  *
243  * @param th handle of the transmission notification request to cancel
244  */
245 void
246 GNUNET_TRANSPORT_notify_transmit_ready_cancel (struct
247                                                GNUNET_TRANSPORT_TransmitHandle
248                                                *th);
249
250
251
252 /**
253  * Function called whenever there is an update to the
254  * HELLO of this peer.
255  *
256  * @param cls closure
257  * @param hello our updated HELLO
258  */
259 typedef void (*GNUNET_TRANSPORT_HelloUpdateCallback) (void *cls,
260                                                       const struct
261                                                       GNUNET_MessageHeader *
262                                                       hello);
263
264
265 /**
266  * Handle to cancel a 'GNUNET_TRANSPORT_get_hello' operation.
267  */
268 struct GNUNET_TRANSPORT_GetHelloHandle;
269
270
271 /**
272  * Obtain updates on changes to the HELLO message for this peer.
273  *
274  * @param handle connection to transport service
275  * @param rec function to call with the HELLO
276  * @param rec_cls closure for rec
277  * @return handle to cancel the operation
278  */
279 struct GNUNET_TRANSPORT_GetHelloHandle *
280 GNUNET_TRANSPORT_get_hello (struct GNUNET_TRANSPORT_Handle *handle,
281                             GNUNET_TRANSPORT_HelloUpdateCallback rec,
282                             void *rec_cls);
283
284
285 /**
286  * Stop receiving updates about changes to our HELLO message.
287  *
288  * @param ghh handle to cancel
289  */
290 void
291 GNUNET_TRANSPORT_get_hello_cancel (struct GNUNET_TRANSPORT_GetHelloHandle *ghh);
292
293
294 /**
295  * Offer the transport service the HELLO of another peer.  Note that
296  * the transport service may just ignore this message if the HELLO is
297  * malformed or useless due to our local configuration.
298  *
299  * @param handle connection to transport service
300  * @param hello the hello message
301  * @param cont continuation to call when HELLO has been sent,
302  *      tc reason GNUNET_SCHEDULER_REASON_TIMEOUT for fail
303  *      tc reasong GNUNET_SCHEDULER_REASON_READ_READY for success
304  * @param cls closure for continuation
305  * @return a GNUNET_TRANSPORT_OfferHelloHandle handle or NULL on failure,
306  *      in case of failure cont will not be called
307  *
308  */
309 struct GNUNET_TRANSPORT_OfferHelloHandle *
310 GNUNET_TRANSPORT_offer_hello (struct GNUNET_TRANSPORT_Handle *handle,
311                               const struct GNUNET_MessageHeader *hello,
312                               GNUNET_SCHEDULER_Task cont, void *cls);
313
314
315 /**
316  * Cancel the request to transport to offer the HELLO message
317  *
318  * @param ohh the GNUNET_TRANSPORT_OfferHelloHandle to cancel
319  */
320 void
321 GNUNET_TRANSPORT_offer_hello_cancel (struct GNUNET_TRANSPORT_OfferHelloHandle *ohh);
322
323 /**
324  * Handle to cancel a pending address lookup.
325  */
326 struct GNUNET_TRANSPORT_AddressToStringContext;
327
328
329 /**
330  * Convert a binary address into a human readable address.
331  *
332  * @param cfg configuration to use
333  * @param address address to convert (binary format)
334  * @param numeric should (IP) addresses be displayed in numeric form
335  *                (otherwise do reverse DNS lookup)
336  * @param timeout how long is the lookup allowed to take at most
337  * @param aluc function to call with the results
338  * @param aluc_cls closure for aluc
339  * @return handle to cancel the operation, NULL on error
340  */
341 struct GNUNET_TRANSPORT_AddressToStringContext *
342 GNUNET_TRANSPORT_address_to_string (const struct GNUNET_CONFIGURATION_Handle
343                                     *cfg,
344                                     const struct GNUNET_HELLO_Address *address,
345                                     int numeric,
346                                     struct GNUNET_TIME_Relative timeout,
347                                     GNUNET_TRANSPORT_AddressToStringCallback
348                                     aluc, void *aluc_cls);
349
350
351 /**
352  * Cancel request for address conversion.
353  *
354  * @param alc handle for the request to cancel
355  */
356 void
357 GNUNET_TRANSPORT_address_to_string_cancel (struct
358                                            GNUNET_TRANSPORT_AddressToStringContext
359                                            *alc);
360
361
362 /**
363  * Return all the known addresses for a specific peer or all peers.
364  * Returns continuously all address if one_shot is set to GNUNET_NO
365  *
366  * CHANGE: Returns the address(es) that we are currently using for this
367  * peer.  Upon completion, the 'AddressLookUpCallback' is called one more
368  * time with 'NULL' for the address and the peer.  After this, the operation must no
369  * longer be explicitly cancelled.
370  *
371  * @param cfg configuration to use
372  * @param peer peer identity to look up the addresses of, CHANGE: allow NULL for all (connected) peers
373  * @param one_shot GNUNET_YES to return the current state and then end (with NULL+NULL),
374  *                 GNUNET_NO to monitor the set of addresses used (continuously, must be explicitly canceled, NOT implemented yet!)
375  * @param timeout how long is the lookup allowed to take at most
376  * @param peer_address_callback function to call with the results
377  * @param peer_address_callback_cls closure for peer_address_callback
378  */
379 struct GNUNET_TRANSPORT_PeerIterateContext *
380 GNUNET_TRANSPORT_peer_get_active_addresses (const struct
381                                             GNUNET_CONFIGURATION_Handle *cfg,
382                                             const struct GNUNET_PeerIdentity
383                                             *peer, int one_shot,
384                                             struct GNUNET_TIME_Relative timeout,
385                                             GNUNET_TRANSPORT_PeerIterateCallback
386                                             peer_address_callback,
387                                             void *peer_address_callback_cls);
388
389
390 /**
391  * Cancel request for peer lookup.
392  *
393  * @param alc handle for the request to cancel
394  */
395 void
396 GNUNET_TRANSPORT_peer_get_active_addresses_cancel (struct
397                                                    GNUNET_TRANSPORT_PeerIterateContext
398                                                    *alc);
399
400
401 /**
402  * Handle for blacklisting peers.
403  */
404 struct GNUNET_TRANSPORT_Blacklist;
405
406
407 /**
408  * Function that decides if a connection is acceptable or not.
409  *
410  * @param cls closure
411  * @param pid peer to approve or disapproave
412  * @return GNUNET_OK if the connection is allowed, GNUNET_SYSERR if not
413  */
414 typedef int (*GNUNET_TRANSPORT_BlacklistCallback) (void *cls,
415                                                    const struct
416                                                    GNUNET_PeerIdentity * pid);
417
418
419 /**
420  * Install a blacklist callback.  The service will be queried for all
421  * existing connections as well as any fresh connections to check if
422  * they are permitted.  If the blacklisting callback is unregistered,
423  * all hosts that were denied in the past will automatically be
424  * whitelisted again.  Cancelling the blacklist handle is also the
425  * only way to re-enable connections from peers that were previously
426  * blacklisted.
427  *
428  * @param cfg configuration to use
429  * @param cb callback to invoke to check if connections are allowed
430  * @param cb_cls closure for cb
431  * @return NULL on error, otherwise handle for cancellation
432  */
433 struct GNUNET_TRANSPORT_Blacklist *
434 GNUNET_TRANSPORT_blacklist (const struct GNUNET_CONFIGURATION_Handle *cfg,
435                             GNUNET_TRANSPORT_BlacklistCallback cb,
436                             void *cb_cls);
437
438
439 /**
440  * Abort the blacklist.  Note that this function is the only way for
441  * removing a peer from the blacklist.
442  *
443  * @param br handle of the request that is to be cancelled
444  */
445 void
446 GNUNET_TRANSPORT_blacklist_cancel (struct GNUNET_TRANSPORT_Blacklist *br);
447
448
449
450 #if 0                           /* keep Emacsens' auto-indent happy */
451 {
452 #endif
453 #ifdef __cplusplus
454 }
455 #endif
456
457 /* ifndef GNUNET_TRANSPORT_SERVICE_H */
458 #endif
459 /* end of gnunet_transport_service.h */