doc
[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
56 /**
57  * The Data message, should be prefixed with stream header with its type set to
58  * GNUNET_STREAM_Data 
59  */
60 struct GNUNET_STREAM_DataMessage
61 {
62
63   /**
64    * Type is  GNUNET_MESSAGE_TYPE_STREAM_DATA 
65    */
66   struct GNUNET_STREAM_MessageHeader header;
67
68   /**
69    * Sequence number; starts with a random value.  (Just in case
70    * someone breaks mesh and is able to try to do a Sequence
71    * Prediction Attack on us.)
72    */
73   uint32_t sequence_number GNUNET_PACKED;
74
75   /**
76    * number of milliseconds to the soft deadline for sending acknowledgement
77    * measured from the time this message is received. It is optimal for the
78    * communication to send the ack within the soft deadline
79    */
80   struct GNUNET_TIME_RelativeNBO ack_deadline;
81
82   /**
83    * Offset of the packet in the overall stream, modulo 2^32; allows
84    * the receiver to calculate where in the destination buffer the
85    * message should be placed.  In network byte order.
86    */
87   uint32_t offset GNUNET_PACKED;
88
89   /**
90    * The data should be appended here
91    */
92 };
93
94
95 /**
96  * Number of bits in GNUNET_STREAM_AckBitmap
97  */
98 #define GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH 64
99
100 /**
101  * The Selective Acknowledgement Bitmap
102  */
103 typedef uint64_t GNUNET_STREAM_AckBitmap;
104
105
106 /**
107  * The Acknowledgment Message to confirm receipt of DATA.
108  */
109 struct GNUNET_STREAM_AckMessage
110 {
111
112   /**
113    * Type is  GNUNET_MESSAGE_TYPE_STREAM_ACK
114    */
115   struct GNUNET_STREAM_MessageHeader header;
116
117   /**
118    * The sequence number of the next Data Message receiver is
119    * anticipating. Data messages less than this number are received by receiver
120    */
121   uint32_t base_sequence_number GNUNET_PACKED;
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    * Available buffer space past the last acknowledged buffer (for flow control),
131    * in bytes.
132    */
133   uint32_t receive_window_remaining GNUNET_PACKED;
134 };
135
136
137 /**
138  * Message for Acknowledging HELLO
139  */
140 struct GNUNET_STREAM_HelloAckMessage
141 {
142   /**
143    * The stream message header
144    */
145   struct GNUNET_STREAM_MessageHeader header;
146
147   /**
148    * The selected sequence number. Following data tranmissions from the sender
149    * start with this sequence
150    */
151   uint32_t sequence_number GNUNET_PACKED;
152
153   /**
154    * The size(in bytes) of the receive window on the peer sending this message
155    *
156    * FIXME: Remove if not needed
157    */
158   uint32_t receiver_window_size GNUNET_PACKED;
159 };
160
161
162 /**
163  * The Transmit close message(used to signal transmission is closed)
164  * FIXME: dead struct?
165  */
166 struct GNUNET_STREAM_TransmitCloseMessage
167 {
168   /**
169    * The stream message header
170    */
171   struct GNUNET_STREAM_MessageHeader header;
172
173   /**
174    * The last sequence number of the packet after which the transmission has
175    * ended 
176    */
177   uint32_t final_sequence_number GNUNET_PACKED;
178 };
179
180 GNUNET_NETWORK_STRUCT_END
181
182
183 #if 0                           /** keep Emacsens' auto-indent happy */
184 {
185 #endif
186 #ifdef __cplusplus
187 }
188 #endif
189
190 #endif  /* STREAM_PROTOCOL_H */