- move connection initialization to GMC_new
[oweals/gnunet.git] / src / mesh / gnunet-service-mesh_connection.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 mesh/gnunet-service-mesh_connection.h
23  * @brief mesh service; dealing with connections
24  * @author Bartlomiej Polot
25  *
26  * All functions in this file should use the prefix GMC (Gnunet Mesh Connection)
27  */
28
29 #ifndef GNUNET_SERVICE_MESH_CONNECTION_H
30 #define GNUNET_SERVICE_MESH_CONNECTION_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 "gnunet_util_lib.h"
41
42 #include "gnunet-service-mesh_channel.h"
43
44 /**
45  * Struct containing all information regarding a connection to a peer.
46  */
47 struct MeshConnection;
48
49
50
51
52 /**
53  * Core handler for connection creation.
54  *
55  * @param cls Closure (unused).
56  * @param peer Sender (neighbor).
57  * @param message Message.
58  *
59  * @return GNUNET_OK to keep the connection open,
60  *         GNUNET_SYSERR to close it (signal serious error)
61  */
62 int
63 GMC_handle_create (void *cls, const struct GNUNET_PeerIdentity *peer,
64                    const struct GNUNET_MessageHeader *message);
65
66 /**
67  * Core handler for path confirmations.
68  *
69  * @param cls closure
70  * @param message message
71  * @param peer peer identity this notification is about
72  *
73  * @return GNUNET_OK to keep the connection open,
74  *         GNUNET_SYSERR to close it (signal serious error)
75  */
76 int
77 GMC_handle_confirm (void *cls, const struct GNUNET_PeerIdentity *peer,
78                     const struct GNUNET_MessageHeader *message);
79
80 /**
81  * Core handler for notifications of broken paths
82  *
83  * @param cls Closure (unused).
84  * @param peer Peer identity of sending neighbor.
85  * @param message Message.
86  *
87  * @return GNUNET_OK to keep the connection open,
88  *         GNUNET_SYSERR to close it (signal serious error)
89  */
90 int
91 GMC_handle_broken (void *cls, const struct GNUNET_PeerIdentity *peer,
92                    const struct GNUNET_MessageHeader *message);
93
94 /**
95  * Core handler for tunnel destruction
96  *
97  * @param cls Closure (unused).
98  * @param peer Peer identity of sending neighbor.
99  * @param message Message.
100  *
101  * @return GNUNET_OK to keep the connection open,
102  *         GNUNET_SYSERR to close it (signal serious error)
103  */
104 int
105 GMC_handle_destroy (void *cls, const struct GNUNET_PeerIdentity *peer,
106                     const struct GNUNET_MessageHeader *message);
107
108 /**
109  * Core handler for mesh network traffic going orig->dest.
110  *
111  * @param cls Closure (unused).
112  * @param message Message received.
113  * @param peer Peer who sent the message.
114  *
115  * @return GNUNET_OK to keep the connection open,
116  *         GNUNET_SYSERR to close it (signal serious error)
117  */
118 int
119 GMC_handle_fwd (void *cls, const struct GNUNET_PeerIdentity *peer,
120                 const struct GNUNET_MessageHeader *message);
121
122
123 /**
124  * Core handler for mesh network traffic going dest->orig.
125  *
126  * @param cls Closure (unused).
127  * @param message Message received.
128  * @param peer Peer who sent the message.
129  *
130  * @return GNUNET_OK to keep the connection open,
131  *         GNUNET_SYSERR to close it (signal serious error)
132  */
133 int
134 GMC_handle_bck (void *cls, const struct GNUNET_PeerIdentity *peer,
135                 const struct GNUNET_MessageHeader *message);
136
137 /**
138  * Core handler for mesh network traffic point-to-point acks.
139  *
140  * @param cls closure
141  * @param message message
142  * @param peer peer identity this notification is about
143  *
144  * @return GNUNET_OK to keep the connection open,
145  *         GNUNET_SYSERR to close it (signal serious error)
146  */
147 int
148 GMC_handle_ack (void *cls, const struct GNUNET_PeerIdentity *peer,
149                 const struct GNUNET_MessageHeader *message);
150
151 /**
152  * Core handler for mesh network traffic point-to-point ack polls.
153  *
154  * @param cls closure
155  * @param message message
156  * @param peer peer identity this notification is about
157  *
158  * @return GNUNET_OK to keep the connection open,
159  *         GNUNET_SYSERR to close it (signal serious error)
160  */
161 int
162 GMC_handle_poll (void *cls, const struct GNUNET_PeerIdentity *peer,
163                  const struct GNUNET_MessageHeader *message);
164
165 /**
166  * Core handler for mesh keepalives.
167  *
168  * @param cls closure
169  * @param message message
170  * @param peer peer identity this notification is about
171  * @return GNUNET_OK to keep the connection open,
172  *         GNUNET_SYSERR to close it (signal serious error)
173  *
174  * TODO: Check who we got this from, to validate route.
175  */
176 int
177 GMC_handle_keepalive (void *cls, const struct GNUNET_PeerIdentity *peer,
178                       const struct GNUNET_MessageHeader *message);
179
180 /**
181  * Initialize the connections subsystem
182  *
183  * @param c Configuration handle.
184  */
185 void
186 GMC_init (const struct GNUNET_CONFIGURATION_Handle *c);
187
188 /**
189  * Shut down the connections subsystem.
190  */
191 void
192 GMC_shutdown (void);
193
194 /**
195  * Create a connection.
196  *
197  * @param cid Connection ID (either created locally or imposed remotely).
198  * @param t Tunnel this connection belongs to (or NULL);
199  * @param p Path this connection has to use.
200  * @param own_pos Own position in the @c p path.
201  */
202 struct MeshConnection *
203 GMC_new (const struct GNUNET_HashCode *cid,
204          struct MeshTunnel2 *t,
205          struct MeshPeerPath *p,
206          unsigned int own_pos);
207
208 /**
209  * Connection is no longer needed: destroy it and remove from tunnel.
210  *
211  * @param c Connection to destroy.
212  */
213 void
214 GMC_destroy (struct MeshConnection *c);
215
216 /**
217  * Get the connection ID.
218  *
219  * @param c Connection to get the ID from.
220  *
221  * @return ID of the connection.
222  */
223 const struct GNUNET_HashCode *
224 GMC_get_id (const struct MeshConnection *c);
225
226 /**
227  * Count connections in a DLL.
228  */
229 unsigned int
230 GMC_count (const struct MeshConnection *head);
231
232 /**
233  * Send FWD keepalive packets for a connection.
234  *
235  * @param cls Closure (connection for which to send the keepalive).
236  * @param tc Notification context.
237  */
238 void
239 GMC_fwd_keepalive (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
240
241 /**
242  * Send BCK keepalive packets for a connection.
243  *
244  * @param cls Closure (connection for which to send the keepalive).
245  * @param tc Notification context.
246  */
247 void
248 GMC_bck_keepalive (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
249
250
251 /**
252  * Change the tunnel state.
253  *
254  * @param c Connection whose state to change.
255  * @param state New state.
256  */
257 void
258 GMC_change_state (struct MeshConnection* c, enum MeshConnectionState state);
259
260 /**
261  * Notify other peers on a connection of a broken link. Mark connections
262  * to destroy after all traffic has been sent.
263  *
264  * @param c Connection on which there has been a disconnection.
265  * @param peer Peer that disconnected.
266  * @param my_full_id My ID (to send to other peers).
267  */
268 void
269 GMC_notify_broken (struct MeshConnection *c,
270                    struct MeshPeer *peer,
271                    struct GNUNET_PeerIdentity *my_full_id);
272
273 /**
274  * @brief Queue and pass message to core when possible.
275  *
276  * @param cls Closure (@c type dependant). It will be used by queue_send to
277  *            build the message to be sent if not already prebuilt.
278  * @param type Type of the message, 0 for a raw message.
279  * @param size Size of the message.
280  * @param c Connection this message belongs to (cannot be NULL).
281  * @param ch Channel this message belongs to, if applicable (otherwise NULL).
282  * @param fwd Is this a message going root->dest? (FWD ACK are NOT FWD!)
283  */
284 void
285 GMC_queue_add (void* cls,
286                uint16_t type,
287                size_t size,
288                struct MeshConnection* c,
289                struct MeshChannel* ch,
290                int fwd);
291
292
293 /**
294  * Free a transmission that was already queued with all resources
295  * associated to the request.
296  *
297  * @param queue Queue handler to cancel.
298  * @param clear_cls Is it necessary to free associated cls?
299  */
300 void
301 GMC_queue_destroy (struct MeshPeerQueue *queue, int clear_cls);
302
303
304 /**
305  * Core callback to write a queued packet to core buffer
306  *
307  * @param cls Closure (peer info).
308  * @param size Number of bytes available in buf.
309  * @param buf Where the to write the message.
310  *
311  * @return number of bytes written to buf
312  */
313 size_t
314 GMC_queue_send (void *cls, size_t size, void *buf);
315
316
317
318 /**
319  * Is this peer the first one on the connection?
320  *
321  * @param c Connection.
322  * @param fwd Is this about fwd traffic?
323  *
324  * @return GNUNET_YES if origin, GNUNET_NO if relay/terminal.
325  */
326 int
327 GMC_is_origin (struct MeshConnection *c, int fwd);
328
329 /**
330  * Is this peer the last one on the connection?
331  *
332  * @param c Connection.
333  * @param fwd Is this about fwd traffic?
334  *            Note that the ROOT is the terminal for BCK traffic!
335  *
336  * @return GNUNET_YES if terminal, GNUNET_NO if relay/origin.
337  */
338 int
339 GMC_is_terminal (struct MeshConnection *c, int fwd);
340
341 /**
342  * Sends an already built message on a connection, properly registering
343  * all used resources.
344  *
345  * @param message Message to send. Function makes a copy of it.
346  *                If message is not hop-by-hop, decrements TTL of copy.
347  * @param c Connection on which this message is transmitted.
348  * @param ch Channel on which this message is transmitted, or NULL.
349  * @param fwd Is this a fwd message?
350  */
351 void
352 GMC_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
353                            struct MeshConnection *c,
354                            struct MeshChannel *ch,
355                            int fwd);
356
357
358 #if 0                           /* keep Emacsens' auto-indent happy */
359 {
360 #endif
361 #ifdef __cplusplus
362 }
363 #endif
364
365 /* ifndef GNUNET_SERVICE_MESH_CONNECTION_H */
366 #endif
367 /* end of gnunet-service-mesh_connection.h */