#include "gnunet_util_lib.h"
-
-/**
- * Stream message types
- */
-enum GNUNET_STREAM_MessageType
- {
- /**
- * Message containing data
- */
- GNUNET_STREAM_MESSAGE_DATA,
-
- /**
- * ACK message
- */
- GNUNET_STREAM_MESSAGE_ACK,
-
- /**
- * Handshake hello message
- */
- GNUNET_STREAM_MESSAGE_HELLO,
-
- /**
- * Handshake hello acknowledgement message
- */
- GNUNET_STREAM_MESSAGE_HELLO_ACK,
-
- /**
- * Reset message
- */
- GNUNET_STREAM_MESSAGE_RESET,
-
- /**
- * Transmit close message (data transmission no longer possible after this
- * message)
- */
- GNUNET_STREAM_MESSAGE_TRANSMIT_CLOSE,
-
- /**
- * Transmit close acknowledgement message
- */
- GNUNET_STREAM_MESSAGE_TRANSMIT_CLOSE_ACK,
-
- /**
- * Receive close message (data is no loger read by the receiver after this
- * message)
- */
- GNUNET_STREAM_MESSAGE_RECEIVE_CLOSE,
-
- /**
- * Receive close acknowledgement message
- */
- GNUNET_STREAM_MESSAGE_RECEIVE_CLOSE_ACK,
-
- /**
- * Stream close message (data is no longer sent or read after this message)
- */
- GNUNET_STREAM_MESSAGE_CLOSE,
-
- /**
- * Close acknowledgement message
- */
- GNUNET_STREAM_MESSAGE_CLOSE_ACK
- };
+GNUNET_NETWORK_STRUCT_BEGIN
/**
* The stream message header
- *
- * The message can be of Data, Acknowledgement or both
+ * All messages of STREAM should commonly have this as header
*/
struct GNUNET_STREAM_MessageHeader
{
struct GNUNET_MessageHeader header;
/**
- * A number which identifies a session between the two peers.
+ * A number which identifies a session between the two peers. FIXME: not needed
*/
- uint32_t session_id;
+ uint32_t session_id GNUNET_PACKED;
};
*/
struct GNUNET_STREAM_MessageHeader header;
+ /**
+ * Sequence number; starts with a random value. (Just in case
+ * someone breaks mesh and is able to try to do a Sequence
+ * Prediction Attack on us.)
+ */
+ uint32_t sequence_number GNUNET_PACKED;
+
/**
* number of milliseconds to the soft deadline for sending acknowledgement
* measured from the time this message is received. It is optimal for the
*/
struct GNUNET_TIME_RelativeNBO ack_deadline;
- /**
- * Sequence number; starts with a random value. (Just in case
- * someone breaks mesh and is able to try to do a Sequence
- * Prediction Attack on us.)
- */
- uint32_t sequence_number;
-
/**
* Offset of the packet in the overall stream, modulo 2^32; allows
* the receiver to calculate where in the destination buffer the
- * message should be placed.
+ * message should be placed. In network byte order.
*/
- uint32_t offset;
+ uint32_t offset GNUNET_PACKED;
/**
* The data should be appended here
*/
};
+
+/**
+ * Number of bits in GNUNET_STREAM_AckBitmap
+ */
+#define GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH 64
+
/**
* The Selective Acknowledgement Bitmap
*/
* The Selective Acknowledgement Bitmap. Computed relative to the base_seq
* (bit n corresponds to the Data message with sequence number base_seq+n)
*/
- GNUNET_STREAM_AckBitmap bitmap;
+ GNUNET_STREAM_AckBitmap bitmap GNUNET_PACKED;
/**
- * The sequence number of the Data Message upto which the receiver has filled
- * its buffer without any missing packets
+ * The sequence number of the next Data Message receiver is
+ * anticipating. Data messages less than this number are received by receiver
*/
- uint32_t base_sequence_number;
+ uint32_t base_sequence_number GNUNET_PACKED;
/**
* Available buffer space past the last acknowledged buffer (for flow control),
* in bytes.
*/
- uint32_t receive_window_remaining;
+ uint32_t receive_window_remaining GNUNET_PACKED;
};
/**
- * states in the Protocol
+ * Message for Acknowledging HELLO
*/
-enum GNUNET_STREAM_State
- {
- GNUNET_STREAM_STATE_INIT,
-
- GNUNET_STREAM_STATE_LISTEN,
-
- GNUNET_STREAM_STATE_HANDSHAKE_WAIT,
-
- GNUNET_STREAM_STATE_ESTABLISHED,
+struct GNUNET_STREAM_HelloAckMessage
+{
+ /**
+ * The stream message header
+ */
+ struct GNUNET_STREAM_MessageHeader header;
- GNUNET_STREAM_STATE_RECEIVE_CLOSE_WAIT,
+ /**
+ * The selected sequence number. Following data tranmissions from the sender
+ * start with this sequence
+ */
+ uint32_t sequence_number GNUNET_PACKED;
- GNUNET_STREAM_STATE_RECEIVE_CLOSED,
+ /**
+ * The size(in bytes) of the receive window on the peer sending this message
+ *
+ * FIXME: Remove if not needed
+ */
+ uint32_t receiver_window_size GNUNET_PACKED;
+};
- GNUNET_STREAM_STATE_TRANSMIT_CLOSE_WAIT,
- GNUNET_STREAM_STATE_TRANSMIT_CLOSED,
+/**
+ * The Transmit close message(used to signal transmission is closed)
+ */
+struct GNUNET_STREAM_TransmitCloseMessage
+{
+ /**
+ * The stream message header
+ */
+ struct GNUNET_STREAM_MessageHeader header;
- GNUNET_STREAM_STATE_CLOSE_WAIT,
+ /**
+ * The last sequence number of the packet after which the transmission has
+ * ended
+ */
+ uint32_t final_sequence_number GNUNET_PACKED;
+};
- GNUNET_STREAM_STATE_CLOSED
- }
+GNUNET_NETWORK_STRUCT_END
#if 0 /** keep Emacsens' auto-indent happy */