mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-02-10 16:57:00 +08:00
tlslib: abstracted the recv_packet functions
This commit is contained in:
52
src/tlslib.c
52
src/tlslib.c
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2013, 2014 Nikos Mavrogiannopoulos
|
||||
* Copyright (C) 2013-2016 Nikos Mavrogiannopoulos
|
||||
* Copyright (C) 2015-2016 Red Hat, Inc.
|
||||
*
|
||||
* This file is part of ocserv.
|
||||
*
|
||||
@@ -134,6 +135,32 @@ int ret;
|
||||
return total;
|
||||
}
|
||||
|
||||
ssize_t cstp_recv_packet(worker_st *ws, gnutls_datum_t *data, void **p)
|
||||
{
|
||||
int ret;
|
||||
#ifdef ZERO_COPY
|
||||
gnutls_packet_t packet = NULL;
|
||||
|
||||
if (ws->session != NULL) {
|
||||
ret = gnutls_record_recv_packet(ws->session, &packet);
|
||||
if (ret > 0) {
|
||||
*p = packet;
|
||||
gnutls_packet_get(packet, data, NULL);
|
||||
}
|
||||
} else {
|
||||
ret = cstp_recv_nb(ws, ws->buffer, ws->buffer_size);
|
||||
data->data = ws->buffer;
|
||||
data->size = ret;
|
||||
}
|
||||
|
||||
#else
|
||||
ret = cstp_recv_nb(ws, ws->buffer, ws->buffer_size);
|
||||
data->data = ws->buffer;
|
||||
data->size = ret;
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Restores gnutls_record_recv() on EAGAIN */
|
||||
ssize_t cstp_recv(worker_st *ws, void *data, size_t data_size)
|
||||
{
|
||||
@@ -283,6 +310,29 @@ void cstp_fatal_close(worker_st *ws,
|
||||
}
|
||||
}
|
||||
|
||||
ssize_t dtls_recv_packet(worker_st *ws, gnutls_datum_t *data, void **p)
|
||||
{
|
||||
int ret;
|
||||
#ifdef ZERO_COPY
|
||||
gnutls_packet_t packet = NULL;
|
||||
|
||||
ret = gnutls_record_recv_packet(ws->dtls_session, &packet);
|
||||
if (ret > 0) {
|
||||
gnutls_packet_get(packet, data, NULL);
|
||||
*p = packet;
|
||||
} else {
|
||||
data->size = 0;
|
||||
}
|
||||
#else
|
||||
ret =
|
||||
gnutls_record_recv(ws->dtls_session, ws->buffer, ws->buffer_size);
|
||||
data->data = ws->buffer;
|
||||
data->size = ret;
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t dtls_send(worker_st *ws, const void *data,
|
||||
size_t data_size)
|
||||
{
|
||||
|
||||
20
src/tlslib.h
20
src/tlslib.h
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Nikos Mavrogiannopoulos
|
||||
* Copyright (C) 2013-2016 Nikos Mavrogiannopoulos
|
||||
* Copyright (C) 2015-2016 Red Hat, Inc.
|
||||
*
|
||||
* Author: Nikos Mavrogiannopoulos
|
||||
*
|
||||
@@ -31,6 +32,10 @@
|
||||
# define GNUTLS_DTLS1_2 202
|
||||
# endif
|
||||
|
||||
# if GNUTLS_VERSION_NUMBER >= 0x030305
|
||||
# define ZERO_COPY
|
||||
# endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
struct htable *ht;
|
||||
@@ -126,4 +131,17 @@ int cstp_uncork(struct worker_st *ws);
|
||||
void dtls_close(struct worker_st *ws);
|
||||
ssize_t dtls_send(struct worker_st *ws, const void *data, size_t data_size);
|
||||
|
||||
/* packet API */
|
||||
inline static void packet_deinit(void *p)
|
||||
{
|
||||
#ifdef ZERO_COPY
|
||||
gnutls_packet_t packet = p;
|
||||
if (packet)
|
||||
gnutls_packet_deinit(packet);
|
||||
#endif
|
||||
}
|
||||
|
||||
ssize_t cstp_recv_packet(struct worker_st *ws, gnutls_datum_t *data, void **p);
|
||||
ssize_t dtls_recv_packet(struct worker_st *ws, gnutls_datum_t *data, void **p);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -58,10 +58,6 @@
|
||||
|
||||
#include <http_parser.h>
|
||||
|
||||
#if GNUTLS_VERSION_NUMBER >= 0x030305
|
||||
# define ZERO_COPY
|
||||
#endif
|
||||
|
||||
#define MIN_MTU(ws) (((ws)->vinfo.ipv6!=NULL)?1281:257)
|
||||
|
||||
#define PERIODIC_CHECK_TIME 30
|
||||
@@ -915,9 +911,7 @@ static int dtls_mainloop(worker_st * ws, struct timespec *tnow)
|
||||
{
|
||||
int ret;
|
||||
gnutls_datum_t data;
|
||||
#ifdef ZERO_COPY
|
||||
gnutls_packet_t packet = NULL;
|
||||
#endif
|
||||
void *packet = NULL;
|
||||
|
||||
switch (ws->udp_state) {
|
||||
case UP_ACTIVE:
|
||||
@@ -933,19 +927,7 @@ static int dtls_mainloop(worker_st * ws, struct timespec *tnow)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ZERO_COPY
|
||||
ret = gnutls_record_recv_packet(ws->dtls_session, &packet);
|
||||
if (ret > 0) {
|
||||
gnutls_packet_get(packet, &data, NULL);
|
||||
} else {
|
||||
data.size = 0;
|
||||
}
|
||||
#else
|
||||
ret =
|
||||
gnutls_record_recv(ws->dtls_session, ws->buffer, ws->buffer_size);
|
||||
data.data = ws->buffer;
|
||||
data.size = ret;
|
||||
#endif
|
||||
ret = dtls_recv_packet(ws, &data, &packet);
|
||||
oclog(ws, LOG_TRANSFER_DEBUG,
|
||||
"received %d byte(s) (DTLS)", ret);
|
||||
|
||||
@@ -1062,10 +1044,7 @@ static int dtls_mainloop(worker_st * ws, struct timespec *tnow)
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
#ifdef ZERO_COPY
|
||||
if (packet)
|
||||
gnutls_packet_deinit(packet);
|
||||
#endif
|
||||
packet_deinit(packet);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1073,24 +1052,9 @@ static int tls_mainloop(struct worker_st *ws, struct timespec *tnow)
|
||||
{
|
||||
int ret;
|
||||
gnutls_datum_t data;
|
||||
#ifdef ZERO_COPY
|
||||
gnutls_packet_t packet = NULL;
|
||||
void *packet = NULL;
|
||||
|
||||
if (ws->session != NULL) {
|
||||
ret = gnutls_record_recv_packet(ws->session, &packet);
|
||||
if (ret > 0) {
|
||||
gnutls_packet_get(packet, &data, NULL);
|
||||
}
|
||||
} else {
|
||||
ret = cstp_recv_nb(ws, ws->buffer, ws->buffer_size);
|
||||
data.data = ws->buffer;
|
||||
data.size = ret;
|
||||
}
|
||||
#else
|
||||
ret = cstp_recv_nb(ws, ws->buffer, ws->buffer_size);
|
||||
data.data = ws->buffer;
|
||||
data.size = ret;
|
||||
#endif
|
||||
ret = cstp_recv_packet(ws, &data, &packet);
|
||||
CSTP_FATAL_ERR_CMD(ws, ret, exit_worker_reason(ws, REASON_ERROR));
|
||||
|
||||
if (ret == 0) { /* disconnect */
|
||||
@@ -1139,10 +1103,7 @@ static int tls_mainloop(struct worker_st *ws, struct timespec *tnow)
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
#ifdef ZERO_COPY
|
||||
if (packet)
|
||||
gnutls_packet_deinit(packet);
|
||||
#endif
|
||||
packet_deinit(packet);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user