notes
[oweals/gnunet.git] / src / multicast / multicast.h
index 85c5714e6e34d5ac3ef597a6196fb96cf69d06f3..e95299a5e4ed17deb113dae0a637a3b684d20ab8 100644 (file)
@@ -1,21 +1,19 @@
 /*
      This file is part of GNUnet.
-     (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., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, 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/>.
 */
 
 /**
@@ -27,6 +25,9 @@
 #ifndef MULTICAST_H
 #define MULTICAST_H
 
+#include "platform.h"
+#include "gnunet_multicast_service.h"
+
 GNUNET_NETWORK_STRUCT_BEGIN
 
 
@@ -50,7 +51,7 @@ struct MulticastJoinRequestMessage
    *
    * Signature must match the public key of the joining member.
    */
-  struct GNUNET_CRYPTO_EddsaSignature signature;
+  struct GNUNET_CRYPTO_EcdsaSignature signature;
 
   /**
    * Purpose for the signature and size of the signed data.
@@ -60,24 +61,24 @@ struct MulticastJoinRequestMessage
   /**
    * Public key of the target group.
    */
-  struct GNUNET_CRYPTO_EddsaPublicKey group_key;
+  struct GNUNET_CRYPTO_EddsaPublicKey group_pub_key;
 
   /**
    * Public key of the joining member.
    */
-  struct GNUNET_CRYPTO_EddsaPublicKey member_key;
+  struct GNUNET_CRYPTO_EcdsaPublicKey member_pub_key;
 
   /**
    * Peer identity of the joining member.
    */
-  struct GNUNET_PeerIdentity member_peer;
+  struct GNUNET_PeerIdentity peer;
 
-  /* Followed by struct GNUNET_MessageHeader join_request */
+  /* Followed by struct GNUNET_MessageHeader join_message */
 };
 
 
 /**
- * Header of a join decision sent to a remote peer.
+ * Header of a join decision message sent to a peer requesting join.
  */
 struct MulticastJoinDecisionMessage
 {
@@ -87,261 +88,138 @@ struct MulticastJoinDecisionMessage
   struct GNUNET_MessageHeader header;
 
   /**
-   * #GNUNET_YES if the peer was admitted.
+   * #GNUNET_YES    if the peer was admitted
+   * #GNUNET_NO     if entry was refused,
+   * #GNUNET_SYSERR if the request could not be answered.
    */
-  uint8_t is_admitted;
-
-  /* Followed by the join response message */
-};
-
-
-/**
- * Message sent from the client to the service to notify the service
- * about a join decision.
- */
-struct MulticastClientJoinDecisionMessage
-{
-  /**
-   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION
-   */
-  struct GNUNET_MessageHeader header;
+  int32_t is_admitted;
 
   /**
    * Number of relays given.
    */
   uint32_t relay_count;
 
-  /**
-   * Public key of the joining member.
-   */
-  struct GNUNET_CRYPTO_EddsaPublicKey member_key;
-
-  /**
-   * Peer identity of the joining member.
-   */
-  struct GNUNET_PeerIdentity member_peer;
-
-  /**
-   * #GNUNET_YES if the peer was admitted.
-   */
-  uint8_t is_admitted;
-
   /* Followed by relay_count peer identities */
 
   /* Followed by the join response message */
-
 };
 
 
 /**
- * Message sent from the client to the service to notify the service
- * about the result of a membership test.
+ * Header added to a struct MulticastJoinDecisionMessage
+ * when sent between the client and service.
  */
-struct MulticastMembershipTestResultMessage
+struct MulticastJoinDecisionMessageHeader
 {
-
   /**
-   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_MEMBERSHIP_TEST_RESULT
-   */
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * Unique ID that identifies the associated membership test.
-   */
-  uint32_t uid;
-
-  /**
-   * #GNUNET_YES if the peer is a member, #GNUNET_NO if peer was not a member,
-   * #GNUNET_SYSERR if we cannot answer the test.
-   */
-  int32_t is_admitted;
-
-};
-
-
-/**
- * Message sent from the client to the service to give the service
- * a replayed message.
- */
-struct MulticastReplayResponseMessage
-{
-
-  /**
-   *
+   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Unique ID that identifies the associated replay session.
+   * C->S: Peer to send the join decision to.
+   * S->C: Peer we received the join decision from.
    */
-  uint32_t uid;
+  struct GNUNET_PeerIdentity peer;
 
   /**
-   * An `enum GNUNET_MULTICAST_ReplayErrorCode` identifying issues (in NBO).
+   * C->S: Public key of the member requesting join.
+   * S->C: Unused.
    */
-  int32_t error_code;
-
-  /* followed by replayed message */
+  struct GNUNET_CRYPTO_EcdsaPublicKey member_pub_key;
 
+  /* Followed by struct MulticastJoinDecisionMessage */
 };
 
 
 /**
  * Message sent from the client to the service to notify the service
- * about the end of a replay session.
+ * about the result of a membership test.
  */
