diff --git a/src/wolfio.c b/src/wolfio.c index 34a0742fc..70c6217ca 100644 --- a/src/wolfio.c +++ b/src/wolfio.c @@ -2128,20 +2128,39 @@ 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)) { + 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 */ - NetSock_CfgTimeoutRxQ_Set(sd, dtls_timeout * 1000, &err); + #ifdef WOLFSSL_DTLS13 + if (wolfSSL_dtls13_use_quick_timeout(ssl) && + IsAtLeastTLSv1_3(ssl->version)) { + dtls_timeout = (1000 * dtls_timeout) / 4; + } else + #endif /* WOLFSSL_DTLS13 */ + dtls_timeout = 1000 * dtls_timeout; + NetSock_CfgTimeoutRxQ_Set(sd, dtls_timeout, &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) { @@ -2182,20 +2201,43 @@ int MicriumReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx) NET_SOCK_ADDR_LEN peerSz = sizeof(peer); NET_SOCK_RTN_CODE ret; NET_ERR err; - int dtls_timeout = wolfSSL_dtls_get_current_timeout(ssl); WOLFSSL_ENTER("MicriumReceiveFrom()"); - if (ssl->options.handShakeDone) - dtls_timeout = 0; +#ifdef WOLFSSL_DTLS + { + int dtls_timeout = wolfSSL_dtls_get_current_timeout(ssl); + /* 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; - if (!wolfSSL_dtls_get_using_nonblock(ssl)) { - /* needs timeout in milliseconds */ - NetSock_CfgTimeoutRxQ_Set(sd, dtls_timeout * 1000, &err); - if (err != NET_SOCK_ERR_NONE) { - WOLFSSL_MSG("NetSock_CfgTimeoutRxQ_Set failed"); + #ifdef WOLFSSL_DTLS13 + if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) { + 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 = (1000 * dtls_timeout) / 4; + } else + #endif /* WOLFSSL_DTLS13 */ + dtls_timeout = 1000 * dtls_timeout; + NetSock_CfgTimeoutRxQ_Set(sd, dtls_timeout, &err); + if (err != NET_SOCK_ERR_NONE) { + WOLFSSL_MSG("NetSock_CfgTimeoutRxQ_Set failed"); + } } } +#endif /* WOLFSSL_DTLS */ ret = NetSock_RxDataFrom(sd, buf, sz, ssl->rflags, &peer, &peerSz, 0, 0, 0, &err);