From 6c88f7b55d10ed741cfcf1696dedda1322872a5d Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 18 Jan 2012 14:01:02 +0000 Subject: [PATCH] -hints for stream lib development --- src/include/gnunet_protocols.h | 9 ++++- src/stream/stream_protocol.h | 64 ++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index 5257e2587..52ae26e00 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h @@ -1186,8 +1186,15 @@ extern "C" /** - * Next available: 400 + * Message containing data exchanged between stream end-points over mesh. */ +#define GNUNET_MESSAGE_TYPE_STREAM_DATA 400 + + +/** + * Next available: 416 + */ + /******************************************************************************* * TODO: we need a way to register message types centrally (via some webpage). diff --git a/src/stream/stream_protocol.h b/src/stream/stream_protocol.h index 0624323d9..f4ad37fdd 100644 --- a/src/stream/stream_protocol.h +++ b/src/stream/stream_protocol.h @@ -35,10 +35,7 @@ extern "C" #endif #endif -#include - -#include "gnunet_stream_lib.h" -#include "gnunet_mesh_service.h" +#include "gnunet_util_lib.h" /** @@ -113,20 +110,14 @@ enum GNUNET_STREAM_MessageType struct GNUNET_STREAM_MessageHeader { /** - * The GNUNET message header + * The GNUNET message header, types are from GNUNET_MESSAGE_TYPE_STREAM_*-range. */ struct GNUNET_MessageHeader header; /** - * A number which identifies a session - */ - uint16_t session_id; - - /** - * The message type - * ? Should we rather use the type field in GNUNET_MessageHeader ? + * A number which identifies a session between the two peers. */ - enum GNUNET_STREAM_MessageType type; + uint32_t session_id; }; @@ -137,19 +128,32 @@ struct GNUNET_STREAM_MessageHeader */ struct GNUNET_STREAM_DataMessage { + /** - * Sequence number; Always starts with 0 and should wrap around. - * Immune to Sequence Prediction Attack as we take cover under GNUNET's secure - * messaging + * Type is GNUNET_MESSAGE_TYPE_STREAM_DATA */ - uint32_t seq; + struct GNUNET_STREAM_MessageHeader header; /** * number of milliseconds to the soft deadline for sending acknowledgement * measured from the time this message is received. It is optimal for the * communication to send the ack within the soft deadline */ - uint16_t ack_deadline; + 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. + */ + uint32_t offset; /** * The data should be appended here @@ -158,30 +162,38 @@ struct GNUNET_STREAM_DataMessage /** * The Selective Acknowledgement Bitmap - * - * ? WARNING ? Possibility for Denial of Service ?? - * ? Receiver may force the sender to mantain a buffer of ~ 64*64k !?? */ typedef uint64_t GNUNET_STREAM_AckBitmap; /** - * The Acknowledgment Message, should be prefixed with Stream Message header - * with its type set to GNUNET_STREAM_MESSAGE_ACK + * The Acknowledgment Message to confirm receipt of DATA. */ struct GNUNET_STREAM_AckMessage { + /** - * The sequence number of the Data Message upto which the receiver has filled - * its buffer without any missing packets + * Type is GNUNET_MESSAGE_TYPE_STREAM_ACK */ - uint32_t base_seq; + struct GNUNET_STREAM_MessageHeader header; /** * 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; + + /** + * The sequence number of the Data Message upto which the receiver has filled + * its buffer without any missing packets + */ + uint32_t base_sequence_number; + + /** + * Available buffer space past the last acknowledged buffer (for flow control), + * in bytes. + */ + uint32_t receive_window_remaining; }; -- 2.25.1