-struct MulticastReplayEndMessage
+struct MulticastMembershipTestResultMessage
 {
-
   /**
-   *
+   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_MEMBERSHIP_TEST_RESULT
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Unique ID that identifies the associated replay session.
+   * Unique ID that identifies the associated membership test.
    */
   uint32_t uid;
 
-};
-
-
-/**
- * Message sent from the client to the service to notify the service
- * about the starting of a multicast group with this peers as its origin.
- */
-struct MulticastOriginStartMessage
-{
-  /**
-   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_ORIGIN_START
-   */
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * Always zero.
-   */
-  uint32_t reserved;
-
-  /**
-   * Private, non-ephemeral key for the multicast group.
-   */
-  struct GNUNET_CRYPTO_EddsaPrivateKey group_key;
-
   /**
-   * Last fragment ID sent to the group, used to continue counting fragments if
-   * we resume operating * a group.
+   * #GNUNET_YES    if the peer is a member
+   * #GNUNET_NO     if peer is not a member,
+   * #GNUNET_SYSERR if the test could not be answered.
    */
-  uint64_t max_fragment_id;
-
-};
-
-
-struct MulticastMemberJoinMessage
-{
-  /**
-   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN
-   */
-  struct GNUNET_MessageHeader header;
-
-  uint32_t relay_count GNUNET_PACKED;
-
-  struct GNUNET_CRYPTO_EddsaPublicKey group_key;
-
-  struct GNUNET_CRYPTO_EddsaPrivateKey member_key;
-
-  struct GNUNET_PeerIdentity origin;
-
-  /* Followed by struct GNUNET_PeerIdentity relays[relay_count] */
-  /* Followed by struct GNUNET_MessageHeader join_request */
+  int32_t is_admitted;
 };
 
 
 /**
- * Message sent from the client to the service to broadcast to all group
- * members.
+ * Message sent from the client to the service OR the service to the
+ * client asking for a message fragment to be replayed.
  */
-struct MulticastBroadcastMessage
+struct MulticastReplayRequestMessage
 {
 
   /**
-   *
+   * The message type should be
+   * #GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST.
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * #GNUNET_OK normally, #GNUNET_SYSERR if the origin aborted the
-   * transmission.
-   */
-  int32_t status;
-
-  /**
-   * Message ID.
+   * S->C: Public key of the member requesting replay.
+   * C->S: Unused.
    */
-  uint64_t message_id;
+  struct GNUNET_CRYPTO_EcdsaPublicKey member_pub_key;
 
   /**
-   * Group generation.
-   */
-  uint64_t group_generation;
-
-  /**
-   * Total message size.
+   * ID of the message that is being requested.
    */
-  uint64_t total_size;
-
-};
-
-
-/**
- * Message sent from the client to the service to join a multicast group.
- */
-struct MulticastJoinMessage
-{
+  uint64_t fragment_id;
 
   /**
-   *
+   * ID of the message that is being requested.
    */
-  struct GNUNET_MessageHeader header;
+  uint64_t message_id;
 
   /**
-   * Number of relays we (think) we already know about.
+   * Offset of the fragment that is being requested.
    */
-  uint32_t relay_count;
+  uint64_t fragment_offset;
 
   /**
-   * Public non-ephemeral key of the mutlicast group.
+   * Additional flags for the request.
    */
-  struct GNUNET_CRYPTO_EddsaPublicKey group_key;
+  uint64_t flags;
 
   /**
-   * Our private key for the group.
+   * Replay request ID.
    */
-  struct GNUNET_CRYPTO_EddsaPrivateKey member_key;
-
-  /* followed by 'relay_count' `struct GNUNET_PeerIdentity`s */
-
+  uint32_t uid;
 };
 
 
-
 /**
- * Message sent from the client to the service OR the service to the
- * client asking for a message fragment to be replayed.
+ * Message sent from the client to the service to give the service
+ * a replayed message.
  */
-struct MulticastReplayRequestMessage
+struct MulticastReplayResponseMessage
 {
 
   /**
-   * The message type can be either
-   * #GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST or
-   * #GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_REQUEST_CANCEL.
+   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_RESPONSE
+   *    or GNUNET_MESSAGE_TYPE_MULTICAST_REPLAY_RESPONSE_END
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Replay request ID.
+   * ID of the message that is being requested.
    */
-  uint32_t uid;
+  uint64_t fragment_id;
 
   /**
    * ID of the message that is being requested.
@@ -358,63 +236,62 @@ struct MulticastReplayRequestMessage
    */
   uint64_t flags;
 
-};
+  /**
+   * An `enum GNUNET_MULTICAST_ReplayErrorCode` identifying issues (in NBO).
+   */
+  int32_t error_code;
 
+  /* followed by replayed message */
+};
 
 
 /**
- * Message sent from the client to the service to unicast to the group origin.
+ * Message sent from the client to the service to notify the service
+ * about the starting of a multicast group with this peers as its origin.
  */
-struct MulticastUnicastToOriginMessage
+struct MulticastOriginStartMessage
 {
-
   /**
-   *
+   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_ORIGIN_START
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * Reserved (always 0).
+   * Always zero.
    */
   uint32_t reserved;
 
   /**
-   * Message ID.
+   * Private, non-ephemeral key for the multicast group.
    */
-  uint64_t message_id;
+  struct GNUNET_CRYPTO_EddsaPrivateKey group_key;
 
   /**
-   * Total message size.
+   * Last fragment ID sent to the group, used to continue counting fragments if
+   * we resume operating * a group.
    */
-  uint64_t total_size;
-
-  /* followed by payload */
-
+  uint64_t max_fragment_id;
 };
 
 
-/**
- * Message sent from the client to the service to
- * cancel unicast to the group origin.
- */
-struct MulticastUnicastToOriginCancelMessage
+struct MulticastMemberJoinMessage
 {
-
   /**
-   *
+   * Type: GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN
    */
   struct GNUNET_MessageHeader header;
 
-  /**
-   * Reserved (always 0).
-   */
-  uint32_t reserved;
+  uint32_t relay_count GNUNET_PACKED;
 
-  /**
-   * Message ID.
-   */
-  uint64_t message_id;
+  struct GNUNET_CRYPTO_EddsaPublicKey group_pub_key;
+
+  struct GNUNET_CRYPTO_EcdsaPrivateKey member_key;
+
+  struct GNUNET_PeerIdentity origin;
+
+  /* Followed by struct GNUNET_PeerIdentity relays[relay_count] */
 
+  /* Followed by struct GNUNET_MessageHeader join_msg */
 };