fc8ae75339edfccc33b9bb3a075eb5b25346d875
[oweals/gnunet.git] / src / consensus / consensus_protocol.h
1 /*
2       This file is part of GNUnet
3       Copyright (C) 2012 GNUnet e.V.
4
5       GNUnet is free software: you can redistribute it and/or modify it
6       under the terms of the GNU Affero General Public License as published
7       by the Free Software Foundation, either version 3 of the License,
8       or (at your option) any later version.
9
10       GNUnet is distributed in the hope that it will be useful, but
11       WITHOUT ANY WARRANTY; without even the implied warranty of
12       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13       Affero General Public License for more details.
14
15       You should have received a copy of the GNU Affero General Public License
16       along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
19  */
20
21
22 /**
23  * @file consensus/consensus_protocol.h
24  * @brief p2p message definitions for consensus
25  * @author Florian Dold
26  */
27
28 #ifndef GNUNET_CONSENSUS_PROTOCOL_H
29 #define GNUNET_CONSENSUS_PROTOCOL_H
30
31 #include "platform.h"
32 #include "gnunet_util_lib.h"
33 #include "gnunet_common.h"
34 #include "gnunet_protocols.h"
35
36
37 GNUNET_NETWORK_STRUCT_BEGIN
38
39 /**
40  * Sent as context message for set reconciliation.
41  *
42  * Essentially contains all the fields
43  * from 'struct TaskKey', but in NBO.
44  */
45 struct GNUNET_CONSENSUS_RoundContextMessage {
46   /**
47    * Type: #GNUNET_MESSAGE_TYPE_CONSENSUS_P2P_ROUND_CONTEXT
48    */
49   struct GNUNET_MessageHeader header;
50
51   /**
52    * A value from 'enum PhaseKind'.
53    */
54   uint16_t kind GNUNET_PACKED;
55
56   /**
57    * Number of the first peer
58    * in canonical order.
59    */
60   int16_t peer1 GNUNET_PACKED;
61
62   /**
63    * Number of the second peer in canonical order.
64    */
65   int16_t peer2 GNUNET_PACKED;
66
67   /**
68    * Repetition of the gradecast phase.
69    */
70   int16_t repetition GNUNET_PACKED;
71
72   /**
73    * Leader in the gradecast phase.
74    *
75    * Can be different from both peer1 and peer2.
76    */
77   int16_t leader GNUNET_PACKED;
78
79   /**
80    * Non-zero if this set reconciliation
81    * had elements removed because they were contested.
82    *
83    * Will be considered when grading broadcasts.
84    *
85    * Ignored for set operations that are not within gradecasts.
86    */
87   uint16_t is_contested GNUNET_PACKED;
88 };
89
90
91 enum {
92   CONSENSUS_MARKER_CONTESTED = 1,
93   CONSENSUS_MARKER_SIZE = 2,
94 };
95
96
97 /**
98  * Consensus element, either marker or payload.
99  */
100 struct ConsensusElement {
101   /**
102    * Payload element_type, only valid
103    * if this is not a marker element.
104    */
105   uint16_t payload_type GNUNET_PACKED;
106
107   /**
108    * Is this a marker element?
109    */
110   uint8_t marker;
111
112   /* rest: element data */
113 };
114
115
116 struct ConsensusSizeElement {
117   struct ConsensusElement ce;
118
119   uint64_t size GNUNET_PACKED;
120   uint8_t sender_index;
121 };
122
123 struct ConsensusStuffedElement {
124   struct ConsensusElement ce;
125   struct GNUNET_HashCode rand GNUNET_PACKED;
126 };
127
128
129 GNUNET_NETWORK_STRUCT_END
130
131 #endif