fix bad free
[oweals/gnunet.git] / src / include / gnunet_psyc_service.h
index 526a70f01d06bc495eb9c5112327c52a4597e0b9..f31de0e67b5c1695ff7a31c8e601e6a8e2d36fc2 100644 (file)
@@ -1,21 +1,19 @@
 /*
      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
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
+     Affero General Public License for more details.
+    
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 /**
  * - 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
  *   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
+ *
  * @{
  */
 
@@ -250,7 +255,6 @@ struct GNUNET_PSYC_MessageHeader
 
   /**
    * Byte offset of this @e fragment of the @e message.
-   * FIXME: use data_offset instead
    */
   uint64_t fragment_offset GNUNET_PACKED;
 
@@ -258,7 +262,7 @@ struct GNUNET_PSYC_MessageHeader
    * 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
@@ -312,7 +316,7 @@ struct GNUNET_PSYC_MessageModifier
   uint16_t name_size GNUNET_PACKED;
 
   /**
-   * enum GNUNET_ENV_Operator
+   * enum GNUNET_PSYC_Operator
    */
   uint8_t oper;
 
@@ -351,7 +355,7 @@ struct GNUNET_PSYC_JoinRequestMessage
   /**
    * 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 */
 };
@@ -377,7 +381,7 @@ struct GNUNET_PSYC_JoinDecisionMessage
    * 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 */
 };
@@ -534,8 +538,6 @@ struct GNUNET_PSYC_JoinHandle;
  */
 typedef void
 (*GNUNET_PSYC_MessageCallback) (void *cls,
-                                uint64_t message_id,
-                                uint32_t flags,
                                 const struct GNUNET_PSYC_MessageHeader *msg);
 
 
@@ -544,16 +546,15 @@ typedef void
  *
  * @param cls
  *        Closure.
- * @param slave_key
+ * @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 data_offset
- *        Byte offset of data, only set if @a msg has a type
- *        #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_DATA
+ * @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
@@ -564,11 +565,8 @@ typedef void
  */
 typedef void
 (*GNUNET_PSYC_MessagePartCallback) (void *cls,
-                                    const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
-                                    uint64_t message_id,
-                                    uint32_t flags,
-                                    uint64_t data_offset,
-                                    const struct GNUNET_MessageHeader *msg);
+                                    const struct GNUNET_PSYC_MessageHeader *msg,
+                                    const struct GNUNET_MessageHeader *pmsg);
 
 
 /**
@@ -576,7 +574,7 @@ typedef void
  *
  * @param cls
  *        Closure.
- * @param slave_key
+ * @param slave_pub_key
  *        Public key of the slave requesting join.
  * @param join_msg
  *        Join message sent along with the request.
@@ -586,7 +584,7 @@ typedef void
 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);
 
@@ -631,10 +629,10 @@ struct GNUNET_PSYC_Master;
 
 
 /**
- * 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
@@ -830,6 +828,22 @@ void
 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.
  *
@@ -920,7 +934,7 @@ enum GNUNET_PSYC_SlaveJoinFlags
  *        Configuration to use.
  * @param channel_pub_key
  *        ECC public key that identifies the channel we wish to join.
- * @param slave_key
+ * @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.
@@ -951,7 +965,7 @@ enum GNUNET_PSYC_SlaveJoinFlags
 struct GNUNET_PSYC_Slave *
 GNUNET_PSYC_slave_join (const struct GNUNET_CONFIGURATION_Handle *cfg,
                         const struct GNUNET_CRYPTO_EddsaPublicKey *channel_pub_key,
-                        const struct GNUNET_CRYPTO_EcdsaPrivateKey *slave_key,
+                        const struct GNUNET_CRYPTO_EcdsaPrivateKey *slave_pub_key,
                         enum GNUNET_PSYC_SlaveJoinFlags flags,
                         const struct GNUNET_PeerIdentity *origin,
                         uint32_t relay_count,
@@ -1085,7 +1099,7 @@ GNUNET_PSYC_slave_get_channel (struct GNUNET_PSYC_Slave *slave);
  *
  * @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.
@@ -1101,7 +1115,7 @@ GNUNET_PSYC_slave_get_channel (struct GNUNET_PSYC_Slave *slave);
  */
 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,
@@ -1127,7 +1141,7 @@ GNUNET_PSYC_channel_slave_add (struct GNUNET_PSYC_Channel *channel,
  *
  * @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.
@@ -1142,7 +1156,7 @@ GNUNET_PSYC_channel_slave_add (struct GNUNET_PSYC_Channel *channel,
 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);