diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2012-02-08 22:04:20 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2012-02-08 22:04:20 +0100 |
commit | da7ed7be8266fe7c478533342aea4a9bdb651d5d (patch) | |
tree | 2493854ee9df2db33f04db36aff933ae8b5362b9 /lib/gnutls_dtls.c | |
parent | 44eeb40c0fddff712223c62440f7320566061380 (diff) | |
download | gnutls-da7ed7be8266fe7c478533342aea4a9bdb651d5d.tar.gz |
avoid many allocations for transmitting DTLS packets.
Diffstat (limited to 'lib/gnutls_dtls.c')
-rw-r--r-- | lib/gnutls_dtls.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/lib/gnutls_dtls.c b/lib/gnutls_dtls.c index e6cf0e44c8..7ff80e7432 100644 --- a/lib/gnutls_dtls.c +++ b/lib/gnutls_dtls.c @@ -37,10 +37,12 @@ /* This function fragments and transmits a previously buffered - * outgoing message. */ + * outgoing message. It accepts mtu_data which is a buffer to + * be reused (should be set to NULL initially). + */ static inline int transmit_message (gnutls_session_t session, - mbuffer_st *bufel) + mbuffer_st *bufel, uint8_t **buf) { uint8_t *data, *mtu_data; int ret = 0; @@ -60,10 +62,12 @@ transmit_message (gnutls_session_t session, _mbuffer_get_uhead_size(bufel), 0); } - mtu_data = gnutls_malloc(mtu + DTLS_HANDSHAKE_HEADER_SIZE); - if (mtu_data == NULL) + *buf = gnutls_realloc_fast(*buf, mtu + DTLS_HANDSHAKE_HEADER_SIZE); + if (*buf == NULL) return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); + mtu_data = *buf; + data = _mbuffer_get_udata_ptr( bufel); data_size = _mbuffer_get_udata_size(bufel); @@ -111,8 +115,6 @@ transmit_message (gnutls_session_t session, } } - gnutls_free (mtu_data); - return ret; } @@ -167,6 +169,7 @@ int _dtls_transmit (gnutls_session_t session) { int ret; +uint8_t* buf = NULL; /* PREPARING -> SENDING state transition */ mbuffer_head_st *const send_buffer = @@ -221,10 +224,22 @@ int ret; for (cur = send_buffer->head; cur != NULL; cur = cur->next) { - transmit_message (session, cur); + ret = transmit_message (session, cur, &buf); + if (ret < 0) + { + gnutls_assert(); + goto cleanup; + } + last_type = cur->htype; } + if (buf != NULL) + { + gnutls_free(buf); + buf = NULL; + } + if (session->internals.dtls.flight_init == 0) { session->internals.dtls.flight_init = 1; @@ -285,6 +300,8 @@ int ret; ret = 0; cleanup: + if (buf != NULL) + gnutls_free(buf); _gnutls_dtls_log ("DTLS[%p]: End of flight transmission.\n", session); session->internals.dtls.flight_init = 0; |