]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
avoid many allocations for transmitting DTLS packets.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 8 Feb 2012 21:04:20 +0000 (22:04 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 8 Feb 2012 21:04:20 +0000 (22:04 +0100)
lib/gnutls_dtls.c

index e6cf0e44c8caac145ea453fa227cb4ed70f26e13..7ff80e74327d3ff8ee39d4940270ce116f4ba4f4 100644 (file)
 
 
 /* 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;