Merge branch 'license/spdx'
[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   /**
48    * Type: #GNUNET_MESSAGE_TYPE_CONSENSUS_P2P_ROUND_CONTEXT
49    */
50   struct GNUNET_MessageHeader header;
51
52   /**
53    * A value from 'enum PhaseKind'.
54    */
55   uint16_t kind GNUNET_PACKED;
56
57   /**
58    * Number of the first peer
59    * in canonical order.
60    */
61   int16_t peer1 GNUNET_PACKED;
62
63   /**
64    * Number of the second peer in canonical order.
65    */
66   int16_t peer2 GNUNET_PACKED;
67
68   /**
69    * Repetition of the gradecast phase.
70    */
71   int16_t repetition GNUNET_PACKED;
72
73   /**
74    * Leader in the gradecast phase.
75    *
76    * Can be different from both peer1 and peer2.
77    */
78   int16_t leader GNUNET_PACKED;
79
80   /**
81    * Non-zero if this set reconciliation
82    * had elements removed because they were contested.
83    *
84    * Will be considered when grading broadcasts.
85    *
86    * Ignored for set operations that are not within gradecasts.
87    */
88   uint16_t is_contested GNUNET_PACKED;
89 };
90
91
92 enum {
93   CONSENSUS_MARKER_CONTESTED = 1,
94   CONSENSUS_MARKER_SIZE = 2,
95 };
96
97
98 /**
99  * Consensus element, either marker or payload.
100  */
101 struct ConsensusElement
102 {
103   /**
104    * Payload element_type, only valid
105    * if this is not a marker element.
106    */
107   uint16_t payload_type GNUNET_PACKED;
108
109   /**
110    * Is this a marker element?
111    */
112   uint8_t marker;
113
114   /* rest: element data */
115 };
116
117
118 struct ConsensusSizeElement
119 {
120   struct ConsensusElement ce;
121
122   uint64_t size GNUNET_PACKED;
123   uint8_t sender_index;
124 };
125
126 struct ConsensusStuffedElement
127 {
128   struct ConsensusElement ce;
129   struct GNUNET_HashCode rand GNUNET_PACKED;
130 };
131
132
133 GNUNET_NETWORK_STRUCT_END
134
135 #endif