* @file multicast/multicast.h
* @brief multicast IPC messages
* @author Christian Grothoff
+ * @author Gabor X Toth
*/
#ifndef MULTICAST_H
#define MULTICAST_H
/**
- * 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;
/**
+ * Always zero.
+ */
+ uint32_t reserved;
+
+ /**
+ * ECC signature of the rest of the fields of the join request.
*
+ * Signature must match the public key of the joining member.
*/
- struct GNUNET_MessageHeader header;
+ struct GNUNET_CRYPTO_EddsaSignature signature;
/**
- * Unique ID that identifies the associated join test.
+ * Purpose for the signature and size of the signed data.
*/
- uint32_t uid;
+ struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+
+ /**
+ * Public key of the target group.
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey group_key;
+
+ /**
+ * Public key of the joining member.
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey member_key;
/**
- * #GNUNET_YES if the peer was admitted.
+ * Peer identity of the joining member.
+ */
+ struct GNUNET_PeerIdentity member_peer;
+
+ /* Followed by struct GNUNET_MessageHeader join_request */
+};
+
+
+/**
+ * Header of a join decision message sent to a peer requesting join.
+ */
+struct MulticastJoinDecisionMessage
+{
+ /**
+ * Type: GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * #GNUNET_YES if the peer was admitted
+ * #GNUNET_NO if entry was refused,
+ * #GNUNET_SYSERR if the request could not be answered.
*/
int32_t is_admitted;
*/
uint32_t relay_count;
- /* followed by 'relay_count' peer identities */
+ /* Followed by relay_count peer identities */
+
+ /* Followed by the join response message */
+};
- /* followed by the join response message */
+/**
+ * Header added to a struct MulticastJoinDecisionMessage
+ * when sent between the client and service.
+ */
+struct MulticastJoinDecisionMessageHeader
+{
+ /**
+ * Type: GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * C->S: Peer to send the join decision to.
+ * S->C: Peer we received the join decision from.
+ */
+ struct GNUNET_PeerIdentity peer;
+
+ /**
+ * C->S: Public key of the member requesting join.
+ * S->C: Unused.
+ */
+ struct GNUNET_CRYPTO_EddsaPublicKey member_key;
+
+ /* Followed by struct MulticastJoinDecisionMessage */
};
* Message sent from the client to the service to notify the service
* about the result of a membership test.
*/
-struct MulticastMembershipTestResponseMessage
+struct MulticastMembershipTestResultMessage
{
-
/**
- *
+ * Type: GNUNET_MESSAGE_TYPE_MULTICAST_MEMBERSHIP_TEST_RESULT
*/
struct GNUNET_MessageHeader header;
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.
+ * #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.
*/
int32_t is_admitted;
-
};
*/
struct MulticastOriginStartMessage
{
-
/**
- *
+ * Type: GNUNET_MESSAGE_TYPE_MULTICAST_ORIGIN_START
*/
struct GNUNET_MessageHeader header;
uint32_t reserved;
/**
- * Private, non-ephemeral key for the mutlicast group.
+ * 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.
*/
- struct GNUNET_CRYPTO_EccPrivateKey group_key;
+ uint64_t max_fragment_id;
+};
+
+
+struct MulticastMemberJoinMessage
+{
/**
- * Last fragment ID, used to continue counting fragments if we resume operating
- * a group.
+ * Type: GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN
*/
- uint64_t last_fragment_id;
+ 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 */
};
/**
* Public non-ephemeral key of the mutlicast group.
*/
- struct GNUNET_CRYPTO_EccPublicSignKey group_key;
+ struct GNUNET_CRYPTO_EddsaPublicKey group_key;
/**
* Our private key for the group.
*/
- struct GNUNET_CRYPTO_EccPrivateKey member_key;
+ struct GNUNET_CRYPTO_EddsaPrivateKey member_key;
/* followed by 'relay_count' `struct GNUNET_PeerIdentity`s */
};
-
-
-
GNUNET_NETWORK_STRUCT_END
#endif