int _dtls_retransmit(gnutls_session_t session)
{
time_t now = gnutls_time (0);
+int ret;
if (now - session->internals.dtls.last_retransmit > RETRANSMIT_WINDOW)
{
+ ret = _dtls_transmit(session);
session->internals.dtls.last_retransmit = now;
- return _dtls_transmit(session);
+ return ret;
}
else
return 0;
ret = gnutls_assert_val(GNUTLS_E_TIMEDOUT);
goto cleanup;
}
-
- _gnutls_dtls_log ("DTLS[%p]: %sStart of flight transmission.\n", session, (session->internals.dtls.flight_init == 0)?"":"re-");
-
- for (cur = send_buffer->head;
- cur != NULL; cur = cur->next)
+
+ if ((session->internals.dtls.flight_init == 0) ||
+ (now - session->internals.dtls.last_retransmit > RETRANSMIT_WINDOW))
{
- ret = transmit_message (session, cur, &buf);
- if (ret < 0)
- {
- gnutls_assert();
- goto cleanup;
- }
+ session->internals.dtls.last_retransmit = now;
- last_type = cur->htype;
- }
+ _gnutls_dtls_log ("DTLS[%p]: %sStart of flight transmission.\n", session, (session->internals.dtls.flight_init == 0)?"":"re-");
- if (buf != NULL)
- {
- gnutls_free(buf);
- buf = NULL;
- }
+ for (cur = send_buffer->head;
+ cur != NULL; cur = cur->next)
+ {
+ ret = transmit_message (session, cur, &buf);
+ if (ret < 0)
+ {
+ gnutls_assert();
+ goto cleanup;
+ }
- if (session->internals.dtls.flight_init == 0)
- {
- session->internals.dtls.flight_init = 1;
- session->internals.dtls.handshake_last_call = now;
- session->internals.dtls.actual_retrans_timeout_ms = session->internals.dtls.retrans_timeout_ms;
+ last_type = cur->htype;
+ }
- if (last_type == GNUTLS_HANDSHAKE_FINISHED)
+ if (buf != NULL)
{
- /* On the last flight we cannot ensure retransmission
- * from here. _dtls_wait_and_retransmit() is being called
- * by handshake.
- */
- session->internals.dtls.last_flight = 1;
+ gnutls_free(buf);
+ buf = NULL;
}
- else
- session->internals.dtls.last_flight = 0;
+
+ if (session->internals.dtls.flight_init == 0)
+ {
+ session->internals.dtls.flight_init = 1;
+ session->internals.dtls.handshake_last_call = now;
+ session->internals.dtls.actual_retrans_timeout_ms = session->internals.dtls.retrans_timeout_ms;
+
+ if (last_type == GNUTLS_HANDSHAKE_FINISHED)
+ {
+ /* On the last flight we cannot ensure retransmission
+ * from here. _dtls_wait_and_retransmit() is being called
+ * by handshake.
+ */
+ session->internals.dtls.last_flight = 1;
+ }
+ else
+ session->internals.dtls.last_flight = 0;
+ }
}
ret = _gnutls_io_write_flush (session);
/* This is the last flight and peer cannot be sure
* we have received it unless we notify him. So we
* wait for a message and retransmit if needed. */
- if (IS_DTLS(session) && !_dtls_is_async(session))
+ if (IS_DTLS(session) && !_dtls_is_async(session) &&
+ gnutls_record_check_pending (session) == 0)
{
ret = _dtls_wait_and_retransmit(session);
if (ret < 0)
case STATE31:
STATE = STATE31;
- if (IS_DTLS(session) && !_dtls_is_async(session))
+ if (IS_DTLS(session) && !_dtls_is_async(session) &&
+ gnutls_record_check_pending( session) == 0)
{
ret = _dtls_wait_and_retransmit(session);
if (ret < 0)
if ((type == GNUTLS_APPLICATION_DATA ||
type == GNUTLS_HANDSHAKE ||
type == GNUTLS_CHANGE_CIPHER_SPEC)
- && _gnutls_record_buffer_get_size (type, session) > 0)
+ && _gnutls_record_buffer_get_size (session) > 0)
{
int ret;
ret = _gnutls_record_buffer_get (type, session, data, data_size, seq);
*/
ssize_t
_gnutls_recv_in_buffers (gnutls_session_t session, content_type_t type,
- gnutls_handshake_description_t htype)
+ gnutls_handshake_description_t htype)
{
uint64 *packet_sequence;
uint8_t *ciphertext;