From 009e76cac3dee58472fdcd3a422d928648a0188e Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Fri, 4 Oct 2013 09:40:46 +0200 Subject: [PATCH] Do not wait for socket to be ready when sending DTLS data. --- src/tlslib.c | 25 +++++++++++++++++++++++++ src/tlslib.h | 2 ++ src/worker-vpn.c | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/tlslib.c b/src/tlslib.c index 01d68fc7..a033c96b 100644 --- a/src/tlslib.c +++ b/src/tlslib.c @@ -63,6 +63,31 @@ ssize_t tls_send(gnutls_session_t session, const void *data, return data_size; } +/* Same as tls_send() but will not retry on EAGAIN errors */ +ssize_t tls_send_nowait(gnutls_session_t session, const void *data, + size_t data_size) +{ + int ret; + int left = data_size; + const uint8_t* p = data; + + while(left > 0) { + ret = gnutls_record_send(session, p, data_size); + if (ret < 0 && ret != GNUTLS_E_INTERRUPTED) { + if (ret == GNUTLS_E_AGAIN) + return data_size; + return ret; + } + + if (ret > 0) { + left -= ret; + p += ret; + } + } + + return data_size; +} + ssize_t tls_send_file(gnutls_session_t session, const char *file) { FILE* fp; diff --git a/src/tlslib.h b/src/tlslib.h index f9556c28..aa5a96e2 100644 --- a/src/tlslib.h +++ b/src/tlslib.h @@ -14,6 +14,8 @@ int __attribute__ ((format(printf, 2, 3))) ssize_t tls_recv(gnutls_session_t session, void *data, size_t data_size); ssize_t tls_send(gnutls_session_t session, const void *data, size_t data_size); +ssize_t tls_send_nowait(gnutls_session_t session, const void *data, + size_t data_size); void tls_cork(gnutls_session_t session); int tls_uncork(gnutls_session_t session); diff --git a/src/worker-vpn.c b/src/worker-vpn.c index a9d15cdc..869e4b20 100644 --- a/src/worker-vpn.c +++ b/src/worker-vpn.c @@ -1090,7 +1090,7 @@ socklen_t sl; if (ws->udp_state == UP_ACTIVE) { ws->buffer[7] = AC_PKT_DATA; - ret = tls_send(ws->dtls_session, ws->buffer + 7, l + 1); + ret = tls_send_nowait(ws->dtls_session, ws->buffer + 7, l + 1); GNUTLS_FATAL_ERR(ret); if (ret == GNUTLS_E_LARGE_PACKET) {