tlslib: abstracted the recv_packet functions

This commit is contained in:
Nikos Mavrogiannopoulos
2016-01-19 14:16:08 +01:00
parent f5e5bde862
commit f80f513e4a
3 changed files with 76 additions and 47 deletions

View File

@@ -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)
{

View File

@@ -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

View File

@@ -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;
}