fix misc typos
[oweals/gnunet.git] / src / set / gnunet-service-set.h
1 /*
2       This file is part of GNUnet
3       Copyright (C) 2013, 2014 GNUnet e.V.
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., 51 Franklin Street, Fifth Floor,
18       Boston, MA 02110-1301, USA.
19 */
20 /**
21  * @file set/gnunet-service-set.h
22  * @brief common components for the implementation the different set operations
23  * @author Florian Dold
24  * @author Christian Grothoff
25  */
26 #ifndef GNUNET_SERVICE_SET_H_PRIVATE
27 #define GNUNET_SERVICE_SET_H_PRIVATE
28
29 #include "platform.h"
30 #include "gnunet_util_lib.h"
31 #include "gnunet_protocols.h"
32 #include "gnunet_applications.h"
33 #include "gnunet_core_service.h"
34 #include "gnunet_cadet_service.h"
35 #include "gnunet_set_service.h"
36 #include "set.h"
37
38
39 /**
40  * Implementation-specific set state.  Used as opaque pointer, and
41  * specified further in the respective implementation.
42  */
43 struct SetState;
44
45 /**
46  * Implementation-specific set operation.  Used as opaque pointer, and
47  * specified further in the respective implementation.
48  */
49 struct OperationState;
50
51 /**
52  * A set that supports a specific operation with other peers.
53  */
54 struct Set;
55
56 /**
57  * Information about an element element in the set.  All elements are
58  * stored in a hash-table from their hash-code to their 'struct
59  * Element', so that the remove and add operations are reasonably
60  * fast.
61  */
62 struct ElementEntry;
63
64 /**
65  * Operation context used to execute a set operation.
66  */
67 struct Operation;
68
69
70 /**
71  * Detail information about an operation.
72  */
73 struct OperationSpecification
74 {
75
76   /**
77    * The remove peer we evaluate the operation with.
78    */
79   struct GNUNET_PeerIdentity peer;
80
81   /**
82    * Application ID for the operation, used to distinguish
83    * multiple operations of the same type with the same peer.
84    */
85   struct GNUNET_HashCode app_id;
86
87   /**
88    * Context message, may be NULL.
89    */
90   struct GNUNET_MessageHeader *context_msg;
91
92   /**
93    * Set associated with the operation, NULL until the spec has been
94    * associated with a set.
95    */
96   struct Set *set;
97
98   /**
99    * Salt to use for the operation.
100    */
101   uint32_t salt;
102
103   /**
104    * Remote peers element count
105    */
106   uint32_t remote_element_count;
107
108   /**
109    * ID used to identify an operation between service and client
110    */
111   uint32_t client_request_id;
112
113   /**
114    * The type of the operation.
115    */
116   enum GNUNET_SET_OperationType operation;
117
118   /**
119    * When are elements sent to the client, and which elements are sent?
120    */
121   enum GNUNET_SET_ResultMode result_mode;
122 };
123
124
125 /**
126  * Signature of functions that create the implementation-specific
127  * state for a set supporting a specific operation.
128  *
129  * @return a set state specific to the supported operation, NULL on error
130  */
131 typedef struct SetState *
132 (*CreateImpl) (void);
133
134
135 /**
136  * Signature of functions that implement the add/remove functionality
137  * for a set supporting a specific operation.
138  *
139  * @param set implementation-specific set state
140  * @param ee element message from the client
141  */
142 typedef void
143 (*AddRemoveImpl) (struct SetState *state,
144                   struct ElementEntry *ee);
145
146
147 /**
148  * Signature of functions that handle disconnection of the remote
149  * peer.
150  *
151  * @param op the set operation, contains implementation-specific data
152  */
153 typedef void
154 (*PeerDisconnectImpl) (struct Operation *op);
155
156
157 /**
158  * Signature of functions that implement the destruction of the
159  * implementation-specific set state.
160  *
161  * @param state the set state, contains implementation-specific data
162  */
163 typedef void
164 (*DestroySetImpl) (struct SetState *state);
165
166
167 /**
168  * Signature of functions that implement accepting a set operation.
169  *
170  * @param op operation that is created by accepting the operation,
171  *        should be initialized by the implementation
172  */
173 typedef void
174 (*OpAcceptImpl) (struct Operation *op);
175
176
177 /**
178  * Signature of functions that implement starting the evaluation of
179  * set operations.
180  *
181  * @param op operation that is created, should be initialized to
182  *        begin the evaluation
183  * @param opaque_context message to be transmitted to the listener
184  *        to convince him to accept, may be NULL
185  */
186 typedef void
187 (*OpEvaluateImpl) (struct Operation *op,
188                    const struct GNUNET_MessageHeader *opaque_context);
189
190
191 /**
192  * Signature of functions that implement the message handling for
193  * the different set operations.
194  *
195  * @param op operation state
196  * @param msg received message
197  * @return #GNUNET_OK on success, #GNUNET_SYSERR to
198  *         destroy the operation and the tunnel
199  */
200 typedef int
201 (*MsgHandlerImpl) (struct Operation *op,
202                    const struct GNUNET_MessageHeader *msg);
203
204
205 /**
206  * Signature of functions that implement operation cancellation
207  *
208  * @param op operation state
209  */
210 typedef void
211 (*CancelImpl) (struct Operation *op);
212
213
214 typedef struct SetState *
215 (*CopyStateImpl) (struct Set *op);
216
217
218 /**
219  * Dispatch table for a specific set operation.  Every set operation
220  * has to implement the callback in this struct.
221  */
222 struct SetVT
223 {
224   /**
225    * Callback for the set creation.
226    */
227   CreateImpl create;
228
229   /**
230    * Callback for element insertion
231    */
232   AddRemoveImpl add;
233
234   /**
235    * Callback for element removal.
236    */
237   AddRemoveImpl remove;
238
239   /**
240    * Callback for accepting a set operation request
241    */
242   OpAcceptImpl accept;
243
244   /**
245    * Callback for starting evaluation with a remote peer.
246    */
247   OpEvaluateImpl evaluate;
248
249   /**
250    * Callback for destruction of the set state.
251    */
252   DestroySetImpl destroy_set;
253
254   /**
255    * Callback for handling operation-specific messages.
256    */
257   MsgHandlerImpl msg_handler;
258
259   /**
260    * Callback for handling the remote peer's disconnect.
261    */
262   PeerDisconnectImpl peer_disconnect;
263
264   /**
265    * Callback for canceling an operation by its ID.
266    */
267   CancelImpl cancel;
268
269   CopyStateImpl copy_state;
270 };
271
272
273 /**
274  * MutationEvent gives information about changes
275  * to an element (removal / addition) in a set content.
276  */
277 struct MutationEvent
278 {
279   /**
280    * First generation affected by this mutation event.
281    *
282    * If @a generation is 0, this mutation event is a list
283    * sentinel element.
284    */
285   unsigned int generation;
286
287   /**
288    * If @a added is #GNUNET_YES, then this is a
289    * `remove` event, otherwise it is an `add` event.
290    */
291   int added;
292 };
293
294
295 /**
296  * Information about an element element in the set.  All elements are
297  * stored in a hash-table from their hash-code to their `struct
298  * Element`, so that the remove and add operations are reasonably
299  * fast.
300  */
301 struct ElementEntry
302 {
303   /**
304    * The actual element. The data for the element
305    * should be allocated at the end of this struct.
306    */
307   struct GNUNET_SET_Element element;
308
309   /**
310    * Hash of the element.  For set union: Will be used to derive the
311    * different IBF keys for different salts.
312    */
313   struct GNUNET_HashCode element_hash;
314
315   /**
316    * If @a mutations is not NULL, it contains
317    * a list of mutations, ordered by increasing generation.
318    * The list is terminated by a sentinel event with `generation`
319    * set to 0.
320    *
321    * If @a mutations is NULL, then this element exists in all generations
322    * of the respective set content this element belongs to.
323    */
324   struct MutationEvent *mutations;
325
326   /**
327    * Number of elements in the array @a mutations.
328    */
329   unsigned int mutations_size;
330
331   /**
332    * #GNUNET_YES if the element is a remote element, and does not belong
333    * to the operation's set.
334    */
335   int remote;
336 };
337
338
339 struct Listener;
340
341
342 /**
343  * Operation context used to execute a set operation.
344  */
345 struct Operation
346 {
347   /**
348    * V-Table for the operation belonging to the tunnel contest.
349    *
350    * Used for all operation specific operations after receiving the ops request
351    */
352   const struct SetVT *vt;
353
354   /**
355    * Channel to the peer.
356    */
357   struct GNUNET_CADET_Channel *channel;
358
359   /**
360    * Port this operation runs on.
361    */
362   struct Listener *listener;
363
364   /**
365    * Message queue for the channel.
366    */
367   struct GNUNET_MQ_Handle *mq;
368
369   /**
370    * Detail information about the set operation, including the set to
371    * use.  When 'spec' is NULL, the operation is not yet entirely
372    * initialized.
373    */
374   struct OperationSpecification *spec;
375
376   /**
377    * Operation-specific operation state.  Note that the exact
378    * type depends on this being a union or intersection operation
379    * (and thus on @e vt).
380    */
381   struct OperationState *state;
382
383   /**
384    * Evaluate operations are held in a linked list.
385    */
386   struct Operation *next;
387
388   /**
389    * Evaluate operations are held in a linked list.
390    */
391   struct Operation *prev;
392
393   /**
394    * The identity of the requesting peer.  Needs to
395    * be stored here as the op spec might not have been created yet.
396    */
397   struct GNUNET_PeerIdentity peer;
398
399   /**
400    * Timeout task, if the incoming peer has not been accepted
401    * after the timeout, it will be disconnected.
402    */
403   struct GNUNET_SCHEDULER_Task *timeout_task;
404
405   /**
406    * Unique request id for the request from a remote peer, sent to the
407    * client, which will accept or reject the request.  Set to '0' iff
408    * the request has not been suggested yet.
409    */
410   uint32_t suggest_id;
411
412   /**
413    * #GNUNET_YES if this is not a "real" set operation yet, and we still
414    * need to wait for the other peer to give us more details.
415    */
416   int is_incoming;
417
418   /**
419    * Generation in which the operation handle
420    * was created.
421    */
422   unsigned int generation_created;
423
424   /**
425    * Incremented whenever (during shutdown) some component still
426    * needs to do something with this before the operation is freed.
427    * (Used as a reference counter, but only during termination.)
428    */
429   unsigned int keep;
430 };
431
432
433 /**
434  * SetContent stores the actual set elements,
435  * which may be shared by multiple generations derived
436  * from one set.
437  */
438 struct SetContent
439 {
440   /**
441    * Number of references to the content.
442    */
443   unsigned int refcount;
444
445   /**
446    * Maps `struct GNUNET_HashCode *` to `struct ElementEntry *`.
447    */
448   struct GNUNET_CONTAINER_MultiHashMap *elements;
449
450   unsigned int latest_generation;
451
452   /**
453    * Mutations requested by the client that we're
454    * unable to execute right now because we're iterating
455    * over the underlying hash map of elements.
456    */
457   struct PendingMutation *pending_mutations_head;
458
459   /**
460    * Mutations requested by the client that we're
461    * unable to execute right now because we're iterating
462    * over the underlying hash map of elements.
463    */
464   struct PendingMutation *pending_mutations_tail;
465
466   /**
467    * Number of concurrently active iterators.
468    */
469   int iterator_count;
470 };
471
472
473 struct GenerationRange
474 {
475   /**
476    * First generation that is excluded.
477    */
478   unsigned int start;
479
480   /**
481    * Generation after the last excluded generation.
482    */
483   unsigned int end;
484 };
485
486
487 struct PendingMutation
488 {
489   struct PendingMutation *prev;
490   struct PendingMutation *next;
491
492   struct Set *set;
493
494   /**
495    * Message that describes the desired mutation.
496    * May only be a #GNUNET_MESSAGE_TYPE_SET_ADD or
497    * #GNUNET_MESSAGE_TYPE_SET_REMOVE.
498    */
499   struct GNUNET_MessageHeader *mutation_message;
500 };
501
502
503 /**
504  * A set that supports a specific operation with other peers.
505  */
506 struct Set
507 {
508
509   /**
510    * Sets are held in a doubly linked list (in `sets_head` and `sets_tail`).
511    */
512   struct Set *next;
513
514   /**
515    * Sets are held in a doubly linked list.
516    */
517   struct Set *prev;
518
519   /**
520    * Client that owns the set.  Only one client may own a set,
521    * and there can only be one set per client.
522    */
523   struct GNUNET_SERVICE_Client *client;
524
525   /**
526    * Message queue for the client.
527    */
528   struct GNUNET_MQ_Handle *client_mq;
529
530   /**
531    * Virtual table for this set.  Determined by the operation type of
532    * this set.
533    *
534    * Used only for Add/remove of elements and when receiving an incoming
535    * operation from a remote peer.
536    */
537   const struct SetVT *vt;
538
539   /**
540    * Implementation-specific state.
541    */
542   struct SetState *state;
543
544   /**
545    * Current state of iterating elements for the client.
546    * NULL if we are not currently iterating.
547    */
548   struct GNUNET_CONTAINER_MultiHashMapIterator *iter;
549
550   /**
551    * Evaluate operations are held in a linked list.
552    */
553   struct Operation *ops_head;
554
555   /**
556    * Evaluate operations are held in a linked list.
557    */
558   struct Operation *ops_tail;
559
560   /**
561    * Current generation, that is, number of previously executed
562    * operations and lazy copies on the underlying set content.
563    */
564   unsigned int current_generation;
565
566   /**
567    * List of generations we have to exclude, due to lazy copies.
568    */
569   struct GenerationRange *excluded_generations;
570
571   /**
572    * Number of elements in array @a excluded_generations.
573    */
574   unsigned int excluded_generations_size;
575
576   /**
577    * Type of operation supported for this set
578    */
579   enum GNUNET_SET_OperationType operation;
580
581   /**
582    * Each @e iter is assigned a unique number, so that the client
583    * can distinguish iterations.
584    */
585   uint16_t iteration_id;
586
587   /**
588    * Generation we're currently iteration over.
589    */
590   unsigned int iter_generation;
591
592   /**
593    * Content, possibly shared by multiple sets,
594    * and thus reference counted.
595    */
596   struct SetContent *content;
597 };
598
599
600 extern struct GNUNET_STATISTICS_Handle *_GSS_statistics;
601
602
603 /**
604  * Destroy the given operation.  Call the implementation-specific
605  * cancel function of the operation.  Disconnects from the remote
606  * peer.  Does not disconnect the client, as there may be multiple
607  * operations per set.
608  *
609  * @param op operation to destroy
610  * @param gc #GNUNET_YES to perform garbage collection on the set
611  */
612 void
613 _GSS_operation_destroy (struct Operation *op,
614                         int gc);
615
616
617 /**
618  * Get the table with implementing functions for set union.
619  *
620  * @return the operation specific VTable
621  */
622 const struct SetVT *
623 _GSS_union_vt (void);
624
625
626 /**
627  * Get the table with implementing functions for set intersection.
628  *
629  * @return the operation specific VTable
630  */
631 const struct SetVT *
632 _GSS_intersection_vt (void);
633
634
635 int
636 _GSS_is_element_of_set (struct ElementEntry *ee,
637                         struct Set *set);
638
639 int
640 _GSS_is_element_of_operation (struct ElementEntry *ee,
641                               struct Operation *op);
642
643
644 #endif