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