-closing of control pipe is no error
[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 Data Message upto which the receiver has filled
131    * its buffer without any missing packets
132    *
133    * FIXME: Do we need this?
134    */
135   uint32_t base_sequence_number GNUNET_PACKED;
136
137   /**
138    * Available buffer space past the last acknowledged buffer (for flow control),
139    * in bytes.
140    */
141   uint32_t receive_window_remaining GNUNET_PACKED;
142 };
143
144
145 /**
146  * Message for Acknowledging HELLO
147  */
148 struct GNUNET_STREAM_HelloAckMessage
149 {
150   /**
151    * The stream message header
152    */
153   struct GNUNET_STREAM_MessageHeader header;
154
155   /**
156    * The selected sequence number. Following data tranmissions from the sender
157    * start with this sequence
158    */
159   uint32_t sequence_number;
160
161   /**
162    * The size(in bytes) of the receive window on the peer sending this message
163    *
164    * FIXME: Remove if not needed
165    */
166   uint32_t receiver_window_size;
167 };
168
169
170 /**
171  * The Transmit close message(used to signal transmission is closed)
172  */
173 struct GNUNET_STREAM_TransmitCloseMessage
174 {
175   /**
176    * The stream message header
177    */
178   struct GNUNET_STREAM_MessageHeader header;
179
180   /**
181    * The last sequence number of the packet after which the transmission has
182    * ended 
183    */
184   uint32_t final_sequence_number GNUNET_PACKED;
185 };
186
187 GNUNET_NETWORK_STRUCT_END
188
189
190 #if 0                           /** keep Emacsens' auto-indent happy */
191 {
192 #endif
193 #ifdef __cplusplus
194 }
195 #endif
196
197 #endif  /* STREAM_PROTOCOL_H */