Do not wait for socket to be ready when sending DTLS data.

This commit is contained in:
Nikos Mavrogiannopoulos
2013-10-04 09:40:46 +02:00
parent 6093b166d5
commit 009e76cac3
3 changed files with 28 additions and 1 deletions
+25
View File
@@ -63,6 +63,31 @@ ssize_t tls_send(gnutls_session_t session, const void *data,
return data_size; 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) ssize_t tls_send_file(gnutls_session_t session, const char *file)
{ {
FILE* fp; FILE* fp;
+2
View File
@@ -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_recv(gnutls_session_t session, void *data, size_t data_size);
ssize_t tls_send(gnutls_session_t session, const void *data, ssize_t tls_send(gnutls_session_t session, const void *data,
size_t data_size); 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); void tls_cork(gnutls_session_t session);
int tls_uncork(gnutls_session_t session); int tls_uncork(gnutls_session_t session);
+1 -1
View File
@@ -1090,7 +1090,7 @@ socklen_t sl;
if (ws->udp_state == UP_ACTIVE) { if (ws->udp_state == UP_ACTIVE) {
ws->buffer[7] = AC_PKT_DATA; 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); GNUTLS_FATAL_ERR(ret);
if (ret == GNUTLS_E_LARGE_PACKET) { if (ret == GNUTLS_E_LARGE_PACKET) {