DTLS in gnutls

Nikos Mavrogiannopoulos nmav at gnutls.org
Tue Mar 15 15:24:13 CET 2011


On Mon, Mar 14, 2011 at 10:44 PM, Jonathan Bastien-Filiatrault
<joe at x2a.org> wrote:

>> called in DTLS. Now I emulate the synchronous behavior
>> of gnutls_handshake() by waiting for few seconds for
>> possible retransmissions by peer, and this has the
>> disadvantage of gnutls_handshake() taking a fixed amount
>> of seconds irrespective of calculations, but requires
>> no semantic changes in the rest of the functions
>> (such as gnutls_record_recv()).
>
> This is a good starting point. However, as you must be aware, this adds
> latency for the blocking case and is a Really Bad Idea in the async case.

Indeed.

> The asynchronous case can be solved simply: require applications to
> monitor the receive side even if they don't read after
> gnutls_handshake() and call gnutls_record_recv() when this happens. This
> assumes that you keep the last flight buffered neatly somewhere, ready
> to send, for a while after gnutls_handshake().
> Example sequence of events:
> - Bunch of writes
> - Event dispatch
> - Bunch of writes
> - Event dispatch
> - Retransmit receive
> - Socket readable event
> - Event dispatch
> - gnutls_record_read(). Here we read the socket, process and retransmit
> if required. If we have no application data, we can (ab)use GNUTLS_E_AGAIN.

It seems to be the only sensible solution so far. It doesn't require
much code, but needs quite some documentation :) I was thinking into
adding another non-fatal error code such as GNUTLS_E_NO_DATA
to avoid overloading of E_AGAIN... but I'll think about it again.

regards,
Nikos




More information about the Gnutls-devel mailing list