/*
This file is part of GNUnet
- (C) 2012 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2012 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 2, or (at your
+ by the Free Software Foundation; either version 3, or (at your
option) any later version.
GNUnet is distributed in the hope that it will be useful, but
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.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
*/
#define GNUNET_CONSENSUS_PROTOCOL_H
#include "platform.h"
+#include "gnunet_util_lib.h"
#include "gnunet_common.h"
#include "gnunet_protocols.h"
GNUNET_NETWORK_STRUCT_BEGIN
-struct StrataMessage
+/**
+ * Sent as context message for set reconciliation.
+ *
+ * Essentially contains all the fields
+ * from 'struct TaskKey', but in NBO.
+ */
+struct GNUNET_CONSENSUS_RoundContextMessage
{
+ /**
+ * Type: GNUNET_MESSAGE_TYPE_CONSENSUS_P2P_ROUND_CONTEXT
+ */
struct GNUNET_MessageHeader header;
- uint8_t round;
- uint8_t exp_round;
- uint8_t exp_subround;
- /* struct GNUNET_HashCode hash_buckets[ibf_size*num_strata] */
- /* struct GNUNET_HashCode id_buckets[ibf_size*num_strata] */
- /* uint8_t count_buckets[ibf_size*num_strata] */
-};
-struct DifferenceDigest
-{
- struct GNUNET_MessageHeader header;
- uint8_t order;
- uint8_t round;
- uint8_t exp_round;
- uint8_t exp_subround;
- /* rest: IBF */
+ /**
+ * A value from 'enum PhaseKind'.
+ */
+ uint16_t kind;
+
+ /**
+ * Number of the first peer
+ * in canonical order.
+ */
+ int16_t peer1;
+
+ /**
+ * Number of the second peer in canonical order.
+ */
+ int16_t peer2;
+
+ /**
+ * Repetition of the gradecast phase.
+ */
+ int16_t repetition;
+
+ /**
+ * Leader in the gradecast phase.
+ *
+ * Can be different from both peer1 and peer2.
+ */
+ int16_t leader;
+
+ /**
+ * Non-zero if this set reconciliation
+ * had elements removed because they were contested.
+ *
+ * Will be considered when grading broadcasts.
+ *
+ * Ignored for set operations that are not within gradecasts.
+ */
+ uint16_t is_contested;
};
-struct Element
-{
- struct GNUNET_MessageHeader header;
- struct GNUNET_HashCode hash;
+enum {
+ CONSENSUS_MARKER_CONTESTED = 1,
+ CONSENSUS_MARKER_SIZE = 2,
};
-struct ElementRequest
+/**
+ * Consensus element, either marker or payload.
+ */
+struct ConsensusElement
{
- struct GNUNET_MessageHeader header;
- /* struct GNUNET_HashCode[] rest */
+ /**
+ * Payload element_type, only valid
+ * if this is not a marker element.
+ */
+ uint16_t payload_type;
+
+ /**
+ * Is this a marker element?
+ */
+ uint8_t marker;
+
+ /* rest: element data */
};
-struct ConsensusHello
+
+struct ConsensusSizeElement
{
- struct GNUNET_MessageHeader header;
- struct GNUNET_HashCode global_id;
+ struct ConsensusElement ce GNUNET_PACKED;
+
+ uint64_t size GNUNET_PACKED;
+ uint8_t sender_index;
};
-struct ConsensusRoundHeader
+struct ConsensusStuffedElement
{
- struct GNUNET_MessageHeader header;
- uint8_t round;
- uint8_t exp_round;
- uint8_t exp_subround;
+ struct ConsensusElement ce GNUNET_PACKED;
+ struct GNUNET_HashCode rand GNUNET_PACKED;
};