doxygen: group/module definitions (part 2)
[oweals/gnunet.git] / src / include / gnunet_psyc_service.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2012, 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., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20
21 /**
22  * @author Gabor X Toth
23  * @author Christian Grothoff
24  *
25  * @file
26  * PSYC service
27  *
28  * @defgroup psyc  PSYC service
29  * Send/receive messages in PSYC channels and access the PSYC Store.
30  *
31  * Note that clients of this API are NOT expected to understand the PSYC message
32  * format, only the semantics!  Parsing (and serializing) the PSYC stream format
33  * is done within the implementation of the libgnunetpsyc library, and this API
34  * deliberately exposes as little as possible of the actual data stream format
35  * to the application!
36  *
37  * NOTE:
38  * - this API does not know about PSYC's "root" and "places";
39  *   there is no 'root' in GNUnet-PSYC as we're decentralized;
40  *   'places' and 'persons' are combined within the same
41  *   abstraction, that of a "channel".  Channels are identified
42  *   and accessed in this API using a public/private key.
43  *   Higher-level applications should use NAMES within GNS
44  *   to obtain public keys, and the distinction between
45  *   'places' and 'persons' can then be made with the help
46  *   of the naming system (and/or conventions).
47  *   Channels are (as in PSYC) organized into a hierarchy; each
48  *   channel master (the one with the private key) is then
49  *   the operator of the multicast group (its Origin in
50  *   the terminology of the multicast API).
51  * - The API supports passing large amounts of data using
52  *   'streaming' for the argument passed to a method.  State
53  *   and variables must fit into memory and cannot be streamed
54  *   (thus, no passing of 4 GB of data in a variable;
55  *   once we implement this, we might want to create a
56  *   @c \#define for the maximum size of a variable).
57  * - PSYC defines standard variables, methods, etc.  This
58  *   library deliberately abstracts over all of these; a
59  *   higher-level API should combine the naming system (GNS)
60  *   and standard methods (message, join, part, warn,
61  *   fail, error) and variables (action, color, time,
62  *   tag, etc.).  However, this API does take over the
63  *   routing variables, specifically 'context' (channel),
64  *   and 'source'.  We only kind-of support 'target', as
65  *   the target is either everyone in the group or the
66  *   origin, and never just a single member of the group;
67  *   for such individual messages, an application needs to
68  *   construct an 'inbox' channel where the master (only)
69  *   receives messages (but never forwards; private responses
70  *   would be transmitted by joining the senders 'inbox'
71  *   channel -- or a inbox#bob subchannel).  The
72  *   goal for all of this is to keep the abstractions in this
73  *   API minimal: interaction with multicast, try \& slice,
74  *   state/variable/channel management.  Higher-level
75  *   operations belong elsewhere (so maybe this API should
76  *   be called 'PSYC-low', whereas a higher-level API
77  *   implementing defaults for standard methods and
78  *   variables might be called 'PSYC-std' or 'PSYC-high'.
79  *
80  * @{
81  */
82
83 #ifndef GNUNET_PSYC_SERVICE_H
84 #define GNUNET_PSYC_SERVICE_H
85
86 #ifdef __cplusplus
87 extern "C"
88 {
89 #if 0                           /* keep Emacsens' auto-indent happy */
90 }
91 #endif
92 #endif
93
94 #include "gnunet_util_lib.h"
95 #include "gnunet_env_lib.h"
96 #include "gnunet_multicast_service.h"
97 //Mingw work around
98 #ifdef MINGW
99     # ifndef  UINT64_MAX
100     # define  UINT64_MAX 0xffffffffffffffffULL
101     # endif
102 #endif
103
104 /**
105  * Version number of GNUnet-PSYC API.
106  */
107 #define GNUNET_PSYC_VERSION 0x00000000
108
109
110 /**
111  * Policy flags for a channel.
112  */
113 enum GNUNET_PSYC_ChannelFlags
114 {
115   /**
116    * Admission must be confirmed by the master.
117    */
118   GNUNET_PSYC_CHANNEL_ADMISSION_CONTROL = 1 << 0,
119
120   /**
121    * Past messages are only available to slaves who were admitted at the time
122    * they were sent to the channel.
123    */
124   GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY = 1 << 1
125 };
126
127
128 /**
129  * PSYC channel policies.
130  */
131 enum GNUNET_PSYC_Policy
132 {
133   /**
134    * Anyone can join the channel, without announcing his presence;
135    * all messages are always public and can be distributed freely.
136    * Joins may be announced, but this is not required.
137    */
138   GNUNET_PSYC_CHANNEL_ANONYMOUS = 0,
139
140   /**
141    * The master must approve membership to the channel, messages must only be
142    * distributed to current channel slaves.  This includes the channel
143    * state as well as transient messages.
144    */
145   GNUNET_PSYC_CHANNEL_PRIVATE
146     = GNUNET_PSYC_CHANNEL_ADMISSION_CONTROL
147     | GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY
148
149 #if IDEAS_FOR_FUTURE
150   /**
151    * Anyone can freely join the channel (no approval required);
152    * however, messages must only be distributed to current channel
153    * slaves, so the master must still acknowledge that the slave
154    * joined before transient messages are delivered.  As approval is
155    * guaranteed, the presistent channel state can be synchronized freely
156    * immediately, prior to master confirmation.
157    */
158   GNUNET_PSYC_CHANNEL_OPEN
159     = GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY,
160
161   /**
162    * The master must approve joins to the channel, but past messages can be
163    * freely distributed to slaves.
164    */
165   GNUNET_PSYC_CHANNEL_CLOSED
166     = GNUNET_PSYC_CHANNEL_ADMISSION_CONTROL,
167 #endif
168 };
169
170
171 enum GNUNET_PSYC_MessageFlags
172 {
173   /**
174    * Default / no flags.
175    */
176   GNUNET_PSYC_MESSAGE_DEFAULT = 0,
177
178   /**
179    * Historic message, retrieved from PSYCstore.
180    */
181   GNUNET_PSYC_MESSAGE_HISTORIC = 1 << 0,
182
183   /**
184    * Request from slave to master.
185    */
186   GNUNET_PSYC_MESSAGE_REQUEST = 1 << 1,
187
188   /**
189    * Message can be delivered out of order.
190    */
191   GNUNET_PSYC_MESSAGE_ORDER_ANY = 1 << 2
192 };
193
194
195 /**
196  * Values for the @a state_delta field of GNUNET_PSYC_MessageHeader.
197  */
198 enum GNUNET_PSYC_StateDeltaValues
199 {
200   GNUNET_PSYC_STATE_RESET = 0,
201
202   GNUNET_PSYC_STATE_NOT_MODIFIED = UINT64_MAX
203 };
204
205
206 GNUNET_NETWORK_STRUCT_BEGIN
207
208 /**
209  * A PSYC message.
210  *
211  * Used for single-fragment messages e.g. in a join request or response.
212  */
213 struct GNUNET_PSYC_Message
214 {
215   /**
216    * Message header with size and type information.
217    */
218   struct GNUNET_MessageHeader header;
219
220   /* Followed by concatenated PSYC message parts:
221    * messages with GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_* types
222    */
223 };
224
225
226 /**
227  * Header of a PSYC message.
228  *
229  * The PSYC service adds this when delivering the message to local clients,
230  * not present on the multicast layer.
231  */
232 struct GNUNET_PSYC_MessageHeader
233 {
234   /**
235    * Generic message header with size and type information.
236    */
237   struct GNUNET_MessageHeader header;
238
239   /**
240    * Flags for this message fragment.
241    *
242    * @see enum GNUNET_PSYC_MessageFlags
243    */
244   uint32_t flags GNUNET_PACKED;
245
246   /**
247    * Number of the message this message part belongs to.
248    * Monotonically increasing from 1.
249    */
250   uint64_t message_id GNUNET_PACKED;
251
252   /**
253    * Byte offset of this @e fragment of the @e message.
254    * FIXME: use data_offset instead
255    */
256   uint64_t fragment_offset GNUNET_PACKED;
257
258   /**
259    * Sending slave's public key.
260    * Not set if the message is from the master.
261    */
262   struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
263
264   /* Followed by concatenated PSYC message parts:
265    * messages with GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_* types
266    */
267 };
268
269
270 /**
271  * The method of a message.
272  */
273 struct GNUNET_PSYC_MessageMethod
274 {
275   /**
276    * Type: GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD
277    */
278   struct GNUNET_MessageHeader header;
279
280   /**
281    * OR'ed GNUNET_PSYC_MasterTransmitFlags
282    */
283   uint32_t flags GNUNET_PACKED;
284
285   /**
286    * Number of message IDs since the last message that contained state
287    * operations. @see enum GNUNET_PSYC_StateDeltaValues
288    */
289   uint64_t state_delta GNUNET_PACKED;
290
291   /* Followed by NUL-terminated method name. */
292 };
293
294
295 /**
296  * A modifier of a message.
297  */
298 struct GNUNET_PSYC_MessageModifier
299 {
300   /**
301    * Type: GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MODIFIER
302    */
303   struct GNUNET_MessageHeader header;
304
305   /**
306    * Size of value.
307    */
308   uint32_t value_size GNUNET_PACKED;
309
310   /**
311    * Size of name, including NUL terminator.
312    */
313   uint16_t name_size GNUNET_PACKED;
314
315   /**
316    * enum GNUNET_ENV_Operator
317    */
318   uint8_t oper;
319
320   /* Followed by NUL-terminated name, then the value. */
321 };
322
323
324 struct GNUNET_PSYC_CountersResultMessage
325 {
326   /**
327    * Type: GNUNET_MESSAGE_TYPE_PSYC_RESULT_COUNTERS
328    */
329   struct GNUNET_MessageHeader header;
330
331   /**
332    * Status code for the operation.
333    */
334   uint32_t result_code GNUNET_PACKED;
335
336   /**
337    * Last message ID sent to the channel.
338    */
339   uint64_t max_message_id GNUNET_PACKED;
340 };
341
342
343 /**
344  * Join request sent to a PSYC master.
345  */
346 struct GNUNET_PSYC_JoinRequestMessage
347 {
348   /**
349    * Type: GNUNET_MESSAGE_TYPE_PSYC_MASTER_JOIN_REQUEST
350    */
351   struct GNUNET_MessageHeader header;
352   /**
353    * Public key of the joining slave.
354    */
355   struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
356
357   /* Followed by struct GNUNET_MessageHeader join_request */
358 };
359
360
361 /**
362  * Join decision sent in reply to a join request.
363  */
364 struct GNUNET_PSYC_JoinDecisionMessage
365 {
366   /**
367    * Type: GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION
368    */
369   struct GNUNET_MessageHeader header;
370
371   /**
372    * #GNUNET_YES if the slave was admitted.
373    */
374   int32_t is_admitted;
375
376   /**
377    * Public key of the joining slave.
378    * Only set when the master is sending the decision,
379    * not set when a slave is receiving it.
380    */
381   struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
382
383   /* Followed by struct GNUNET_MessageHeader join_response */
384 };
385
386
387 enum GNUNET_PSYC_HistoryReplayFlags
388 {
389   /**
390    * Replay locally available messages.
391    */
392   GNUNET_PSYC_HISTORY_REPLAY_LOCAL  = 0,
393
394   /**
395    * Replay messages from remote peers if not found locally.
396    */
397   GNUNET_PSYC_HISTORY_REPLAY_REMOTE = 1,
398 };
399
400
401 struct GNUNET_PSYC_HistoryRequestMessage
402 {
403   /**
404    * Type: GNUNET_MESSAGE_TYPE_PSYC_CHANNEL_HISTORY_REPLAY
405    */
406   struct GNUNET_MessageHeader header;
407
408   /**
409    * @see enum GNUNET_PSYC_HistoryReplayFlags
410    */
411   uint32_t flags GNUNET_PACKED;
412
413   /**
414    * ID for this operation.
415    */
416   uint64_t op_id GNUNET_PACKED;
417
418   uint64_t start_message_id GNUNET_PACKED;
419
420   uint64_t end_message_id GNUNET_PACKED;
421
422   uint64_t message_limit GNUNET_PACKED;
423
424   /* Followed by NUL-terminated method name prefix. */
425 };
426
427
428 struct GNUNET_PSYC_StateRequestMessage
429 {
430   /**
431    * Types:
432    * - GNUNET_MESSAGE_TYPE_PSYC_CHANNEL_STATE_GET
433    * - GNUNET_MESSAGE_TYPE_PSYC_CHANNEL_STATE_GET_PREFIX
434    */
435   struct GNUNET_MessageHeader header;
436
437   uint32_t reserved GNUNET_PACKED;
438
439   /**
440    * ID for this operation.
441    */
442   uint64_t op_id GNUNET_PACKED;
443
444   /* Followed by NUL-terminated name. */
445 };
446
447
448 /**** service -> library ****/
449
450
451 /**
452  * Answer from service to client about last operation.
453  */
454 struct GNUNET_PSYC_OperationResultMessage
455 {
456   /**
457    * Types:
458    * - GNUNET_MESSAGE_TYPE_PSYC_RESULT_CODE
459    * - GNUNET_MESSAGE_TYPE_PSYC_CHANNEL_STATE_RESULT
460    */
461   struct GNUNET_MessageHeader header;
462
463   uint32_t reserved GNUNET_PACKED;
464
465   /**
466    * Operation ID.
467    */
468   uint64_t op_id GNUNET_PACKED;
469
470   /**
471    * Status code for the operation.
472    */
473   uint64_t result_code GNUNET_PACKED;
474
475   /* Followed by:
476    * - on error: NUL-terminated error message
477    * - on success: one of the following message types
478    *
479    *   For a STATE_RESULT, one of:
480    *   - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MODIFIER
481    *   - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MOD_CONT
482    *   - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END
483    */
484 };
485
486 GNUNET_NETWORK_STRUCT_END
487
488
489 #define GNUNET_PSYC_MODIFIER_MAX_PAYLOAD        \
490   GNUNET_MULTICAST_FRAGMENT_MAX_PAYLOAD         \
491   - sizeof (struct GNUNET_PSYC_MessageModifier)
492
493 #define GNUNET_PSYC_MOD_CONT_MAX_PAYLOAD        \
494   GNUNET_MULTICAST_FRAGMENT_MAX_PAYLOAD         \
495   - sizeof (struct GNUNET_MessageHeader)
496
497 #define GNUNET_PSYC_DATA_MAX_PAYLOAD            \
498   GNUNET_MULTICAST_FRAGMENT_MAX_PAYLOAD         \
499   - sizeof (struct GNUNET_MessageHeader)
500
501
502 /**
503  * PSYC message part processing states.
504  */
505 enum GNUNET_PSYC_MessageState
506 {
507   GNUNET_PSYC_MESSAGE_STATE_START    = 0,
508   GNUNET_PSYC_MESSAGE_STATE_HEADER   = 1,
509   GNUNET_PSYC_MESSAGE_STATE_METHOD   = 2,
510   GNUNET_PSYC_MESSAGE_STATE_MODIFIER = 3,
511   GNUNET_PSYC_MESSAGE_STATE_MOD_CONT = 4,
512   GNUNET_PSYC_MESSAGE_STATE_DATA     = 5,
513   GNUNET_PSYC_MESSAGE_STATE_END      = 6,
514   GNUNET_PSYC_MESSAGE_STATE_CANCEL   = 7,
515   GNUNET_PSYC_MESSAGE_STATE_ERROR    = 8,
516 };
517
518
519 /**
520  * Handle that identifies a join request.
521  *
522  * Used to match calls to #GNUNET_PSYC_JoinCallback to the
523  * corresponding calls to GNUNET_PSYC_join_decision().
524  */
525 struct GNUNET_PSYC_JoinHandle;
526
527
528 /**
529  * Method called from PSYC upon receiving a message.
530  *
531  * @param cls  Closure.
532  * @param message_id  Sequence number of the message.
533  * @param flags  OR'ed GNUNET_PSYC_MessageFlags
534  * @param msg  Message part, one of the following types:
535  */
536 typedef void
537 (*GNUNET_PSYC_MessageCallback) (void *cls,
538                                 uint64_t message_id,
539                                 uint32_t flags,
540                                 const struct GNUNET_PSYC_MessageHeader *msg);
541
542
543 /**
544  * Method called from PSYC upon receiving part of a message.
545  *
546  * @param cls
547  *        Closure.
548  * @param slave_key
549  *        Public key of the slave sending the message.
550  *        Only set for channel master.
551  * @param message_id
552  *        Sequence number of the message.
553  * @param flags
554  *        OR'ed GNUNET_PSYC_MessageFlags
555  * @param data_offset
556  *        Byte offset of data, only set if @a msg has a type
557  *        #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_DATA
558  * @param msg  Message part, one of the following types:
559  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_HEADER
560  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD
561  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MODIFIER
562  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MOD_CONT
563  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_DATA
564  * or NULL if an error occurred while receiving a message.
565  */
566 typedef void
567 (*GNUNET_PSYC_MessagePartCallback) (void *cls,
568                                     const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
569                                     uint64_t message_id,
570                                     uint32_t flags,
571                                     uint64_t data_offset,
572                                     const struct GNUNET_MessageHeader *msg);
573
574
575 /**
576  * Method called from PSYC upon receiving a join request.
577  *
578  * @param cls
579  *        Closure.
580  * @param slave_key
581  *        Public key of the slave requesting join.
582  * @param join_msg
583  *        Join message sent along with the request.
584  * @param jh
585  *        Join handle to use with GNUNET_PSYC_join_decision()
586  */
587 typedef void
588 (*GNUNET_PSYC_JoinRequestCallback) (void *cls,
589                                     const struct GNUNET_PSYC_JoinRequestMessage *req,
590                                     const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
591                                     const struct GNUNET_PSYC_Message *join_msg,
592                                     struct GNUNET_PSYC_JoinHandle *jh);
593
594
595 /**
596  * Function to call with the decision made for a join request.
597  *
598  * Must be called once and only once in response to an invocation of the
599  * #GNUNET_PSYC_JoinCallback.
600  *
601  * @param jh  Join request handle.
602  * @param is_admitted
603  *   #GNUNET_YES    if the join is approved,
604  *   #GNUNET_NO     if it is disapproved,
605  *   #GNUNET_SYSERR if we cannot answer the request.
606  * @param relay_count  Number of relays given.
607  * @param relays  Array of suggested peers that might be useful relays to use
608  *        when joining the multicast group (essentially a list of peers that
609  *        are already part of the multicast group and might thus be willing
610  *        to help with routing).  If empty, only this local peer (which must
611  *        be the multicast origin) is a good candidate for building the
612  *        multicast tree.  Note that it is unnecessary to specify our own
613  *        peer identity in this array.
614  * @param join_resp  Application-dependent join response message to send along
615  *        with the decision.
616  *
617  * @return #GNUNET_OK on success,
618  *         #GNUNET_SYSERR if @a join_resp is too large.
619  */
620 int
621 GNUNET_PSYC_join_decision (struct GNUNET_PSYC_JoinHandle *jh,
622                            int is_admitted,
623                            uint32_t relay_count,
624                            const struct GNUNET_PeerIdentity *relays,
625                            const struct GNUNET_PSYC_Message *join_resp);
626
627
628 /**
629  * Handle for the master of a PSYC channel.
630  */
631 struct GNUNET_PSYC_Master;
632
633
634 /**
635  * Function called after connected to the PSYC service
636  * and the channel master started.
637  *
638  * Also called when reconnected to the service
639  * after the connection closed unexpectedly.
640  *
641  * @param cls
642  *        Closure.
643  * @param result
644  *        #GNUNET_YES if there were already messages sent to the channel,
645  *        #GNUNET_NO  if the message history is empty,
646  *        #GNUNET_SYSERR on error.
647  * @param max_message_id
648  *        Last message ID sent to the channel.
649  */
650 typedef void
651 (*GNUNET_PSYC_MasterStartCallback) (void *cls, int result,
652                                     uint64_t max_message_id);
653
654
655 /**
656  * Start a PSYC master channel.
657  *
658  * Will start a multicast group identified by the given ECC key.  Messages
659  * received from group members will be given to the respective handler methods.
660  * If a new member wants to join a group, the "join" method handler will be
661  * invoked; the join handler must then generate a "join" message to approve the
662  * joining of the new member.  The channel can also change group membership
663  * without explicit requests.  Note that PSYC doesn't itself "understand" join
664  * or part messages, the respective methods must call other PSYC functions to
665  * inform PSYC about the meaning of the respective events.
666  *
667  * @param cfg  Configuration to use (to connect to PSYC service).
668  * @param channel_key  ECC key that will be used to sign messages for this
669  *        PSYC session. The public key is used to identify the PSYC channel.
670  *        Note that end-users will usually not use the private key directly, but
671  *        rather look it up in GNS for places managed by other users, or select
672  *        a file with the private key(s) when setting up their own channels
673  *        FIXME: we'll likely want to use NOT the p521 curve here, but a cheaper
674  *        one in the future.
675  * @param policy  Channel policy specifying join and history restrictions.
676  *        Used to automate join decisions.
677  * @param master_start_cb  Function to invoke after the channel master started.
678  * @param join_request_cb  Function to invoke when a slave wants to join.
679  * @param message_cb  Function to invoke on message parts sent to the channel
680  *        and received from slaves
681  * @param cls  Closure for @a method and @a join_cb.
682  *
683  * @return Handle for the channel master, NULL on error.
684  */
685 struct GNUNET_PSYC_Master *
686 GNUNET_PSYC_master_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
687                           const struct GNUNET_CRYPTO_EddsaPrivateKey *channel_key,
688                           enum GNUNET_PSYC_Policy policy,
689                           GNUNET_PSYC_MasterStartCallback master_start_cb,
690                           GNUNET_PSYC_JoinRequestCallback join_request_cb,
691                           GNUNET_PSYC_MessageCallback message_cb,
692                           GNUNET_PSYC_MessagePartCallback message_part_cb,
693                           void *cls);
694
695
696 /**
697  * Function called to provide data for a transmission via PSYC.
698  *
699  * Note that returning #GNUNET_YES or #GNUNET_SYSERR (but not #GNUNET_NO)
700  * invalidates the respective transmission handle.
701  *
702  * @param cls Closure.
703  * @param[in,out] data_size Initially set to the number of bytes available in
704  *        @a data, should be set to the number of bytes written to data.
705  * @param[out] data Where to write the body of the message to give to the
706  *         method. The function must copy at most @a data_size bytes to @a data.
707  * @return #GNUNET_SYSERR on error (fatal, aborts transmission)
708  *         #GNUNET_NO on success, if more data is to be transmitted later.
709  *         Should be used if @a data_size was not big enough to take all the
710  *         data.  If 0 is returned in @a data_size the transmission is paused,
711  *         and can be resumed with GNUNET_PSYC_master_transmit_resume().
712  *         #GNUNET_YES if this completes the transmission (all data supplied)
713  */
714 typedef int
715 (*GNUNET_PSYC_TransmitNotifyData) (void *cls,
716                                    uint16_t *data_size,
717                                    void *data);
718
719 /**
720  * Function called to provide a modifier for a transmission via PSYC.
721  *
722  * Note that returning #GNUNET_YES or #GNUNET_SYSERR (but not #GNUNET_NO)
723  * invalidates the respective transmission handle.
724  *
725  * @param cls Closure.
726  * @param[in,out] data_size  Initially set to the number of bytes available in
727  *         @a data, should be set to the number of bytes written to data.
728  * @param[out] data  Where to write the modifier's name and value.
729  *         The function must copy at most @a data_size bytes to @a data.
730  *         When this callback is first called for a modifier, @a data should
731  *         contain: "name\0value".  If the whole value does not fit, subsequent
732  *         calls to this function should write continuations of the value to
733  *         @a data.
734  * @param[out] oper  Where to write the operator of the modifier.
735  *         Only needed during the first call to this callback at the beginning
736  *         of the modifier.  In case of subsequent calls asking for value
737  *         continuations @a oper is set to #NULL.
738  * @param[out] full_value_size  Where to write the full size of the value.
739  *         Only needed during the first call to this callback at the beginning
740  *         of the modifier.  In case of subsequent calls asking for value
741  *         continuations @a value_size is set to #NULL.
742  * @return #GNUNET_SYSERR on error (fatal, aborts transmission)
743  *         #GNUNET_NO on success, if more data is to be transmitted later.
744  *         Should be used if @a data_size was not big enough to take all the
745  *         data for the modifier's value (the name must be always returned
746  *         during the first call to this callback).
747  *         If 0 is returned in @a data_size the transmission is paused,
748  *         and can be resumed with GNUNET_PSYC_master_transmit_resume().
749  *         #GNUNET_YES if this completes the modifier (the whole value is supplied).
750  */
751 typedef int
752 (*GNUNET_PSYC_TransmitNotifyModifier) (void *cls,
753                                        uint16_t *data_size,
754                                        void *data,
755                                        uint8_t *oper,
756                                        uint32_t *full_value_size);
757
758 /**
759  * Flags for transmitting messages to a channel by the master.
760  */
761 enum GNUNET_PSYC_MasterTransmitFlags
762 {
763   GNUNET_PSYC_MASTER_TRANSMIT_NONE = 0,
764
765   /**
766    * Whether this message should reset the channel state,
767    * i.e. remove all previously stored state variables.
768    */
769
770   GNUNET_PSYC_MASTER_TRANSMIT_STATE_RESET = 1 << 0,
771
772   /**
773    * Whether this message contains any state modifiers.
774    */
775   GNUNET_PSYC_MASTER_TRANSMIT_STATE_MODIFY = 1 << 1,
776
777   /**
778    * Add PSYC header variable with the hash of the current channel state.
779    */
780   GNUNET_PSYC_MASTER_TRANSMIT_STATE_HASH = 1 << 2,
781
782   /**
783    * Whether we need to increment the group generation counter after
784    * transmitting this message.
785    */
786   GNUNET_PSYC_MASTER_TRANSMIT_INC_GROUP_GEN = 1 << 3
787 };
788
789
790 /**
791  * Handle for a pending PSYC transmission operation.
792  */
793 struct GNUNET_PSYC_MasterTransmitHandle;
794
795
796 /**
797  * Send a message to call a method to all members in the PSYC channel.
798  *
799  * @param master Handle to the PSYC channel.
800  * @param method_name Which method should be invoked.
801  * @param notify_mod Function to call to obtain modifiers.
802  * @param notify_data Function to call to obtain fragments of the data.
803  * @param notify_cls Closure for @a notify_mod and @a notify_data.
804  * @param flags Flags for the message being transmitted.
805  * @return Transmission handle, NULL on error (i.e. more than one request queued).
806  */
807 struct GNUNET_PSYC_MasterTransmitHandle *
808 GNUNET_PSYC_master_transmit (struct GNUNET_PSYC_Master *master,
809                              const char *method_name,
810                              GNUNET_PSYC_TransmitNotifyModifier notify_mod,
811                              GNUNET_PSYC_TransmitNotifyData notify_data,
812                              void *notify_cls,
813                              enum GNUNET_PSYC_MasterTransmitFlags flags);
814
815
816 /**
817  * Resume transmission to the channel.
818  *
819  * @param th Handle of the request that is being resumed.
820  */
821 void
822 GNUNET_PSYC_master_transmit_resume (struct GNUNET_PSYC_MasterTransmitHandle *th);
823
824
825 /**
826  * Abort transmission request to channel.
827  *
828  * @param th Handle of the request that is being aborted.
829  */
830 void
831 GNUNET_PSYC_master_transmit_cancel (struct GNUNET_PSYC_MasterTransmitHandle *th);
832
833
834 /**
835  * Stop a PSYC master channel.
836  *
837  * @param master
838  *        PSYC channel master to stop.
839  * @param keep_active
840  *        Keep place active after last application disconnected.
841  * @param stop_cb
842  *        Function called after the master stopped
843  *        and disconnected from the psyc service.
844  * @param stop_cls
845  *        Closure for @a part_cb.
846  */
847 void
848 GNUNET_PSYC_master_stop (struct GNUNET_PSYC_Master *master,
849                          int keep_active,
850                          GNUNET_ContinuationCallback stop_cb,
851                          void *stop_cls);
852
853
854 /**
855  * Handle for a PSYC channel slave.
856  */
857 struct GNUNET_PSYC_Slave;
858
859
860 /**
861  * Function called after the slave connected to the PSYC service.
862  *
863  * Also called when reconnected to the service
864  * after the connection closed unexpectedly.
865  *
866  * @param cls
867  *        Closure.
868  * @param result
869  *        #GNUNET_YES if there were already messages sent to the channel,
870  *        #GNUNET_NO  if the message history is empty,
871  *        #GNUNET_SYSERR on error.
872  * @param max_message_id
873  *        Last message ID sent to the channel.
874  */
875 typedef void
876 (*GNUNET_PSYC_SlaveConnectCallback) (void *cls, int result,
877                                      uint64_t max_message_id);
878
879
880 /**
881  * Method called to inform about the decision in response to a join request.
882  *
883  * If @a is_admitted is not #GNUNET_YES, then sending messages to the channel is
884  * not possible, but earlier history can be still queried.
885  *
886  * @param cls  Closure.
887  * @param is_admitted  #GNUNET_YES or #GNUNET_NO or #GNUNET_SYSERR
888  * @param join_msg  Application-dependent join message from the origin.
889  */
890 typedef void
891 (*GNUNET_PSYC_JoinDecisionCallback) (void *cls,
892                                      const struct GNUNET_PSYC_JoinDecisionMessage *dcsn,
893                                      int is_admitted,
894                                      const struct GNUNET_PSYC_Message *join_msg);
895
896 /**
897  * Flags for GNUNET_PSYC_slave_join()
898  */
899 enum GNUNET_PSYC_SlaveJoinFlags
900 {
901   GNUNET_PSYC_SLAVE_JOIN_NONE   = 0,
902
903   /**
904    * Local join for history access, no network connection is established.
905    */
906   GNUNET_PSYC_SLAVE_JOIN_LOCAL  = 1,
907 };
908
909
910 /**
911  * Join a PSYC channel.
912  *
913  * The entity joining is always the local peer.  The user must immediately use
914  * the GNUNET_PSYC_slave_transmit() functions to transmit a @e join_msg to the
915  * channel; if the join request succeeds, the channel state (and @e recent
916  * method calls) will be replayed to the joining member.  There is no explicit
917  * notification on failure (as the channel may simply take days to approve,
918  * and disapproval is simply being ignored).
919  *
920  * @param cfg  Configuration to use.
921  * @param channel_key  ECC public key that identifies the channel we wish to join.
922  * @param slave_key  ECC private-public key pair that identifies the slave, and
923  *        used by multicast to sign the join request and subsequent unicast
924  *        requests sent to the master.
925  * @param origin  Peer identity of the origin.
926  * @param relay_count  Number of peers in the @a relays array.
927  * @param relays  Peer identities of members of the multicast group, which serve
928  *        as relays and used to join the group at.
929  * @param message_cb  Function to invoke on message parts received from the
930  *        channel, typically at least contains method handlers for @e join and
931  *        @e part.
932  * @param slave_connect_cb  Function invoked once we have connected to the
933  *        PSYC service.
934  * @param join_decision_cb  Function invoked once we have received a join
935  *        decision.
936  * @param cls  Closure for @a message_cb and @a slave_joined_cb.
937  * @param method_name  Method name for the join request.
938  * @param env  Environment containing transient variables for the request, or NULL.
939  * @param data  Payload for the join message.
940  * @param data_size  Number of bytes in @a data.
941  *
942  * @return Handle for the slave, NULL on error.
943  */
944 struct GNUNET_PSYC_Slave *
945 GNUNET_PSYC_slave_join (const struct GNUNET_CONFIGURATION_Handle *cfg,
946                         const struct GNUNET_CRYPTO_EddsaPublicKey *channel_key,
947                         const struct GNUNET_CRYPTO_EcdsaPrivateKey *slave_key,
948                         enum GNUNET_PSYC_SlaveJoinFlags flags,
949                         const struct GNUNET_PeerIdentity *origin,
950                         uint32_t relay_count,
951                         const struct GNUNET_PeerIdentity *relays,
952                         GNUNET_PSYC_MessageCallback message_cb,
953                         GNUNET_PSYC_MessagePartCallback message_part_cb,
954                         GNUNET_PSYC_SlaveConnectCallback slave_connect_cb,
955                         GNUNET_PSYC_JoinDecisionCallback join_decision_cb,
956                         void *cls,
957                         const struct GNUNET_PSYC_Message *join_msg);
958
959
960 /**
961  * Part a PSYC channel.
962  *
963  * Will terminate the connection to the PSYC service.  Polite clients should
964  * first explicitly send a part request (via GNUNET_PSYC_slave_transmit()).
965  *
966  * @param slave
967  *        Slave handle.
968  * @param keep_active
969  *        Keep place active after last application disconnected.
970  * @param part_cb
971  *        Function called after the slave parted the channel
972  *        and disconnected from the psyc service.
973  * @param part_cls
974  *        Closure for @a part_cb.
975  */
976 void
977 GNUNET_PSYC_slave_part (struct GNUNET_PSYC_Slave *slave,
978                         int keep_active,
979                         GNUNET_ContinuationCallback part_cb,
980                         void *part_cls);
981
982
983 /**
984  * Flags for transmitting messages to the channel master by a slave.
985  */
986 enum GNUNET_PSYC_SlaveTransmitFlags
987 {
988   GNUNET_PSYC_SLAVE_TRANSMIT_NONE = 0
989 };
990
991
992 /**
993  * Handle for a pending PSYC transmission operation.
994  */
995 struct GNUNET_PSYC_SlaveTransmitHandle;
996
997
998 /**
999  * Request a message to be sent to the channel master.
1000  *
1001  * @param slave Slave handle.
1002  * @param method_name Which (PSYC) method should be invoked (on host).
1003  * @param notify_mod Function to call to obtain modifiers.
1004  * @param notify_data Function to call to obtain fragments of the data.
1005  * @param notify_cls Closure for @a notify.
1006  * @param flags Flags for the message being transmitted.
1007  * @return Transmission handle, NULL on error (i.e. more than one request queued).
1008  */
1009 struct GNUNET_PSYC_SlaveTransmitHandle *
1010 GNUNET_PSYC_slave_transmit (struct GNUNET_PSYC_Slave *slave,
1011                             const char *method_name,
1012                             GNUNET_PSYC_TransmitNotifyModifier notify_mod,
1013                             GNUNET_PSYC_TransmitNotifyData notify_data,
1014                             void *notify_cls,
1015                             enum GNUNET_PSYC_SlaveTransmitFlags flags);
1016
1017
1018 /**
1019  * Resume transmission to the master.
1020  *
1021  * @param th Handle of the request that is being resumed.
1022  */
1023 void
1024 GNUNET_PSYC_slave_transmit_resume (struct GNUNET_PSYC_SlaveTransmitHandle *th);
1025
1026
1027 /**
1028  * Abort transmission request to master.
1029  *
1030  * @param th Handle of the request that is being aborted.
1031  */
1032 void
1033 GNUNET_PSYC_slave_transmit_cancel (struct GNUNET_PSYC_SlaveTransmitHandle *th);
1034
1035
1036 /**
1037  * Handle to access PSYC channel operations for both the master and slaves.
1038  */
1039 struct GNUNET_PSYC_Channel;
1040
1041
1042 /**
1043  * Convert a channel @a master to a @e channel handle to access the @e channel
1044  * APIs.
1045  *
1046  * @param master Channel master handle.
1047  * @return Channel handle, valid for as long as @a master is valid.
1048  */
1049 struct GNUNET_PSYC_Channel *
1050 GNUNET_PSYC_master_get_channel (struct GNUNET_PSYC_Master *master);
1051
1052
1053 /**
1054  * Convert @a slave to a @e channel handle to access the @e channel APIs.
1055  *
1056  * @param slave Slave handle.
1057  * @return Channel handle, valid for as long as @a slave is valid.
1058  */
1059 struct GNUNET_PSYC_Channel *
1060 GNUNET_PSYC_slave_get_channel (struct GNUNET_PSYC_Slave *slave);
1061
1062
1063 /**
1064  * Add a slave to the channel's membership list.
1065  *
1066  * Note that this will NOT generate any PSYC traffic, it will merely update the
1067  * local database to modify how we react to <em>membership test</em> queries.
1068  * The channel master still needs to explicitly transmit a @e join message to
1069  * notify other channel members and they then also must still call this function
1070  * in their respective methods handling the @e join message.  This way, how @e
1071  * join and @e part operations are exactly implemented is still up to the
1072  * application; for example, there might be a @e part_all method to kick out
1073  * everyone.
1074  *
1075  * Note that channel slaves are explicitly trusted to execute such methods
1076  * correctly; not doing so correctly will result in either denying other slaves
1077  * access or offering access to channel data to non-members.
1078  *
1079  * @param channel
1080  *        Channel handle.
1081  * @param slave_key
1082  *        Identity of channel slave to add.
1083  * @param announced_at
1084  *        ID of the message that announced the membership change.
1085  * @param effective_since
1086  *        Addition of slave is in effect since this message ID.
1087  * @param result_cb
1088  *        Function to call with the result of the operation.
1089  *        The @e result_code argument is #GNUNET_OK on success, or
1090  *        #GNUNET_SYSERR on error.  In case of an error, the @e data argument
1091  *        can contain an optional error message.
1092  * @param cls
1093  *        Closure for @a result_cb.
1094  */
1095 void
1096 GNUNET_PSYC_channel_slave_add (struct GNUNET_PSYC_Channel *channel,
1097                                const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
1098                                uint64_t announced_at,
1099                                uint64_t effective_since,
1100                                GNUNET_ResultCallback result_cb,
1101                                void *cls);
1102
1103
1104 /**
1105  * Remove a slave from the channel's membership list.
1106  *
1107  * Note that this will NOT generate any PSYC traffic, it will merely update the
1108  * local database to modify how we react to <em>membership test</em> queries.
1109  * The channel master still needs to explicitly transmit a @e part message to
1110  * notify other channel members and they then also must still call this function
1111  * in their respective methods handling the @e part message.  This way, how
1112  * @e join and @e part operations are exactly implemented is still up to the
1113  * application; for example, there might be a @e part_all message to kick out
1114  * everyone.
1115  *
1116  * Note that channel members are explicitly trusted to perform these
1117  * operations correctly; not doing so correctly will result in either
1118  * denying members access or offering access to channel data to
1119  * non-members.
1120  *
1121  * @param channel
1122  *        Channel handle.
1123  * @param slave_key
1124  *        Identity of channel slave to remove.
1125  * @param announced_at
1126  *        ID of the message that announced the membership change.
1127  * @param result_cb
1128  *        Function to call with the result of the operation.
1129  *        The @e result_code argument is #GNUNET_OK on success, or
1130  *        #GNUNET_SYSERR on error.  In case of an error, the @e data argument
1131  *        can contain an optional error message.
1132  * @param cls
1133  *        Closure for @a result_cb.
1134  */
1135 void
1136 GNUNET_PSYC_channel_slave_remove (struct GNUNET_PSYC_Channel *channel,
1137                                   const struct GNUNET_CRYPTO_EcdsaPublicKey
1138                                   *slave_key,
1139                                   uint64_t announced_at,
1140                                   GNUNET_ResultCallback result_cb,
1141                                   void *cls);
1142
1143
1144 /**
1145  * History request handle.
1146  */
1147 struct GNUNET_PSYC_HistoryRequest;
1148
1149
1150 /**
1151  * Request to replay a part of the message history of the channel.
1152  *
1153  * Historic messages (but NOT the state at the time) will be replayed (given to
1154  * the normal method handlers) if available and if access is permitted.
1155  *
1156  * @param channel
1157  *        Which channel should be replayed?
1158  * @param start_message_id
1159  *        Earliest interesting point in history.
1160  * @param end_message_id
1161  *        Last (inclusive) interesting point in history.
1162  * @param method_prefix
1163  *        Retrieve only messages with a matching method prefix.
1164  * @param flags
1165  *        OR'ed enum GNUNET_PSYC_HistoryReplayFlags
1166  * @param result_cb
1167  *        Function to call when the requested history has been fully replayed.
1168  *        Once this function has been called, the client must not call
1169  *        GNUNET_PSYC_channel_history_replay_cancel() anymore.
1170  * @param cls
1171  *        Closure for the callbacks.
1172  *
1173  * @return Handle to cancel history replay operation.
1174  */
1175 struct GNUNET_PSYC_HistoryRequest *
1176 GNUNET_PSYC_channel_history_replay (struct GNUNET_PSYC_Channel *channel,
1177                                     uint64_t start_message_id,
1178                                     uint64_t end_message_id,
1179                                     const char *method_prefix,
1180                                     uint32_t flags,
1181                                     GNUNET_PSYC_MessageCallback message_cb,
1182                                     GNUNET_PSYC_MessagePartCallback message_part_cb,
1183                                     GNUNET_ResultCallback result_cb,
1184                                     void *cls);
1185
1186
1187 /**
1188  * Request to replay the latest messages from the message history of the channel.
1189  *
1190  * Historic messages (but NOT the state at the time) will be replayed (given to
1191  * the normal method handlers) if available and if access is permitted.
1192  *
1193  * @param channel
1194  *        Which channel should be replayed?
1195  * @param message_limit
1196  *        Maximum number of messages to replay.
1197  * @param flags
1198  *        OR'ed enum GNUNET_PSYC_HistoryReplayFlags
1199  * @param finish_cb
1200  *        Function to call when the requested history has been fully replayed
1201  *        (counting message IDs might not suffice, as some messages might be
1202  *        secret and thus the listener would not know the story is finished
1203  *        without being told explicitly)o once this function has been called, the
1204  *        client must not call GNUNET_PSYC_channel_history_replay_cancel() anymore.
1205  * @param cls
1206  *        Closure for the callbacks.
1207  *
1208  * @return Handle to cancel history replay operation.
1209  */
1210 struct GNUNET_PSYC_HistoryRequest *
1211 GNUNET_PSYC_channel_history_replay_latest (struct GNUNET_PSYC_Channel *channel,
1212                                            uint64_t message_limit,
1213                                            const char *method_prefix,
1214                                            uint32_t flags,
1215                                            GNUNET_PSYC_MessageCallback message_cb,
1216                                            GNUNET_PSYC_MessagePartCallback message_part_cb,
1217                                            GNUNET_ResultCallback result_cb,
1218                                            void *cls);
1219
1220
1221 void
1222 GNUNET_PSYC_channel_history_replay_cancel (struct GNUNET_PSYC_Channel *channel,
1223                                            struct GNUNET_PSYC_HistoryRequest *hr);
1224
1225
1226 /**
1227  * Function called to inform a member about stored state values for a channel.
1228  *
1229  * If @a full_value_size > value_size then this function is called multiple
1230  * times until the whole value arrived.
1231  *
1232  * @param cls
1233  *        Closure.
1234  * @param name
1235  *        Name of the state variable.
1236  *        NULL if there are no more state variables to be returned.
1237  * @param value
1238  *        Value of the state variable.
1239  * @param value_size
1240  *        Number of bytes in @a value.
1241  * @param full_value_size
1242  *        Number of bytes in the full value, including continuations.
1243  *        Only set for the first part of a variable,
1244  *        in case of a continuation it is 0.
1245  */
1246 typedef void
1247 (*GNUNET_PSYC_StateVarCallback) (void *cls,
1248                                  const struct GNUNET_MessageHeader *mod,
1249                                  const char *name,
1250                                  const void *value,
1251                                  uint32_t value_size,
1252                                  uint32_t full_value_size);
1253
1254
1255 /**
1256  * State request handle.
1257  */
1258 struct GNUNET_PSYC_StateRequest;
1259
1260
1261 /**
1262  * Retrieve the best matching channel state variable.
1263  *
1264  * If the requested variable name is not present in the state, the nearest
1265  * less-specific name is matched; for example, requesting "_a_b" will match "_a"
1266  * if "_a_b" does not exist.
1267  *
1268  * @param channel
1269  *        Channel handle.
1270  * @param full_name
1271  *        Full name of the requested variable.
1272  *        The actual variable returned might have a shorter name.
1273  * @param var_cb
1274  *        Function called once when a matching state variable is found.
1275  *        Not called if there's no matching state variable.
1276  * @param result_cb
1277  *        Function called after the operation finished.
1278  *        (i.e. all state variables have been returned via @a state_cb)
1279  * @param cls
1280  *        Closure for the callbacks.
1281  */
1282 struct GNUNET_PSYC_StateRequest *
1283 GNUNET_PSYC_channel_state_get (struct GNUNET_PSYC_Channel *channel,
1284                                const char *full_name,
1285                                GNUNET_PSYC_StateVarCallback var_cb,
1286                                GNUNET_ResultCallback result_cb,
1287                                void *cls);
1288
1289
1290 /**
1291  * Return all channel state variables whose name matches a given prefix.
1292  *
1293  * A name matches if it starts with the given @a name_prefix, thus requesting
1294  * the empty prefix ("") will match all values; requesting "_a_b" will also
1295  * return values stored under "_a_b_c".
1296  *
1297  * The @a state_cb is invoked on all matching state variables asynchronously, as
1298  * the state is stored in and retrieved from the PSYCstore,
1299  *
1300  * @param channel
1301  *        Channel handle.
1302  * @param name_prefix
1303  *        Prefix of the state variable name to match.
1304  * @param var_cb
1305  *        Function called once when a matching state variable is found.
1306  *        Not called if there's no matching state variable.
1307  * @param result_cb
1308  *        Function called after the operation finished.
1309  *        (i.e. all state variables have been returned via @a state_cb)
1310  * @param cls
1311  *        Closure for the callbacks.
1312  */
1313 struct GNUNET_PSYC_StateRequest *
1314 GNUNET_PSYC_channel_state_get_prefix (struct GNUNET_PSYC_Channel *channel,
1315                                       const char *name_prefix,
1316                                       GNUNET_PSYC_StateVarCallback var_cb,
1317                                       GNUNET_ResultCallback result_cb,
1318                                       void *cls);
1319
1320 /**
1321  * Cancel a state request operation.
1322  *
1323  * @param sr
1324  *        Handle for the operation to cancel.
1325  */
1326 void
1327 GNUNET_PSYC_channel_state_get_cancel (struct GNUNET_PSYC_StateRequest *sr);
1328
1329
1330
1331 #if 0                           /* keep Emacsens' auto-indent happy */
1332 {
1333 #endif
1334 #ifdef __cplusplus
1335 }
1336 #endif
1337
1338 /* ifndef GNUNET_PSYC_SERVICE_H */
1339 #endif
1340
1341 /** @} */  /* end of group */