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