summaryrefslogtreecommitdiff
path: root/lib/gnutls_buffers.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2011-04-03 23:42:13 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2011-04-03 23:42:20 +0200
commita736f12ec8ae65636c87bee1df779f2d8c628da9 (patch)
tree79c3595c9415abe06a0c669b45e58e8b1ff5bd3b /lib/gnutls_buffers.c
parent52b816623848d54934b7d4c8795ec6be1eaf618e (diff)
downloadgnutls-a736f12ec8ae65636c87bee1df779f2d8c628da9.tar.gz
Added support for non-blocking DTLS.
Added mini-eagain-dtls to test its operation. Improved mini-eagain.
Diffstat (limited to 'lib/gnutls_buffers.c')
-rw-r--r--lib/gnutls_buffers.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/lib/gnutls_buffers.c b/lib/gnutls_buffers.c
index 778af8d0bc..39657a0ed6 100644
--- a/lib/gnutls_buffers.c
+++ b/lib/gnutls_buffers.c
@@ -54,6 +54,7 @@
#include <system.h>
#include <gnutls_constate.h> /* gnutls_epoch_get */
#include <errno.h>
+#include <system.h>
#ifndef EAGAIN
#define EAGAIN EWOULDBLOCK
@@ -61,7 +62,7 @@
/* this is the maximum number of messages allowed to queue.
*/
-#define MAX_QUEUE 16
+#define MAX_QUEUE 32
/* Buffers received packets of type APPLICATION DATA and
* HANDSHAKE DATA.
@@ -553,7 +554,7 @@ _gnutls_io_write_flush (gnutls_session_t session)
tosend += msg.size;
/* we buffer up to MAX_QUEUE messages */
- if (i >= sizeof (iovec) / sizeof (iovec[0]))
+ if (i >= MAX_QUEUE)
{
gnutls_assert ();
return GNUTLS_E_INTERNAL_ERROR;
@@ -676,7 +677,6 @@ _gnutls_handshake_io_write_flush (gnutls_session_t session)
}
return _gnutls_io_write_flush (session);
-
}
@@ -914,7 +914,7 @@ handshake_buffer_st* recv_buf = session->internals.handshake_recv_buffer;
{
if (session->internals.handshake_recv_buffer_size == 0 ||
(session->internals.dtls.hsk_read_seq != recv_buf[LAST_ELEMENT].sequence))
- return gnutls_assert_val(GNUTLS_E_AGAIN);
+ goto timeout;
if (htype != recv_buf[LAST_ELEMENT].htype)
{
@@ -932,7 +932,7 @@ handshake_buffer_st* recv_buf = session->internals.handshake_recv_buffer;
return 0;
}
else
- return gnutls_assert_val(GNUTLS_E_AGAIN);
+ goto timeout;
}
else /* TLS */
{
@@ -949,7 +949,18 @@ handshake_buffer_st* recv_buf = session->internals.handshake_recv_buffer;
return 0;
}
else
- return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
+ return gnutls_assert_val(GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE);
+ }
+
+timeout:
+ if (time(0)-session->internals.dtls.handshake_start_time > session->internals.dtls.total_timeout/1000)
+ return gnutls_assert_val(GNUTLS_E_TIMEDOUT);
+ else
+ {
+ if (session->internals.dtls.blocking != 0)
+ millisleep(50);
+
+ return gnutls_assert_val(GNUTLS_E_AGAIN);
}
}
@@ -1108,7 +1119,7 @@ next:
while(session->internals.handshake_recv_buffer_size > 0 &&
recv_buf[LAST_ELEMENT].sequence < session->internals.dtls.hsk_read_seq)
{
- _gnutls_audit_log("Discarded replayed handshake packet with sequence %d\n", tmp.sequence);
+ _gnutls_audit_log("Discarded replayed handshake packet with sequence %d\n", recv_buf[LAST_ELEMENT].sequence);
_gnutls_handshake_buffer_clear(&recv_buf[LAST_ELEMENT]);
session->internals.handshake_recv_buffer_size--;
}
@@ -1128,8 +1139,10 @@ _gnutls_handshake_io_recv_int (gnutls_session_t session,
int ret;
ret = get_last_packet(session, htype, hsk);
- if (ret >= 0)
- return ret;
+ if (ret != GNUTLS_E_AGAIN && ret != GNUTLS_E_INTERRUPTED && ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
+ {
+ return gnutls_assert_val(ret);
+ }
/* try using the already existing records before
* trying to receive.