mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-10-13 18:12:03 +08:00
Do not wait for socket to be ready when sending DTLS data.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user