-use GPLv3+ consistently
[oweals/gnunet.git] / src / set / gnunet-service-set.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 set/gnunet-service-set.h
23  * @brief common components for the implementation the different set operations
24  * @author Florian Dold
25  */
26
27 #ifndef GNUNET_SERVICE_SET_H_PRIVATE
28 #define GNUNET_SERVICE_SET_H_PRIVATE
29
30 #include "platform.h"
31 #include "gnunet_common.h"
32 #include "gnunet_protocols.h"
33 #include "gnunet_applications.h"
34 #include "gnunet_util_lib.h"
35 #include "gnunet_core_service.h"
36 #include "gnunet_mesh_service.h"
37 #include "gnunet_set_service.h"
38 #include "set.h"
39
40
41 /**
42  * Implementation-specific set state.
43  * Used as opaque pointer, and specified further
44  * in the respective implementation.
45  */
46 struct SetState;
47
48
49 /**
50  * Implementation-specific set operation.
51  * Used as opaque pointer, and specified further
52  * in the respective implementation.
53  */
54 struct OperationState;
55
56
57 /* forward declarations */
58 struct Set;
59 struct TunnelContext;
60 struct ElementEntry;
61
62
63 /**
64  * Detail information about an operation.
65  */
66 struct OperationSpecification
67 {
68   /**
69    * The type of the operation.
70    */
71   enum GNUNET_SET_OperationType operation;
72
73   /**
74    * The remove peer we evaluate the operation with
75    */
76   struct GNUNET_PeerIdentity peer;
77
78   /**
79    * Application ID for the operation, used to distinguish
80    * multiple operations of the same type with the same peer.
81    */
82   struct GNUNET_HashCode app_id;
83
84   /**
85    * Context message, may be NULL.
86    */
87   struct GNUNET_MessageHeader *context_msg;
88
89   /**
90    * Salt to use for the operation.
91    */
92   uint32_t salt;
93
94   /**
95    * ID used to identify responses to a client.
96    */
97   uint32_t client_request_id;
98
99   /**
100    * Set associated with the operation, NULL until the spec has been associated
101    * with a set.
102    */
103   struct Set *set;
104 };
105
106
107
108
109 /**
110  * Signature of functions that create the implementation-specific
111  * state for a set supporting a specific operation.
112  *
113  * @return a set state specific to the supported operation
114  */
115 typedef struct SetState *(*CreateImpl) (void);
116
117
118 /**
119  * Signature of functions that implement the add/remove functionality
120  * for a set supporting a specific operation.
121  *
122  * @param set implementation-specific set state
123  * @param msg element message from the client
124  */
125 typedef void (*AddRemoveImpl) (struct SetState *state, struct ElementEntry *ee);
126
127
128 /**
129  * Signature of functions that handle disconnection
130  * of the remote peer.
131  *
132  * @param op the set operation, contains implementation-specific data
133  */
134 typedef void (*PeerDisconnectImpl) (struct OperationState *op);
135
136
137 /**
138  * Signature of functions that implement the destruction of the
139  * implementation-specific set state.
140  *
141  * @param state the set state, contains implementation-specific data
142  */
143 typedef void (*DestroySetImpl) (struct SetState *state);
144
145
146 /**
147  * Signature of functions that implement the creation of set operations
148  * (currently evaluate and accept).
149  *
150  * @param spec specification of the set operation to be created
151  * @param tunnel the tunnel with the other peer
152  * @param tc tunnel context
153  */
154 typedef void (*OpCreateImpl) (struct OperationSpecification *spec,
155                               struct GNUNET_MESH_Tunnel *tunnel,
156                               struct TunnelContext *tc);
157
158
159 /**
160  * Signature of functions that implement the message handling for
161  * the different set operations.
162  *
163  * @param op operation state
164  * @param msg received message
165  * @return GNUNET_OK on success, GNUNET_SYSERR to
166  *         destroy the operation and the tunnel
167  */
168 typedef int (*MsgHandlerImpl) (struct OperationState *op,
169                                const struct GNUNET_MessageHeader *msg);
170
171 typedef void (*CancelImpl) (struct SetState *set,
172                             uint32_t request_id);
173
174
175 /**
176  * Signature of functions that implement sending all the set's
177  * elements to the client.
178  *
179  * @param set set that should be iterated over
180  */
181 typedef void (*IterateImpl) (struct Set *set);
182
183
184 /**
185  * Dispatch table for a specific set operation.
186  * Every set operation has to implement the callback
187  * in this struct.
188  */
189 struct SetVT
190 {
191   /**
192    * Callback for the set creation.
193    */
194   CreateImpl create;
195
196   /**
197    * Callback for element insertion
198    */
199   AddRemoveImpl add;
200
201   /**
202    * Callback for element removal.
203    */
204   AddRemoveImpl remove;
205
206   /**
207    * Callback for accepting a set operation request
208    */
209   OpCreateImpl accept;
210
211   /**
212    * Callback for starting evaluation with a remote peer.
213    */
214   OpCreateImpl evaluate;
215
216   /**
217    * Callback for destruction of the set state.
218    */
219   DestroySetImpl destroy_set;
220
221   /**
222    * Callback for handling operation-specific messages.
223    */
224   MsgHandlerImpl msg_handler;
225
226   /**
227    * Callback for handling the remote peer's
228    * disconnect.
229    */
230   PeerDisconnectImpl peer_disconnect;
231
232   /**
233    * Callback for canceling an operation by
234    * its ID.
235    */
236   CancelImpl cancel;
237
238   /**
239    * Callback for iterating over all set elements.
240    */
241   IterateImpl iterate;
242 };
243
244
245 /**
246  * Information about an element element in the set.
247  * All elements are stored in a hash-table
248  * from their hash-code to their 'struct Element',
249  * so that the remove and add operations are reasonably
250  * fast.
251  */
252 struct ElementEntry
253 {
254   /**
255    * The actual element. The data for the element
256    * should be allocated at the end of this struct.
257    */
258   struct GNUNET_SET_Element element;
259
260   /**
261    * Hash of the element.
262    * Will be used to derive the different IBF keys
263    * for different salts.
264    */
265   struct GNUNET_HashCode element_hash;
266
267   /**
268    * Generation the element was added by the client.
269    * Operations of earlier generations will not consider the element.
270    */
271   unsigned int generation_added;
272
273   /**
274    * GNUNET_YES if the element has been removed in some generation.
275    */
276   int removed;
277
278   /**
279    * Generation the element was removed by the client. 
280    * Operations of later generations will not consider the element.
281    * Only valid if is_removed is GNUNET_YES.
282    */
283   unsigned int generation_removed;
284
285   /**
286    * GNUNET_YES if the element is a remote element, and does not belong
287    * to the operation's set.
288    */
289   int remote;
290 };
291
292
293 /**
294  * A set that supports a specific operation
295  * with other peers.
296  */
297 struct Set
298 {
299   /**
300    * Client that owns the set.
301    * Only one client may own a set.
302    */
303   struct GNUNET_SERVER_Client *client;
304
305   /**
306    * Message queue for the client
307    */
308   struct GNUNET_MQ_Handle *client_mq;
309
310   /**
311    * Type of operation supported for this set
312    */
313   enum GNUNET_SET_OperationType operation;
314
315   /**
316    * Virtual table for this set.
317    * Determined by the operation type of this set.
318    */
319   const struct SetVT *vt;
320
321   /**
322    * Sets are held in a doubly linked list.
323    */
324   struct Set *next;
325
326   /**
327    * Sets are held in a doubly linked list.
328    */
329   struct Set *prev;
330
331   /**
332    * Implementation-specific state.
333    */
334   struct SetState *state;
335
336   /**
337    * Current state of iterating elements for the client.
338    * NULL if we are not currently iterating.
339    */
340   struct GNUNET_CONTAINER_MultiHashMapIterator *iter;
341
342   /**
343    * Maps 'struct GNUNET_HashCode' to 'struct ElementEntry'.
344    */
345   struct GNUNET_CONTAINER_MultiHashMap *elements;
346
347   /**
348    * Current generation, that is, number of
349    * previously executed operations on this set
350    */
351   unsigned int current_generation;
352 };
353
354
355 /**
356  * Information about a tunnel we are connected to.
357  * Used as tunnel context with mesh.
358  */
359 struct TunnelContext
360 {
361   /**
362    * V-Table for the operation belonging
363    * to the tunnel contest.
364    */
365   const struct SetVT *vt;
366
367   /**
368    * Implementation-specific operation state.
369    */
370   struct OperationState *op;
371 };
372
373
374 /**
375  * Get the table with implementing functions for
376  * set union.
377  */
378 const struct SetVT *
379 _GSS_union_vt (void);
380
381
382 #endif