summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bastien-Filiatrault <joe@x2a.org>2009-08-03 21:42:21 -0400
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2011-02-17 22:43:19 +0100
commit9146c8b33956ba1f84fb94f3110f5758080d379b (patch)
tree777fb619997619d3aa1ff558334dcf8b5f84097e
parentd36efeead48027dc8ea4f05dac89c1ea65f45d6a (diff)
downloadgnutls-9146c8b33956ba1f84fb94f3110f5758080d379b.tar.gz
Add structures for the buffered outgoing flight.
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
-rw-r--r--lib/gnutls_int.h25
-rw-r--r--lib/gnutls_state.c3
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/gnutls_int.h b/lib/gnutls_int.h
index 7a54723224..eb84130334 100644
--- a/lib/gnutls_int.h
+++ b/lib/gnutls_int.h
@@ -526,6 +526,27 @@ typedef struct
int free_rsa_params;
} internal_params_st;
+struct dtls_hsk_retransmit_buffer;
+typedef struct dtls_hsk_retransmit_buffer dtls_hsk_retransmit_buffer;
+
+/* This is a linked list used to buffer the next flight of outgoing
+ handshake messages. Messages are queued whole; they are fragmented
+ dynamically on transmit. */
+struct dtls_hsk_retransmit_buffer
+{
+ dtls_hsk_retransmit_buffer *next;
+
+ /* The actual handshake message */
+ gnutls_datum_t msg;
+
+ /* Record layer epoch of message */
+ uint16_t epoch;
+
+ /* Handshake layer type and sequence of message */
+ gnutls_handshake_description_t type;
+ uint16_t sequence;
+};
+
/* DTLS session state
*/
typedef struct
@@ -540,6 +561,10 @@ typedef struct
uint16_t hsk_write_seq;
uint16_t hsk_read_seq;
uint16_t hsk_mtu;
+
+ /* Head of the next outgoing flight. */
+ dtls_hsk_retransmit_buffer *retransmit;
+ dtls_hsk_retransmit_buffer **retransmit_end;
} dtls_st;
diff --git a/lib/gnutls_state.c b/lib/gnutls_state.c
index 743975db26..afdbb02009 100644
--- a/lib/gnutls_state.c
+++ b/lib/gnutls_state.c
@@ -391,6 +391,9 @@ gnutls_init_dtls (gnutls_session_t * session,
(*session)->internals.dtls.hsk_mtu = DTLS_DEFAULT_MTU;
(*session)->internals.transport = GNUTLS_DGRAM;
+ /* Initialize pointer used to enqueue messages for retransmit. */
+ (*session)->internals.dtls.retransmit_end = &(*session)->internals.dtls.retransmit;
+
return 0;
}