Функція Mbedtls_ssl_close_notify займає більше 30 секунд, якщо перед нею не додано затримку. У нас є код під назвою Freertos_TLS_Disconnect(), який викликає mbedtls_ssl_close_notify() внутрішньо. Функція займає 45 секунд із кодом помилки -27648, коли перед ним не додана затримка, як показано нижче:
1 2 3 4 5 6 7 |
APP_PRINT("before TLS_FreeRTOS_Disconnect\r\n"); //R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS); gpt_init_data_process(0,1); TLS_FreeRTOS_Disconnect (&xNetworkContext); gpt_init_data_process(1,1); APP_PRINT(" after TLS_FreeRTOS_Disconnect\r\n"); isSocketConnected = FALSE; |
Але коли затримка додається (до вищезазначеного коду), mbedtls_ssl_close_notify успішно виконується, і час виконання функції становить всього 15 мс. Питання в тому, чи потрібна функції mbedtls_ssl_close_notify затримка перед витонченим закриттям з’єднання? Якщо ні, як виправити це? Реалізація функції TLS_Freertos_disconnect виглядає наступним чином:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
void TLS_FreeRTOS_Disconnect( NetworkContext_t * pNetworkContext ) { TlsTransportParams_t * pTlsTransportParams = NULL; BaseType_t tlsStatus = 0; if( ( pNetworkContext != NULL ) && ( pNetworkContext->pParams != NULL ) ) { pTlsTransportParams = pNetworkContext->pParams; /* Attempting to terminate TLS connection. */ tlsStatus = ( BaseType_t ) mbedtls_ssl_close_notify( &( pTlsTransportParams->sslContext.context ) ); /* Ignore the WANT_READ and WANT_WRITE return values. */ if( ( tlsStatus != ( BaseType_t ) MBEDTLS_ERR_SSL_WANT_READ ) && ( tlsStatus != ( BaseType_t ) MBEDTLS_ERR_SSL_WANT_WRITE ) ) { if( tlsStatus == 0 ) { LogInfo( ( "(Network connection %p) TLS close-notify sent.", pNetworkContext ) ); } else { LogError( ( "(Network connection %p) Failed to send TLS close-notify: mbedTLSError= %s : %s.", pNetworkContext, mbedtlsHighLevelCodeOrDefault( tlsStatus ), mbedtlsLowLevelCodeOrDefault( tlsStatus ) ) ); } } /* Call socket shutdown function to close connection. */ TCP_Sockets_Disconnect( pTlsTransportParams->tcpSocket ); /* Free mbed TLS contexts. */ sslContextFree( &( pTlsTransportParams->sslContext ) ); } } |