/*
This file is part of GNUnet.
- Copyright (C) 2012, 2013 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2012, 2013 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
*/
/**
- * @file include/gnunet_psyc_service.h
- * @brief PSYC service; high-level access to the PSYC protocol
- * note that clients of this API are NOT expected to
- * understand the PSYC message format, only the semantics!
- * Parsing (and serializing) the PSYC stream format is done
- * within the implementation of the libgnunetpsyc library,
- * and this API deliberately exposes as little as possible
- * of the actual data stream format to the application!
- * @author Christian Grothoff
* @author Gabor X Toth
+ * @author Christian Grothoff
+ *
+ * @file
+ * PSYC service
+ *
+ * @defgroup psyc PSYC service
+ * Send/receive messages in PSYC channels and access the PSYC Store.
+ *
+ * Note that clients of this API are NOT expected to understand the PSYC message
+ * format, only the semantics! Parsing (and serializing) the PSYC stream format
+ * is done within the implementation of the libgnunetpsyc library, and this API
+ * deliberately exposes as little as possible of the actual data stream format
+ * to the application!
*
* NOTE:
- * - this API does not know about psyc's "root" and "places";
- * there is no 'root' in GNUnet-Psyc as we're decentralized;
+ * - this API does not know about PSYC's "root" and "places";
+ * there is no 'root' in GNUnet-PSYC as we're decentralized;
* 'places' and 'persons' are combined within the same
* abstraction, that of a "channel". Channels are identified
* and accessed in this API using a public/private key.
* - PSYC defines standard variables, methods, etc. This
* library deliberately abstracts over all of these; a
* higher-level API should combine the naming system (GNS)
- * and standard methods (message, join, part, warn,
- * fail, error) and variables (action, color, time,
- * tag, etc.). However, this API does take over the
- * routing variables, specifically 'context' (channel),
- * and 'source'. We only kind-of support 'target', as
+ * and standard methods (_converse, _notice, _request,
+ * _warning, _error etc) and variables (_action, _color,
+ * _time, etc). However, this API does take over the
+ * routing variables, specifically '_context' (channel),
+ * and '_source'. We only kind-of support '_target', as
* the target is either everyone in the group or the
* origin, and never just a single member of the group;
* for such individual messages, an application needs to
* be called 'PSYC-low', whereas a higher-level API
* implementing defaults for standard methods and
* variables might be called 'PSYC-std' or 'PSYC-high'.
+ *
+ * In PSYC terminology this is simply called the "PSYC
+ * routing layer" and the abstractions, for instance in
+ * psyced, are quite similar. The higher one is called
+ * "PSYC entity layer." In the text rendering of the
+ * protocol the two are separated by an empty line. See
+ * http://about.psyc.eu/Spec:Packet and related. --lynX
+ *
+ * @{
*/
#ifndef GNUNET_PSYC_SERVICE_H
#endif
#include "gnunet_util_lib.h"
-#include "gnunet_env_lib.h"
#include "gnunet_multicast_service.h"
//Mingw work around
#ifdef MINGW
/**
* Byte offset of this @e fragment of the @e message.
- * FIXME: use data_offset instead
*/
uint64_t fragment_offset GNUNET_PACKED;
* Sending slave's public key.
* Not set if the message is from the master.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
+ struct GNUNET_CRYPTO_EcdsaPublicKey slave_pub_key;
/* Followed by concatenated PSYC message parts:
* messages with GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_* types
uint16_t name_size GNUNET_PACKED;
/**
- * enum GNUNET_ENV_Operator
+ * enum GNUNET_PSYC_Operator
*/
uint8_t oper;
/**
* Public key of the joining slave.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
+ struct GNUNET_CRYPTO_EcdsaPublicKey slave_pub_key;
/* Followed by struct GNUNET_MessageHeader join_request */
};
* Only set when the master is sending the decision,
* not set when a slave is receiving it.
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
+ struct GNUNET_CRYPTO_EcdsaPublicKey slave_pub_key;
/* Followed by struct GNUNET_MessageHeader join_response */
};
*/
typedef void
(*GNUNET_PSYC_MessageCallback) (void *cls,
- uint64_t message_id,
- uint32_t flags,
const struct GNUNET_PSYC_MessageHeader *msg);
/**
* Method called from PSYC upon receiving part of a message.
*
- * @param cls Closure.
- * @param message_id Sequence number of the message.
- * @param data_offset Byte offset of data, only set if @a msg has a type
- * #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_DATA
- * @param flags OR'ed GNUNET_PSYC_MessageFlags
+ * @param cls
+ * Closure.
+ * @param slave_pub_key
+ * Public key of the slave sending the message.
+ * Only set for channel master.
+ * @param message_id
+ * Sequence number of the message.
+ * @param flags
+ * OR'ed GNUNET_PSYC_MessageFlags
+ * @param fragment_offset
+ * Multicast message fragment offset.
* @param msg Message part, one of the following types:
* - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_HEADER
* - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD
*/
typedef void
(*GNUNET_PSYC_MessagePartCallback) (void *cls,
- uint64_t message_id,
- uint64_t data_offset,
- uint32_t flags,
- const struct GNUNET_MessageHeader *msg);
+ const struct GNUNET_PSYC_MessageHeader *msg,
+ const struct GNUNET_MessageHeader *pmsg);
/**
* Method called from PSYC upon receiving a join request.
*
- * @param cls Closure.
- * @param slave_key Public key of the slave requesting join.
- * @param join_msg Join message sent along with the request.
- * @param jh Join handle to use with GNUNET_PSYC_join_decision()
+ * @param cls
+ * Closure.
+ * @param slave_pub_key
+ * Public key of the slave requesting join.
+ * @param join_msg
+ * Join message sent along with the request.
+ * @param jh
+ * Join handle to use with GNUNET_PSYC_join_decision()
*/
typedef void
(*GNUNET_PSYC_JoinRequestCallback) (void *cls,
const struct GNUNET_PSYC_JoinRequestMessage *req,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_pub_key,
const struct GNUNET_PSYC_Message *join_msg,
struct GNUNET_PSYC_JoinHandle *jh);
/**
- * Function called after connected to the PSYC service
- * and the channel master started.
+ * Function called once we are connected to the PSYC service
+ * and the channel master is started.
*
- * Also called when reconnected to the service
+ * Also called when we reconnected to the service
* after the connection closed unexpectedly.
*
* @param cls
GNUNET_PSYC_master_transmit_cancel (struct GNUNET_PSYC_MasterTransmitHandle *th);
+/**
+ * Relay a message
+ *
+ * @param master Handle to the PSYC channel.
+ * @param method_name Which method should be invoked.
+ * @param notify_mod Function to call to obtain modifiers.
+ * @param notify_data Function to call to obtain fragments of the data.
+ * @param notify_cls Closure for @a notify_mod and @a notify_data.
+ * @param flags Flags for the message being transmitted.
+ * @return Transmission handle, NULL on error (i.e. more than one request queued).
+ */
+struct GNUNET_PSYC_MasterTransmitHandle *
+GNUNET_PSYC_master_relay (struct GNUNET_PSYC_Master *master,
+ uint64_t message_id);
+
+
/**
* Stop a PSYC master channel.
*
int is_admitted,
const struct GNUNET_PSYC_Message *join_msg);
+/**
+ * Flags for GNUNET_PSYC_slave_join()
+ */
+enum GNUNET_PSYC_SlaveJoinFlags
+{
+ GNUNET_PSYC_SLAVE_JOIN_NONE = 0,
+
+ /**
+ * Local join for history access, no network connection is established.
+ */
+ GNUNET_PSYC_SLAVE_JOIN_LOCAL = 1,
+};
+
/**
* Join a PSYC channel.
* notification on failure (as the channel may simply take days to approve,
* and disapproval is simply being ignored).
*
- * @param cfg Configuration to use.
- * @param channel_key ECC public key that identifies the channel we wish to join.
- * @param slave_key ECC private-public key pair that identifies the slave, and
+ * @param cfg
+ * Configuration to use.
+ * @param channel_pub_key
+ * ECC public key that identifies the channel we wish to join.
+ * @param slave_pub_key
+ * ECC private-public key pair that identifies the slave, and
* used by multicast to sign the join request and subsequent unicast
* requests sent to the master.
- * @param origin Peer identity of the origin.
- * @param relay_count Number of peers in the @a relays array.
- * @param relays Peer identities of members of the multicast group, which serve
+ * @param flags
+ * Join flags.
+ * @param origin
+ * Peer identity of the origin.
+ * @param relay_count
+ * Number of peers in the @a relays array.
+ * @param relays
+ * Peer identities of members of the multicast group, which serve
* as relays and used to join the group at.
- * @param message_cb Function to invoke on message parts received from the
- * channel, typically at least contains method handlers for @e join and
- * @e part.
- * @param slave_connect_cb Function invoked once we have connected to the
- * PSYC service.
- * @param join_decision_cb Function invoked once we have received a join
- * decision.
- * @param cls Closure for @a message_cb and @a slave_joined_cb.
- * @param method_name Method name for the join request.
- * @param env Environment containing transient variables for the request, or NULL.
- * @param data Payload for the join message.
- * @param data_size Number of bytes in @a data.
+ * @param message_cb
+ * Function to invoke on message fragments received from the channel.
+ * @param message_part_cb
+ * Function to invoke on message parts received from the channel.
+ * @param slave_connect_cb
+ * Function invoked once we have connected to the PSYC service.
+ * @param join_decision_cb
+ * Function invoked once we have received a join decision.
+ * @param cls
+ * Closure for @a message_cb and @a slave_joined_cb.
+ * @param join_msg
+ * Join message.
*
* @return Handle for the slave, NULL on error.
*/
struct GNUNET_PSYC_Slave *
GNUNET_PSYC_slave_join (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_CRYPTO_EddsaPublicKey *channel_key,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *slave_key,
+ const struct GNUNET_CRYPTO_EddsaPublicKey *channel_pub_key,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *slave_pub_key,
+ enum GNUNET_PSYC_SlaveJoinFlags flags,
const struct GNUNET_PeerIdentity *origin,
uint32_t relay_count,
const struct GNUNET_PeerIdentity *relays,
*
* @param channel
* Channel handle.
- * @param slave_key
+ * @param slave_pub_key
* Identity of channel slave to add.
* @param announced_at
* ID of the message that announced the membership change.
*/
void
GNUNET_PSYC_channel_slave_add (struct GNUNET_PSYC_Channel *channel,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_pub_key,
uint64_t announced_at,
uint64_t effective_since,
GNUNET_ResultCallback result_cb,
*
* @param channel
* Channel handle.
- * @param slave_key
+ * @param slave_pub_key
* Identity of channel slave to remove.
* @param announced_at
* ID of the message that announced the membership change.
void
GNUNET_PSYC_channel_slave_remove (struct GNUNET_PSYC_Channel *channel,
const struct GNUNET_CRYPTO_EcdsaPublicKey
- *slave_key,
+ *slave_pub_key,
uint64_t announced_at,
GNUNET_ResultCallback result_cb,
void *cls);
/* ifndef GNUNET_PSYC_SERVICE_H */
#endif
-/* end of gnunet_psyc_service.h */
+
+/** @} */ /* end of group */