- Changes for long churn (test with 10 peers)
[oweals/gnunet.git] / src / stream / stream_protocol.h
1 /*
2      This file is part of GNUnet.
3      (C) 2012 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      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      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file stream/stream_protocol.h
23  * @brief P2P protocol for the stream connections
24  * @author Sree Harsha Totakura
25  */
26
27 #ifndef STREAM_PROTOCOL_H
28 #define STREAM_PROTOCOL_H
29
30 #ifdef  __cplusplus
31 extern "C"
32 {
33 #if 0                           /* keep Emacsens' auto-indent happy */
34 }
35 #endif
36 #endif
37
38 #include "gnunet_util_lib.h"
39
40 GNUNET_NETWORK_STRUCT_BEGIN
41
42
43 /**
44  * The stream message header
45  * All messages of STREAM should commonly have this as header
46  */
47 struct GNUNET_STREAM_MessageHeader
48 {
49   /**
50    * The GNUNET message header, types are from GNUNET_MESSAGE_TYPE_STREAM_*-range.
51    */
52   struct GNUNET_MessageHeader header;
53
54   /**
55    * A number which identifies a session between the two peers. FIXME: not needed
56    */
57   uint32_t session_id GNUNET_PACKED;
58
59 };
60
61
62 /**
63  * The Data message, should be prefixed with stream header with its type set to
64  * GNUNET_STREAM_Data 
65  */
66 struct GNUNET_STREAM_DataMessage
67 {
68
69   /**
70    * Type is  GNUNET_MESSAGE_TYPE_STREAM_DATA 
71    */
72   struct GNUNET_STREAM_MessageHeader header;
73
74   /**
75    * Sequence number; starts with a random value.  (Just in case
76    * someone breaks mesh and is able to try to do a Sequence
77    * Prediction Attack on us.)
78    */
79   uint32_t sequence_number GNUNET_PACKED;
80
81   /**
82    * number of milliseconds to the soft deadline for sending acknowledgement
83    * measured from the time this message is received. It is optimal for the
84    * communication to send the ack within the soft deadline
85    */
86   struct GNUNET_TIME_RelativeNBO ack_deadline;
87
88   /**
89    * Offset of the packet in the overall stream, modulo 2^32; allows
90    * the receiver to calculate where in the destination buffer the
91    * message should be placed.  In network byte order.
92    *
93    * FIXME: if all the packets except the last one are of constant size we
94    * don't need this anymore
95    */
96   uint32_t offset GNUNET_PACKED;
97
98   /**
99    * The data should be appended here
100    */
101 };
102
103
104 /**
105  * Number of bits in GNUNET_STREAM_AckBitmap
106  */
107 #define GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH 64
108
109 /**
110  * The Selective Acknowledgement Bitmap
111  */
112 typedef uint64_t GNUNET_STREAM_AckBitmap;
113
114
115 /**
116  * The Acknowledgment Message to confirm receipt of DATA.
117  */
118 struct GNUNET_STREAM_AckMessage
119 {
120
121   /**
122    * Type is  GNUNET_MESSAGE_TYPE_STREAM_ACK
123    */
124   struct GNUNET_STREAM_MessageHeader header;
125
126   /**
127    * The Selective Acknowledgement Bitmap. Computed relative to the base_seq
128    * (bit n corresponds to the Data message with sequence number base_seq+n)
129    */
130   GNUNET_STREAM_AckBitmap bitmap GNUNET_PACKED;
131
132   /**
133    * The sequence number of the Data Message upto which the receiver has filled
134    * its buffer without any missing packets
135    *
136    * FIXME: Do we need this?
137    */
138   uint32_t base_sequence_number GNUNET_PACKED;
139
140   /**
141    * Available buffer space past the last acknowledged buffer (for flow control),
142    * in bytes.
143    */
144   uint32_t receive_window_remaining GNUNET_PACKED;
145 };
146
147
148 /**
149  * Message for Acknowledging HELLO
150  */
151 struct GNUNET_STREAM_HelloAckMessage
152 {
153   /**
154    * The stream message header
155    */
156   struct GNUNET_STREAM_MessageHeader header;
157
158   /**
159    * The selected sequence number. Following data tranmissions from the sender
160    * start with this sequence
161    */
162   uint32_t sequence_number;
163
164   /**
165    * The size(in bytes) of the receive window on the peer sending this message
166    *
167    * FIXME: Remove if not needed
168    */
169   uint32_t receive_window_size;
170 };
171
172
173 /**
174  * The Transmit close message(used to signal transmission is closed)
175  */
176 struct GNUNET_STREAM_TransmitCloseMessage
177 {
178   /**
179    * The stream message header
180    */
181   struct GNUNET_STREAM_MessageHeader header;
182
183   /**
184    * The last sequence number of the packet after which the transmission has
185    * ended 
186    */
187   uint32_t final_sequence_number GNUNET_PACKED;
188 };
189
190 GNUNET_NETWORK_STRUCT_END
191
192
193 #if 0                           /** keep Emacsens' auto-indent happy */
194 {
195 #endif
196 #ifdef __cplusplus
197 }
198 #endif
199
200 #endif  /* STREAM_PROTOCOL_H */