-network message struct
[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   uint32_t offset GNUNET_PACKED;
94
95   /**
96    * The data should be appended here
97    */
98 };
99
100
101 /**
102  * Number of bits in GNUNET_STREAM_AckBitmap
103  */
104 #define GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH 64
105
106 /**
107  * The Selective Acknowledgement Bitmap
108  */
109 typedef uint64_t GNUNET_STREAM_AckBitmap;
110
111
112 /**
113  * The Acknowledgment Message to confirm receipt of DATA.
114  */
115 struct GNUNET_STREAM_AckMessage
116 {
117
118   /**
119    * Type is  GNUNET_MESSAGE_TYPE_STREAM_ACK
120    */
121   struct GNUNET_STREAM_MessageHeader header;
122
123   /**
124    * The Selective Acknowledgement Bitmap. Computed relative to the base_seq
125    * (bit n corresponds to the Data message with sequence number base_seq+n)
126    */
127   GNUNET_STREAM_AckBitmap bitmap GNUNET_PACKED;
128
129   /**
130    * The sequence number of the next Data Message receiver is
131    * anticipating. Data messages less than this number are received by receiver
132    */
133   uint32_t base_sequence_number GNUNET_PACKED;
134
135   /**
136    * Available buffer space past the last acknowledged buffer (for flow control),
137    * in bytes.
138    */
139   uint32_t receive_window_remaining GNUNET_PACKED;
140 };
141
142
143 /**
144  * Message for Acknowledging HELLO
145  */
146 struct GNUNET_STREAM_HelloAckMessage
147 {
148   /**
149    * The stream message header
150    */
151   struct GNUNET_STREAM_MessageHeader header;
152
153   /**
154    * The selected sequence number. Following data tranmissions from the sender
155    * start with this sequence
156    */
157   uint32_t sequence_number GNUNET_PACKED;
158
159   /**
160    * The size(in bytes) of the receive window on the peer sending this message
161    *
162    * FIXME: Remove if not needed
163    */
164   uint32_t receiver_window_size GNUNET_PACKED;
165 };
166
167
168 /**
169  * The Transmit close message(used to signal transmission is closed)
170  */
171 struct GNUNET_STREAM_TransmitCloseMessage
172 {
173   /**
174    * The stream message header
175    */
176   struct GNUNET_STREAM_MessageHeader header;
177
178   /**
179    * The last sequence number of the packet after which the transmission has
180    * ended 
181    */
182   uint32_t final_sequence_number GNUNET_PACKED;
183 };
184
185 GNUNET_NETWORK_STRUCT_END
186
187
188 #if 0                           /** keep Emacsens' auto-indent happy */
189 {
190 #endif
191 #ifdef __cplusplus
192 }
193 #endif
194
195 #endif  /* STREAM_PROTOCOL_H */