[openssl-dev] DTLS retransmission api

Matt Caswell matt at openssl.org
Wed Jun 1 11:58:04 UTC 2016



On 01/06/16 11:15, Alfred E. Heggestad wrote:
> hi,
> 
> we are using DTLS from OpenSSL to implement DTLS-SRTP in our
> product (Wire.com) .. The code and implementation works really well
> and is very robust. We are using OpenSSL version 1.0.2g
> 
> 
> since our product is deployed globally on mobile data networks,
> we have quite variable latency and packetloss. The patch below
> shows my working code, it has an initial retransmit timeout
> of 400 ms which is incrementing by 10% for every re-trans.
> 
> 
> obviously this patch cannot make it into the official tree.
> 
> 
> but I would like to discuss with you guys the option to
> add some kind of API for:
> 
> - Setting the initial RTO for DTLS (in milliseconds).
> - Setting the retransmit policy for DTLS, i.e. should it
>   double or increment by X for every re-trans.

I think an API for that would be a great idea. Perhaps a callback could
be used so that you can set exactly the policy you want?

> 
> 
> in addition we have seen the code hit this assert
> in production:
> 
> 
>   /*OPENSSL_assert(0);*/ /* XDTLS: want to see if we ever get here */
> 
> 
> so I would say it should be safe to remove it.

Hmmmmm....the question is why does it get there? It shouldn't.


Matt


> 
> 
> 
> 
> Best Regards,
> 
> Alfred E. Heggestad
> Berlin
> 
> 
> 
> -- 
> 
> diff -Naur openssl-1.0.2g/ssl/d1_lib.c openssl/ssl/d1_lib.c
> --- openssl-1.0.2g/ssl/d1_lib.c    2016-03-01 14:35:53.000000000 +0100
> +++ openssl/ssl/d1_lib.c    2016-06-01 10:45:27.000000000 +0200
> @@ -359,6 +359,8 @@
> 
>  void dtls1_start_timer(SSL *s)
>  {
> +    struct timeval diff;
> +
>  #ifndef OPENSSL_NO_SCTP
>      /* Disable timer for SCTP */
>      if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
> @@ -369,14 +371,17 @@
> 
>      /* If timer is not set, initialize duration with 1 second */
>      if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec
> == 0) {
> -        s->d1->timeout_duration = 1;
> +        s->d1->timeout_duration = 0.400;
>      }
> 
>      /* Set timeout to current time */
>      get_current_time(&(s->d1->next_timeout));
> 
>      /* Add duration to current time */
> -    s->d1->next_timeout.tv_sec += s->d1->timeout_duration;
> +    diff.tv_sec  = 0;
> +    diff.tv_usec = 1000000*s->d1->timeout_duration;
> +    timeradd(&s->d1->next_timeout, &diff, &s->d1->next_timeout);
> +
>      BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
>               &(s->d1->next_timeout));
>  }
> @@ -441,7 +446,7 @@
> 
>  void dtls1_double_timeout(SSL *s)
>  {
> -    s->d1->timeout_duration *= 2;
> +    s->d1->timeout_duration *= 1.10;
>      if (s->d1->timeout_duration > 60)
>          s->d1->timeout_duration = 60;
>      dtls1_start_timer(s);
> diff -Naur openssl-1.0.2g/ssl/d1_pkt.c openssl/ssl/d1_pkt.c
> --- openssl-1.0.2g/ssl/d1_pkt.c    2016-03-01 14:35:53.000000000 +0100
> +++ openssl/ssl/d1_pkt.c    2016-03-08 14:39:44.000000000 +0100
> @@ -1502,7 +1502,7 @@
>       * will happen with non blocking IO
>       */
>      if (s->s3->wbuf.left != 0) {
> -        OPENSSL_assert(0);      /* XDTLS: want to see if we ever get
> here */
> +        /*OPENSSL_assert(0);*/      /* XDTLS: want to see if we ever
> get here */
>          return (ssl3_write_pending(s, type, buf, len));
>      }
> 
> diff -Naur openssl-1.0.2g/ssl/dtls1.h openssl/ssl/dtls1.h
> --- openssl-1.0.2g/ssl/dtls1.h    2016-03-01 14:35:53.000000000 +0100
> +++ openssl/ssl/dtls1.h    2016-03-08 14:39:44.000000000 +0100
> @@ -225,8 +225,8 @@
>       * Indicates when the last handshake msg or heartbeat sent will
> timeout
>       */
>      struct timeval next_timeout;
> -    /* Timeout duration */
> -    unsigned short timeout_duration;
> +    /* Timeout duration in Seconds */
> +    double timeout_duration;
>      /*
>       * storage for Alert/Handshake protocol data received but not yet
>       * processed by ssl3_read_bytes:
> 
> 


More information about the openssl-dev mailing list