diff --git a/src/wolfio.c b/src/wolfio.c index 42762922e..875811aa1 100644 --- a/src/wolfio.c +++ b/src/wolfio.c @@ -2128,20 +2128,40 @@ int MicriumReceive(WOLFSSL *ssl, char *buf, int sz, void *ctx) NET_SOCK_RTN_CODE ret; NET_ERR err; -#ifdef WOLFSSL_DTLS + #ifdef WOLFSSL_DTLS { int dtls_timeout = wolfSSL_dtls_get_current_timeout(ssl); - if (wolfSSL_dtls(ssl) - && !wolfSSL_dtls_get_using_nonblock(ssl) - && dtls_timeout != 0) { + /* Don't use ssl->options.handShakeDone since it is true even if + * we are in the process of renegotiation */ + byte doDtlsTimeout = ssl->options.handShakeState != HANDSHAKE_DONE; + #ifdef WOLFSSL_DTLS13 + if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) { + if ( + doDtlsTimeout = + doDtlsTimeout || ssl->dtls13Rtx.rtxRecords != NULL || + (ssl->dtls13FastTimeout && ssl->dtls13Rtx.seenRecords != NULL); + } + #endif /* WOLFSSL_DTLS13 */ + + if (!doDtlsTimeout) + dtls_timeout = 0; + + if (!wolfSSL_dtls_get_using_nonblock(ssl)) { /* needs timeout in milliseconds */ + #ifdef WOLFSSL_DTLS13 + if (wolfSSL_dtls13_use_quick_timeout(ssl) && + IsAtLeastTLSv1_3(ssl->version) && (dtls_timeout >= 4)) { + dtls_timeout = dtls_timeout / 4; + } + #endif /* WOLFSSL_DTLS13 */ + NetSock_CfgTimeoutRxQ_Set(sd, dtls_timeout * 1000, &err); if (err != NET_SOCK_ERR_NONE) { WOLFSSL_MSG("NetSock_CfgTimeoutRxQ_Set failed"); } } } -#endif + #endif ret = NetSock_RxData(sd, buf, sz, ssl->rflags, &err); if (ret < 0) {