reducing address size in hello to 16 bit
[oweals/gnunet.git] / src / transport / plugin_transport.h
1 /*
2      This file is part of GNUnet
3      (C) 2009, 2010 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 2, 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 transport/plugin_transport.h
23  * @brief API for the transport services.  This header
24  *        specifies the struct that is given to the plugin's entry
25  *        method and the other struct that must be returned.
26  *        Note that the destructors of transport plugins will
27  *        be given the value returned by the constructor
28  *        and is expected to return a NULL pointer.
29  * @author Christian Grothoff
30  */
31 #ifndef PLUGIN_TRANSPORT_H
32 #define PLUGIN_TRANSPORT_H
33
34 #include "gnunet_configuration_lib.h"
35 #include "gnunet_scheduler_lib.h"
36 #include "gnunet_statistics_service.h"
37 #include "gnunet_transport_service.h"
38
39 /**
40  * Opaque pointer that plugins can use to distinguish specific
41  * connections to a given peer.  Typically used by stateful plugins to
42  * allow the service to refer to specific streams instead of a more
43  * general notion of "some connection" to the given peer.  This is
44  * useful since sometimes (i.e. for inbound TCP connections) a
45  * connection may not have an address that can be used for meaningful
46  * distinction between sessions to the same peer.
47  */
48 struct Session;
49
50
51 /**
52  * Function that will be called whenever the plugin internally
53  * cleans up a session pointer and hence the service needs to
54  * discard all of those sessions as well.  Plugins that do not
55  * use sessions can simply omit calling this function and always
56  * use NULL wherever a session pointer is needed.
57  * 
58  * @param cls closure
59  * @param peer which peer was the session for 
60  * @param session which session is being destoyed
61  */
62 typedef void (*GNUNET_TRANSPORT_SessionEnd) (void *cls,
63                                              const struct GNUNET_PeerIdentity *peer,
64                                              struct Session *session);
65
66
67 /**
68  * Function called by the transport for each received message.
69  * This function should also be called with "NULL" for the
70  * message to signal that the other peer disconnected.
71  *
72  * @param cls closure
73  * @param peer (claimed) identity of the other peer
74  * @param message the message, NULL if we only care about
75  *                learning about the delay until we should receive again -- FIXME!
76  * @param distance in overlay hops; use 1 unless DV (or 0 if message == NULL)
77  * @param session identifier used for this session (can be NULL)
78  * @param sender_address binary address of the sender (if observed)
79  * @param sender_address_len number of bytes in sender_address
80  * @return how long the plugin should wait until receiving more data
81  *         (plugins that do not support this, can ignore the return value)
82  */
83 typedef struct GNUNET_TIME_Relative (*GNUNET_TRANSPORT_PluginReceiveCallback) (void *cls,
84                                                                                const struct
85                                                                                GNUNET_PeerIdentity *
86                                                                                peer,
87                                                                                const struct
88                                                                                GNUNET_MessageHeader *
89                                                                                message,
90                                                                                uint32_t distance,
91                                                                                struct Session *session,
92                                                                                const char *sender_address,
93                                                                                uint16_t sender_address_len);
94
95
96 /**
97  * Function that will be called for each address the transport
98  * is aware that it might be reachable under.
99  *
100  * @param cls closure
101  * @param name name of the transport that generated the address
102  * @param addr one of the addresses of the host, NULL for the last address
103  *        the specific address format depends on the transport
104  * @param addrlen length of the address
105  * @param expires when should this address automatically expire?
106  */
107 typedef void (*GNUNET_TRANSPORT_AddressNotification) (void *cls,
108                                                       const char *name,
109                                                       const void *addr,
110                                                       uint16_t addrlen,
111                                                       struct
112                                                       GNUNET_TIME_Relative
113                                                       expires);
114
115
116 /**
117  * Function that will be called whenever the plugin receives data over
118  * the network and wants to determine how long it should wait until
119  * the next time it reads from the given peer.  Note that some plugins
120  * (such as UDP) may not be able to wait (for a particular peer), so
121  * the waiting part is optional.  Plugins that can wait should call
122  * this function, sleep the given amount of time, and call it again
123  * (with zero bytes read) UNTIL it returns zero and only then read.
124  * 
125  * @param cls closure
126  * @param peer which peer did we read data from 
127  * @param amount_recved number of bytes read (can be zero)
128  * @return how long to wait until reading more from this peer
129  *         (to enforce inbound quotas)
130  */
131 typedef struct GNUNET_TIME_Relative (*GNUNET_TRANSPORT_TrafficReport) (void *cls,
132                                                                        const struct 
133                                                                        GNUNET_PeerIdentity *peer,
134                                                                        size_t amount_recved);
135
136
137 /**
138  * The transport service will pass a pointer to a struct
139  * of this type as the first and only argument to the
140  * entry point of each transport plugin.
141  */
142 struct GNUNET_TRANSPORT_PluginEnvironment
143 {
144   /**
145    * Configuration to use.
146    */
147   const struct GNUNET_CONFIGURATION_Handle *cfg;
148
149   /**
150    * Scheduler to use.
151    */
152   struct GNUNET_SCHEDULER_Handle *sched;
153
154   /**
155    * Identity of this peer.
156    */
157   const struct GNUNET_PeerIdentity *my_identity;
158
159   /**
160    * Closure for the various callbacks.
161    */
162   void *cls;
163
164   /**
165    * Handle for reporting statistics.
166    */
167   struct GNUNET_STATISTICS_Handle *stats;
168
169   /**
170    * Function that should be called by the transport plugin
171    * whenever a message is received.
172    */
173   GNUNET_TRANSPORT_PluginReceiveCallback receive;
174
175   /**
176    * Function that must be called by each plugin to notify the
177    * transport service about the addresses under which the transport
178    * provided by the plugin can be reached.
179    */
180   GNUNET_TRANSPORT_AddressNotification notify_address;
181
182   /**
183    * Inform service about traffic received, get information
184    * about when we might be willing to receive more.
185    */
186   GNUNET_TRANSPORT_TrafficReport traffic_report;
187
188   /**
189    * Function that must be called by the plugin when a non-NULL
190    * session handle stops being valid (is destroyed).
191    */
192   GNUNET_TRANSPORT_SessionEnd session_end;
193
194   /**
195    * What is the maximum number of connections that this transport
196    * should allow?  Transports that do not have sessions (such as
197    * UDP) can ignore this value.
198    */
199   uint32_t max_connections;
200
201 };
202
203
204 /**
205  * Function called by the GNUNET_TRANSPORT_TransmitFunction
206  * upon "completion".
207  *
208  * @param cls closure
209  * @param target who was the recipient of the message?
210  * @param result GNUNET_OK on success
211  *               GNUNET_SYSERR if the target disconnected;
212  *               disconnect will ALSO be signalled using
213  *               the ReceiveCallback.
214  */
215 typedef void
216   (*GNUNET_TRANSPORT_TransmitContinuation) (void *cls,
217                                             const struct GNUNET_PeerIdentity *
218                                             target, int result);
219
220
221 /**
222  * Function that can be used by the transport service to transmit
223  * a message using the plugin.   Note that in the case of a
224  * peer disconnecting, the continuation MUST be called
225  * prior to the disconnect notification itself.  This function
226  * will be called with this peer's HELLO message to initiate
227  * a fresh connection to another peer.
228  *
229  * @param cls closure
230  * @param target who should receive this message
231  * @param msgbuf the message to transmit
232  * @param msgbuf_size number of bytes in 'msgbuf'
233  * @param priority how important is the message (most plugins will
234  *                 ignore message priority and just FIFO)
235  * @param timeout how long to wait at most for the transmission (does not
236  *                require plugins to discard the message after the timeout,
237  *                just advisory for the desired delay; most plugins will ignore
238  *                this as well)
239  * @param session which session must be used (or NULL for "any")
240  * @param addr the address to use (can be NULL if the plugin
241  *                is "on its own" (i.e. re-use existing TCP connection))
242  * @param addrlen length of the address in bytes
243  * @param force_address GNUNET_YES if the plugin MUST use the given address,
244  *                GNUNET_NO means the plugin may use any other address and
245  *                GNUNET_SYSERR means that only reliable existing
246  *                bi-directional connections should be used (regardless
247  *                of address)
248  * @param cont continuation to call once the message has
249  *        been transmitted (or if the transport is ready
250  *        for the next transmission call; or if the
251  *        peer disconnected...); can be NULL
252  * @param cont_cls closure for cont
253  * @return number of bytes used (on the physical network, with overheads);
254  *         -1 on hard errors (i.e. address invalid); 0 is a legal value
255  *         and does NOT mean that the message was not transmitted (DV)
256  */
257 typedef ssize_t
258   (*GNUNET_TRANSPORT_TransmitFunction) (void *cls,
259                                         const struct GNUNET_PeerIdentity *
260                                         target,
261                                         const char *msgbuf,
262                                         size_t msgbuf_size,
263                                         uint32_t priority,
264                                         struct GNUNET_TIME_Relative timeout,
265                                         struct Session *session,
266                                         const void *addr,
267                                         size_t addrlen,
268                                         int force_address,
269                                         GNUNET_TRANSPORT_TransmitContinuation
270                                         cont, void *cont_cls);
271
272
273 /**
274  * Function that can be called to force a disconnect from the
275  * specified neighbour.  This should also cancel all previously
276  * scheduled transmissions.  Obviously the transmission may have been
277  * partially completed already, which is OK.  The plugin is supposed
278  * to close the connection (if applicable) and no longer call the
279  * transmit continuation(s).
280  *
281  * Finally, plugin MUST NOT call the services's receive function to
282  * notify the service that the connection to the specified target was
283  * closed after a getting this call.
284  *
285  * @param cls closure
286  * @param target peer for which the last transmission is
287  *        to be cancelled
288  */
289 typedef void
290   (*GNUNET_TRANSPORT_DisconnectFunction) (void *cls,
291                                           const struct GNUNET_PeerIdentity *
292                                           target);
293
294
295 /**
296  * Function called by the pretty printer for the resolved address for
297  * each human-readable address obtained.
298  *
299  * @param cls closure
300  * @param hostname one of the names for the host, NULL
301  *        on the last call to the callback
302  */
303 typedef void (*GNUNET_TRANSPORT_AddressStringCallback) (void *cls,
304                                                         const char *address);
305
306
307 /**
308  * Convert the transports address to a nice, human-readable
309  * format.
310  *
311  * @param cls closure
312  * @param name name of the transport that generated the address
313  * @param addr one of the addresses of the host, NULL for the last address
314  *        the specific address format depends on the transport
315  * @param addrlen length of the address
316  * @param numeric should (IP) addresses be displayed in numeric form?
317  * @param timeout after how long should we give up?
318  * @param asc function to call on each string
319  * @param asc_cls closure for asc
320  */
321 typedef void
322   (*GNUNET_TRANSPORT_AddressPrettyPrinter) (void *cls,
323                                             const char *type,
324                                             const void *addr,
325                                             size_t addrlen,
326                                             int numeric,
327                                             struct GNUNET_TIME_Relative
328                                             timeout,
329                                             GNUNET_TRANSPORT_AddressStringCallback
330                                             asc, void *asc_cls);
331
332
333 /**
334  * Another peer has suggested an address for this peer and transport
335  * plugin.  Check that this could be a valid address.  This function
336  * is not expected to 'validate' the address in the sense of trying to
337  * connect to it but simply to see if the binary format is technically
338  * legal for establishing a connection.
339  *
340  * @param addr pointer to the address, may be modified (slightly)
341  * @param addrlen length of addr
342  * @return GNUNET_OK if this is a plausible address for this peer
343  *         and transport, GNUNET_SYSERR if not
344  */
345 typedef int
346   (*GNUNET_TRANSPORT_CheckAddress) (void *cls,
347                                     void *addr, size_t addrlen);
348
349
350 /**
351  * Function called for a quick conversion of the binary address to
352  * a numeric address.  Note that the caller must not free the 
353  * address and that the next call to this function is allowed
354  * to override the address again.
355  *
356  * @param cls closure
357  * @param addr binary address
358  * @param addr_len length of the address
359  * @return string representing the same address 
360  */
361 typedef const char* (*GNUNET_TRANSPORT_AddressToString) (void *cls,
362                                                          const void *addr,
363                                                          size_t addrlen);
364
365
366 /**
367  * Each plugin is required to return a pointer to a struct of this
368  * type as the return value from its entry point.
369  */
370 struct GNUNET_TRANSPORT_PluginFunctions
371 {
372
373   /**
374    * Closure for all of the callbacks.
375    */
376   void *cls;
377
378   /**
379    * Function that the transport service will use to transmit data to
380    * another peer.  May be NULL for plugins that only support
381    * receiving data.  After this call, the plugin call the specified
382    * continuation with success or error before notifying us about the
383    * target having disconnected.
384    */
385   GNUNET_TRANSPORT_TransmitFunction send;
386
387   /**
388    * Function that can be used to force the plugin to disconnect from
389    * the given peer and cancel all previous transmissions (and their
390    * continuations).  Note that if the transport does not have
391    * sessions / persistent connections (for example, UDP), this
392    * function may very well do nothing.
393    */
394   GNUNET_TRANSPORT_DisconnectFunction disconnect;
395
396   /**
397    * Function to pretty-print addresses.  NOTE: this function is not
398    * yet used by transport-service, but will be used in the future
399    * once the transport-API has been completed.
400    */
401   GNUNET_TRANSPORT_AddressPrettyPrinter address_pretty_printer;
402
403   /**
404    * Function that will be called to check if a binary address
405    * for this plugin is well-formed.  If clearly needed, patch
406    * up information such as port numbers.
407    * FIXME: this API will likely change in the near future since
408    * it currently does not allow the size of the patched address
409    * to be different!
410    */
411   GNUNET_TRANSPORT_CheckAddress check_address;
412
413
414   /**
415    * Function that will be called to convert a binary address
416    * to a string (numeric conversion only).
417    */
418   GNUNET_TRANSPORT_AddressToString address_to_string;
419
420 };
421
422
423 #endif