/*
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.
+ 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/>.
- 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.
+ SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
* @file multicast/multicast.h
* @brief multicast IPC messages
* @author Christian Grothoff
+ * @author Gabor X Toth
*/
#ifndef MULTICAST_H
#define MULTICAST_H
+#include "platform.h"
+#include "gnunet_multicast_service.h"
+
GNUNET_NETWORK_STRUCT_BEGIN
/**
- * Message sent from the client to the service to notify the service
- * about a join decision.
+ * Header of a join request sent to the origin or another member.
*/
-struct MulticastJoinDecisionMessage
+struct MulticastJoinRequestMessage
{
-
/**
- *
+ * Type: GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_REQUEST
*/
struct GNUNET_MessageHeader header;
/**
- * Unique ID that identifies the associated join test.
+ * Always zero.
*/
- uint32_t uid;
+ uint32_t reserved;
/**
- * #GNUNET_YES if the peer was admitted.
+ * ECC signature of the rest of the fields of the join request.
+ *
+ * Signature must match the public key of the joining member.
*/
- int32_t is_admitted;
+ struct GNUNET_CRYPTO_EcdsaSignature signature;
/**
- * Number of relays given.
+ * Purpose for the signature and size of the signed data.
*/
- uint32_t relay_count;
-
- /* 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.
- */
-struct MulticastMembershipTestResponseMessage
-{
+ struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
/**
- *
+ * Public key of the target group.
*/
- struct GNUNET_MessageHeader header;
+ struct GNUNET_CRYPTO_EddsaPublicKey group_pub_key;
/**
- * Unique ID that identifies the associated membership test.
+ * Public key of the joining member.
*/
- uint32_t uid;
+ struct GNUNET_CRYPTO_EcdsaPublicKey member_pub_key;
/**
- * #GNUNET_YES if the peer is a member, #GNUNET_NO if peer was not a member,
- * #GNUNET_SYSERR if we cannot answer the test.
+ * Peer identity of the joining member.
*/
- int32_t is_admitted;
+ struct GNUNET_PeerIdentity peer;
+ /* Followed by struct GNUNET_MessageHeader join_message */
};
/**
- * Message sent from the client to the service to give the service
- * a replayed message.
+ * Header of a join decision message sent to a peer requesting join.
*/
-struct MulticastReplayResponseMessage
+struct MulticastJoinDecisionMessage
{
-
/**
- *
+ * Type: GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION
*/
struct GNUNET_MessageHeader header;
/**
- * Unique ID that identifies the associated replay session.
+ * #GNUNET_YES if the peer was admitted
+ * #GNUNET_NO if entry was refused,
+ * #GNUNET_SYSERR if the request could not be answered.
*/
- uint32_t uid;
+ int32_t is_admitted;
/**
- * An `enum GNUNET_MULTICAST_ReplayErrorCode` identifying issues (in NBO).
+ * Number of relays given.
*/
- int32_t error_code;
+ uint32_t relay_count;
- /* followed by replayed message */
+ /* 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 end of a replay session.
+ * Header added to a struct MulticastJoinDecisionMessage
+ * when sent between the client and service.
*/
-struct MulticastReplayEndMessage
+struct MulticastJoinDecisionMessageHeader
{
-
/**
- *
+ * 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;
+
+ /**
+ * C->S: Public key of the member requesting join.
+ * S->C: Unused.
+ */
+ 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 starting of a multicast group with this peers as its origin.
+ * about the result of a membership test.
*/
-struct MulticastOriginStartMessage
+struct MulticastMembershipTestResultMessage
{
-
/**
- *
+ * Type: GNUNET_MESSAGE_TYPE_MULTICAST_MEMBERSHIP_TEST_RESULT
*/
struct GNUNET_MessageHeader header;
/**
- * Always zero.
- */
- uint32_t reserved;
-
- /**
- * Private, non-ephemeral key for the mutlicast group.
+ * Unique ID that identifies the associated membership test.
*/
- struct GNUNET_CRYPTO_EccPrivateKey group_key;
+ uint32_t uid;
/**
- * Last fragment ID, 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 last_fragment_id;
-
+ 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.
+ * S->C: Public key of the member requesting replay.
+ * C->S: Unused.
*/
- int32_t status;
+ struct GNUNET_CRYPTO_EcdsaPublicKey member_pub_key;
/**
- * Message ID.
- */
- uint64_t message_id;
-
- /**
- * Group generation.
+ * ID of the message that is being requested.
*/
- uint64_t group_generation;
+ uint64_t fragment_id;
/**
- * Total message size.
- */
- uint64_t total_size;
-
-};
-
-
-/**
- * Message sent from the client to the service to join a multicast group.
- */
-struct MulticastJoinMessage
-{
-
- /**
- *
+ * 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_EccPublicSignKey group_key;
+ uint64_t flags;
/**
- * Our private key for the group.
+ * Replay request ID.
*/
- struct GNUNET_CRYPTO_EccPrivateKey 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.
*/
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 */
+};
GNUNET_NETWORK_STRUCT_END