- make sure connection is destroyed and no use-after-free happens
[oweals/gnunet.git] / src / cadet / gnunet-service-cadet_peer.h
1 /*
2      This file is part of GNUnet.
3      (C) 2013 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 cadet/gnunet-service-cadet_peer.h
23  * @brief cadet service; dealing with remote peers
24  * @author Bartlomiej Polot
25  *
26  * All functions in this file should use the prefix GMP (Gnunet Cadet Peer)
27  */
28
29 #ifndef GNUNET_SERVICE_CADET_PEER_H
30 #define GNUNET_SERVICE_CADET_PEER_H
31
32 #ifdef __cplusplus
33 extern "C"
34 {
35 #if 0                           /* keep Emacsens' auto-indent happy */
36 }
37 #endif
38 #endif
39
40 #include "platform.h"
41 #include "gnunet_util_lib.h"
42
43 /**
44  * Struct containing all information regarding a given peer
45  */
46 struct CadetPeer;
47
48 /**
49  * Struct containing info about a queued transmission to this peer
50  */
51 struct CadetPeerQueue;
52
53 #include "gnunet-service-cadet_connection.h"
54
55 /**
56  * Callback called when a queued message is sent.
57  *
58  * @param cls Closure.
59  * @param c Connection this message was on.
60  * @param sent Was it really sent? (Could have been canceled)
61  * @param type Type of message sent.
62  * @param pid Packet ID, or 0 if not applicable (create, destroy, etc).
63  * @param fwd Was this a FWD going message?
64  * @param size Size of the message.
65  * @param wait Time spent waiting for core (only the time for THIS message)
66  *
67  * @return #GNUNET_YES if connection was destroyed, #GNUNET_NO otherwise.
68  */
69 typedef int (*GCP_sent) (void *cls,
70                           struct CadetConnection *c, int sent,
71                           uint16_t type, uint32_t pid, int fwd, size_t size,
72                           struct GNUNET_TIME_Relative wait);
73
74 /******************************************************************************/
75 /********************************    API    ***********************************/
76 /******************************************************************************/
77
78 /**
79  * Initialize peer subsystem.
80  *
81  * @param c Configuration.
82  */
83 void
84 GCP_init (const struct GNUNET_CONFIGURATION_Handle *c);
85
86 /**
87  * Shut down the peer subsystem.
88  */
89 void
90 GCP_shutdown (void);
91
92
93 /**
94  * Retrieve the CadetPeer stucture associated with the peer, create one
95  * and insert it in the appropriate structures if the peer is not known yet.
96  *
97  * @param peer_id Full identity of the peer.
98  *
99  * @return Existing or newly created peer structure.
100  */
101 struct CadetPeer *
102 GCP_get (const struct GNUNET_PeerIdentity *peer_id);
103
104
105 /**
106  * Retrieve the CadetPeer stucture associated with the peer, create one
107  * and insert it in the appropriate structures if the peer is not known yet.
108  *
109  * @param peer Short identity of the peer.
110  *
111  * @return Existing or newly created peer structure.
112  */
113 struct CadetPeer *
114 GCP_get_short (const GNUNET_PEER_Id peer);
115
116 /**
117  * Try to establish a new connection to this peer (in its tunnel).
118  * If the peer doesn't have any path to it yet, try to get one.
119  * If the peer already has some path, send a CREATE CONNECTION towards it.
120  *
121  * @param peer Peer to connect to.
122  */
123 void
124 GCP_connect (struct CadetPeer *peer);
125
126 /**
127  * Free a transmission that was already queued with all resources
128  * associated to the request.
129  *
130  * If connection was marked to be destroyed, and this was the last queued
131  * message on it, the connection will be free'd as a result.
132  *
133  * @param queue Queue handler to cancel.
134  * @param clear_cls Is it necessary to free associated cls?
135  * @param sent Was it really sent? (Could have been canceled)
136  * @param pid PID, if relevant (was sent and was a payload message).
137  *
138  * @return #GNUNET_YES if connection was destroyed as a result,
139  *         #GNUNET_NO otherwise.
140  */
141 int
142 GCP_queue_destroy (struct CadetPeerQueue *queue, int clear_cls,
143                    int sent, uint32_t pid);
144
145 /**
146  * @brief Queue and pass message to core when possible.
147  *
148  * @param peer Peer towards which to queue the message.
149  * @param cls Closure (@c type dependant). It will be used by queue_send to
150  *            build the message to be sent if not already prebuilt.
151  * @param type Type of the message, 0 for a raw message.
152  * @param size Size of the message.
153  * @param c Connection this message belongs to (cannot be NULL).
154  * @param fwd Is this a message going root->dest? (FWD ACK are NOT FWD!)
155  * @param cont Continuation to be called once CORE has taken the message.
156  * @param cont_cls Closure for @c cont.
157  *
158  * @return Handle to cancel the message before it is sent. Once cont is called
159  *         message has been sent and therefore the handle is no longer valid.
160  */
161 struct CadetPeerQueue *
162 GCP_queue_add (struct CadetPeer *peer, void *cls, uint16_t type,
163                uint16_t payload_type, uint32_t payload_id,
164                size_t size, struct CadetConnection *c, int fwd,
165                GCP_sent cont, void *cont_cls);
166
167 /**
168  * Cancel all queued messages to a peer that belong to a certain connection.
169  *
170  * @param peer Peer towards whom to cancel.
171  * @param c Connection whose queued messages to cancel. Might be destroyed by
172  *          the sent continuation call.
173  */
174 void
175 GCP_queue_cancel (struct CadetPeer *peer, struct CadetConnection *c);
176
177 /**
178  * Get the first message for a connection and unqueue it.
179  *
180  * Only tunnel (or higher) level messages are unqueued. Connection specific
181  * messages are silently destroyed upon encounter.
182  *
183  * @param peer Neighboring peer.
184  * @param c Connection.
185  * @param destroyed[out] Was the connection destroyed as a result?.
186  *
187  * @return First message for this connection.
188  */
189 struct GNUNET_MessageHeader *
190 GCP_connection_pop (struct CadetPeer *peer,
191                     struct CadetConnection *c,
192                     int *destroyed);
193
194 /**
195  * Unlock a possibly locked queue for a connection.
196  *
197  * If there is a message that can be sent on this connection, call core for it.
198  * Otherwise (if core transmit is already called or there is no sendable
199  * message) do nothing.
200  *
201  * @param peer Peer who keeps the queue.
202  * @param c Connection whose messages to unlock.
203  */
204 void
205 GCP_queue_unlock (struct CadetPeer *peer, struct CadetConnection *c);
206
207 /**
208  * Set tunnel.
209  *
210  * @param peer Peer.
211  * @param t Tunnel.
212  */
213 void
214 GCP_set_tunnel (struct CadetPeer *peer, struct CadetTunnel *t);
215
216 /**
217  * Check whether there is a direct (core level)  connection to peer.
218  *
219  * @param peer Peer to check.
220  *
221  * @return #GNUNET_YES if there is a direct connection.
222  */
223 int
224 GCP_is_neighbor (const struct CadetPeer *peer);
225
226 /**
227  * Create and initialize a new tunnel towards a peer, in case it has none.
228  *
229  * Does not generate any traffic, just creates the local data structures.
230  *
231  * @param peer Peer towards which to create the tunnel.
232  */
233 void
234 GCP_add_tunnel (struct CadetPeer *peer);
235
236 /**
237  * Add a connection to a neighboring peer.
238  *
239  * Store that the peer is the first hop of the connection in one
240  * direction and that on peer disconnect the connection must be
241  * notified and destroyed, for it will no longer be valid.
242  *
243  * @param peer Peer to add connection to.
244  * @param c Connection to add.
245  *
246  * @return GNUNET_OK on success.
247  */
248 int
249 GCP_add_connection (struct CadetPeer *peer, struct CadetConnection *c);
250
251 /**
252  * Add the path to the peer and update the path used to reach it in case this
253  * is the shortest.
254  *
255  * @param peer Destination peer to add the path to.
256  * @param path New path to add. Last peer must be the peer in arg 1.
257  *             Path will be either used of freed if already known.
258  * @param trusted Do we trust that this path is real?
259  *
260  * @return path if path was taken, pointer to existing duplicate if exists
261  *         NULL on error.
262  */
263 struct CadetPeerPath *
264 GCP_add_path (struct CadetPeer *peer, struct CadetPeerPath *p, int trusted);
265
266 /**
267  * Add the path to the origin peer and update the path used to reach it in case
268  * this is the shortest.
269  * The path is given in peer_info -> destination, therefore we turn the path
270  * upside down first.
271  *
272  * @param peer Peer to add the path to, being the origin of the path.
273  * @param path New path to add after being inversed.
274  *             Path will be either used or freed.
275  * @param trusted Do we trust that this path is real?
276  *
277  * @return path if path was taken, pointer to existing duplicate if exists
278  *         NULL on error.
279  */
280 struct CadetPeerPath *
281 GCP_add_path_to_origin (struct CadetPeer *peer,
282                         struct CadetPeerPath *path,
283                         int trusted);
284
285 /**
286  * Adds a path to the info of all the peers in the path
287  *
288  * @param p Path to process.
289  * @param confirmed Whether we know if the path works or not.
290  */
291 void
292 GCP_add_path_to_all (const struct CadetPeerPath *p, int confirmed);
293
294 /**
295  * Remove any path to the peer that has the extact same peers as the one given.
296  *
297  * @param peer Peer to remove the path from.
298  * @param path Path to remove. Is always destroyed .
299  */
300 void
301 GCP_remove_path (struct CadetPeer *peer, struct CadetPeerPath *path);
302
303 /**
304  * Remove a connection from a neighboring peer.
305  *
306  * @param peer Peer to remove connection from.
307  * @param c Connection to remove.
308  *
309  * @return GNUNET_OK on success.
310  */
311 int
312 GCP_remove_connection (struct CadetPeer *peer, const struct CadetConnection *c);
313
314 /**
315  * Start the DHT search for new paths towards the peer: we don't have
316  * enough good connections.
317  *
318  * @param peer Destination peer.
319  */
320 void
321 GCP_start_search (struct CadetPeer *peer);
322
323 /**
324  * Stop the DHT search for new paths towards the peer: we already have
325  * enough good connections.
326  *
327  * @param peer Destination peer.
328  */
329 void
330 GCP_stop_search (struct CadetPeer *peer);
331
332 /**
333  * Get the Full ID of a peer.
334  *
335  * @param peer Peer to get from.
336  *
337  * @return Full ID of peer.
338  */
339 const struct GNUNET_PeerIdentity *
340 GCP_get_id (const struct CadetPeer *peer);
341
342 /**
343  * Get the Short ID of a peer.
344  *
345  * @param peer Peer to get from.
346  *
347  * @return Short ID of peer.
348  */
349 GNUNET_PEER_Id
350 GCP_get_short_id (const struct CadetPeer *peer);
351
352 /**
353  * Get the tunnel towards a peer.
354  *
355  * @param peer Peer to get from.
356  *
357  * @return Tunnel towards peer.
358  */
359 struct CadetTunnel *
360 GCP_get_tunnel (const struct CadetPeer *peer);
361
362 /**
363  * Set the hello message.
364  *
365  * @param peer Peer whose message to set.
366  * @param hello Hello message.
367  */
368 void
369 GCP_set_hello (struct CadetPeer *peer, const struct GNUNET_HELLO_Message *hello);
370
371 /**
372  * Get the hello message.
373  *
374  * @param peer Peer whose message to get.
375  *
376  * @return Hello message.
377  */
378 struct GNUNET_HELLO_Message *
379 GCP_get_hello (struct CadetPeer *peer);
380
381
382 /**
383  * Try to connect to a peer on TRANSPORT level.
384  *
385  * @param peer Peer to whom to connect.
386  */
387 void
388 GCP_try_connect (struct CadetPeer *peer);
389
390 /**
391  * Notify a peer that a link between two other peers is broken. If any path
392  * used that link, eliminate it.
393  *
394  * @param peer Peer affected by the change.
395  * @param peer1 Peer whose link is broken.
396  * @param peer2 Peer whose link is broken.
397  */
398 void
399 GCP_notify_broken_link (struct CadetPeer *peer,
400                         struct GNUNET_PeerIdentity *peer1,
401                         struct GNUNET_PeerIdentity *peer2);
402
403 /**
404  * Count the number of known paths toward the peer.
405  *
406  * @param peer Peer to get path info.
407  *
408  * @return Number of known paths.
409  */
410 unsigned int
411 GCP_count_paths (const struct CadetPeer *peer);
412
413 /**
414  * Iterate all known peers.
415  *
416  * @param iter Iterator.
417  * @param cls Closure for @c iter.
418  */
419 void
420 GCP_iterate_all (GNUNET_CONTAINER_PeerMapIterator iter, void *cls);
421
422 /**
423  * Get the static string for a peer ID.
424  *
425  * @param peer Peer.
426  *
427  * @return Static string for it's ID.
428  */
429 const char *
430 GCP_2s (const struct CadetPeer *peer);
431
432 /**
433  * Log all kinds of info about a peer.
434  *
435  * @param peer Peer.
436  */
437 void
438 GCP_debug (const struct CadetPeer *p, enum GNUNET_ErrorType level);
439
440
441 #if 0                           /* keep Emacsens' auto-indent happy */
442 {
443 #endif
444 #ifdef __cplusplus
445 }
446 #endif
447
448 /* ifndef GNUNET_CADET_SERVICE_PEER_H */
449 #endif
450 /* end of gnunet-cadet-service_peer.h */