Merge pull request #1192 from dgarske/client_staticmem

Added static memory support to client example
This commit is contained in:
JacobBarthelmeh
2017-11-02 14:49:33 -06:00
committed by GitHub
4 changed files with 112 additions and 27 deletions

View File

@@ -762,12 +762,11 @@ static void Usage(void)
#endif #endif
} }
THREAD_RETURN WOLFSSL_THREAD client_test(void* args) THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
{ {
SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID; SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID;
WOLFSSL_METHOD* method = 0; wolfSSL_method_func method = NULL;
WOLFSSL_CTX* ctx = 0; WOLFSSL_CTX* ctx = 0;
WOLFSSL* ssl = 0; WOLFSSL* ssl = 0;
@@ -885,6 +884,22 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
int argc = ((func_args*)args)->argc; int argc = ((func_args*)args)->argc;
char** argv = ((func_args*)args)->argv; char** argv = ((func_args*)args)->argv;
#ifdef WOLFSSL_STATIC_MEMORY
#if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) \
|| defined(SESSION_CERTS)
/* big enough to handle most cases including session certs */
byte memory[320000];
#else
byte memory[80000];
#endif
byte memoryIO[34500]; /* max for IO buffer (TLS packet can be 16k) */
WOLFSSL_MEM_CONN_STATS ssl_stats;
#ifdef DEBUG_WOLFSSL
WOLFSSL_MEM_STATS mem_stats;
#endif
#endif
((func_args*)args)->return_code = -1; /* error state */ ((func_args*)args)->return_code = -1; /* error state */
#ifdef NO_RSA #ifdef NO_RSA
@@ -1372,17 +1387,17 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
#ifndef NO_OLD_TLS #ifndef NO_OLD_TLS
#ifdef WOLFSSL_ALLOW_SSLV3 #ifdef WOLFSSL_ALLOW_SSLV3
case 0: case 0:
method = wolfSSLv3_client_method(); method = wolfSSLv3_client_method_ex;
break; break;
#endif #endif
#ifndef NO_TLS #ifndef NO_TLS
case 1: case 1:
method = wolfTLSv1_client_method(); method = wolfTLSv1_client_method_ex;
break; break;
case 2: case 2:
method = wolfTLSv1_1_client_method(); method = wolfTLSv1_1_client_method_ex;
break; break;
#endif /* NO_TLS */ #endif /* NO_TLS */
@@ -1390,11 +1405,11 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
#ifndef NO_TLS #ifndef NO_TLS
case 3: case 3:
method = wolfTLSv1_2_client_method(); method = wolfTLSv1_2_client_method_ex;
break; break;
#ifdef WOLFSSL_TLS13 #ifdef WOLFSSL_TLS13
case 4: case 4:
method = wolfTLSv1_3_client_method(); method = wolfTLSv1_3_client_method_ex;
break; break;
#endif #endif
#endif #endif
@@ -1402,12 +1417,12 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
#ifdef WOLFSSL_DTLS #ifdef WOLFSSL_DTLS
#ifndef NO_OLD_TLS #ifndef NO_OLD_TLS
case -1: case -1:
method = wolfDTLSv1_client_method(); method = wolfDTLSv1_client_method_ex;
break; break;
#endif #endif
case -2: case -2:
method = wolfDTLSv1_2_client_method(); method = wolfDTLSv1_2_client_method_ex;
break; break;
#endif #endif
@@ -1419,7 +1434,32 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
if (method == NULL) if (method == NULL)
err_sys("unable to get method"); err_sys("unable to get method");
ctx = wolfSSL_CTX_new(method);
#ifdef WOLFSSL_STATIC_MEMORY
#ifdef DEBUG_WOLFSSL
/* print off helper buffer sizes for use with static memory
* printing to stderr incase of debug mode turned on */
fprintf(stderr, "static memory management size = %d\n",
wolfSSL_MemoryPaddingSz());
fprintf(stderr, "calculated optimum general buffer size = %d\n",
wolfSSL_StaticBufferSz(memory, sizeof(memory), 0));
fprintf(stderr, "calculated optimum IO buffer size = %d\n",
wolfSSL_StaticBufferSz(memoryIO, sizeof(memoryIO),
WOLFMEM_IO_POOL_FIXED));
#endif /* DEBUG_WOLFSSL */
if (wolfSSL_CTX_load_static_memory(&ctx, method, memory, sizeof(memory),
0, 1) != WOLFSSL_SUCCESS) {
err_sys("unable to load static memory");
}
if (wolfSSL_CTX_load_static_memory(&ctx, NULL, memoryIO, sizeof(memoryIO),
WOLFMEM_IO_POOL_FIXED | WOLFMEM_TRACK_STATS, 1) != WOLFSSL_SUCCESS) {
err_sys("unable to load static memory");
}
#else
ctx = wolfSSL_CTX_new(method(NULL));
#endif
if (ctx == NULL) if (ctx == NULL)
err_sys("unable to get ctx"); err_sys("unable to get ctx");
@@ -1708,6 +1748,14 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
wolfSSL_CTX_allow_post_handshake_auth(ctx); wolfSSL_CTX_allow_post_handshake_auth(ctx);
#endif #endif
#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL)
fprintf(stderr, "Before creating SSL\n");
if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1)
err_sys("ctx not using static memory");
if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */
err_sys("error printing out memory stats");
#endif
if (doMcast) { if (doMcast) {
#ifdef WOLFSSL_MULTICAST #ifdef WOLFSSL_MULTICAST
wolfSSL_CTX_mcast_set_member_id(ctx, mcastID); wolfSSL_CTX_mcast_set_member_id(ctx, mcastID);
@@ -1729,6 +1777,14 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
wolfSSL_KeepArrays(ssl); wolfSSL_KeepArrays(ssl);
#endif #endif
#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL)
fprintf(stderr, "After creating SSL\n");
if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1)
err_sys("ctx not using static memory");
if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */
err_sys("error printing out memory stats");
#endif
#ifdef WOLFSSL_TLS13 #ifdef WOLFSSL_TLS13
if (!helloRetry) { if (!helloRetry) {
if (onlyKeyShare == 0 || onlyKeyShare == 2) { if (onlyKeyShare == 0 || onlyKeyShare == 2) {
@@ -2070,12 +2126,6 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
#ifndef NO_SESSION_CACHE #ifndef NO_SESSION_CACHE
if (resumeSession) { if (resumeSession) {
session = wolfSSL_get_session(ssl); session = wolfSSL_get_session(ssl);
sslResume = wolfSSL_new(ctx);
if (sslResume == NULL) {
wolfSSL_free(ssl);
wolfSSL_CTX_free(ctx);
err_sys("unable to get SSL object");
}
} }
#endif #endif
@@ -2088,11 +2138,33 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
if (atomicUser) if (atomicUser)
FreeAtomicUser(ssl); FreeAtomicUser(ssl);
#endif #endif
/* display collected statistics */
#ifdef WOLFSSL_STATIC_MEMORY
if (wolfSSL_is_static_memory(ssl, &ssl_stats) != 1)
err_sys("static memory was not used with ssl");
fprintf(stderr, "\nprint off SSL memory stats\n");
fprintf(stderr, "*** This is memory state before wolfSSL_free is called\n");
fprintf(stderr, "peak connection memory = %d\n", ssl_stats.peakMem);
fprintf(stderr, "current memory in use = %d\n", ssl_stats.curMem);
fprintf(stderr, "peak connection allocs = %d\n", ssl_stats.peakAlloc);
fprintf(stderr, "current connection allocs = %d\n", ssl_stats.curAlloc);
fprintf(stderr, "total connection allocs = %d\n", ssl_stats.totalAlloc);
fprintf(stderr, "total connection frees = %d\n\n", ssl_stats.totalFr);
#endif
wolfSSL_free(ssl); wolfSSL_free(ssl);
CloseSocket(sockfd); CloseSocket(sockfd);
#ifndef NO_SESSION_CACHE #ifndef NO_SESSION_CACHE
if (resumeSession) { if (resumeSession) {
sslResume = wolfSSL_new(ctx);
if (sslResume == NULL) {
wolfSSL_CTX_free(ctx);
err_sys("unable to get SSL object");
}
if (dtlsUDP) { if (dtlsUDP) {
#ifdef USE_WINDOWS_API #ifdef USE_WINDOWS_API
Sleep(500); Sleep(500);
@@ -2382,6 +2454,21 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE) if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE)
wolfSSL_shutdown(sslResume); /* bidirectional shutdown */ wolfSSL_shutdown(sslResume); /* bidirectional shutdown */
/* display collected statistics */
#ifdef WOLFSSL_STATIC_MEMORY
if (wolfSSL_is_static_memory(sslResume, &ssl_stats) != 1)
err_sys("static memory was not used with ssl");
fprintf(stderr, "\nprint off SSLresume memory stats\n");
fprintf(stderr, "*** This is memory state before wolfSSL_free is called\n");
fprintf(stderr, "peak connection memory = %d\n", ssl_stats.peakMem);
fprintf(stderr, "current memory in use = %d\n", ssl_stats.curMem);
fprintf(stderr, "peak connection allocs = %d\n", ssl_stats.peakAlloc);
fprintf(stderr, "current connection allocs = %d\n", ssl_stats.curAlloc);
fprintf(stderr, "total connection allocs = %d\n", ssl_stats.totalAlloc);
fprintf(stderr, "total connection frees = %d\n\n", ssl_stats.totalFr);
#endif
wolfSSL_free(sslResume); wolfSSL_free(sslResume);
CloseSocket(sockfd); CloseSocket(sockfd);
} }

View File

@@ -534,8 +534,11 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
#else #else
byte memory[80000]; byte memory[80000];
#endif #endif
byte memoryIO[34500]; /* max of 17k for IO buffer (TLS packet can be 16k) */ byte memoryIO[34500]; /* max for IO buffer (TLS packet can be 16k) */
WOLFSSL_MEM_CONN_STATS ssl_stats; WOLFSSL_MEM_CONN_STATS ssl_stats;
#ifdef DEBUG_WOLFSSL
WOLFSSL_MEM_STATS mem_stats;
#endif
#endif #endif
((func_args*)args)->return_code = -1; /* error state */ ((func_args*)args)->return_code = -1; /* error state */
@@ -1153,14 +1156,11 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
} }
} }
#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) #if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL)
{
WOLFSSL_MEM_STATS mem_stats;
fprintf(stderr, "Before creating SSL\n"); fprintf(stderr, "Before creating SSL\n");
if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1)
err_sys_ex(runWithErrors, "ctx not using static memory"); err_sys_ex(runWithErrors, "ctx not using static memory");
if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */
err_sys_ex(runWithErrors, "error printing out memory stats"); err_sys_ex(runWithErrors, "error printing out memory stats");
}
#endif #endif
if (doMcast) { if (doMcast) {
@@ -1185,14 +1185,11 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
#endif #endif
#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) #if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL)
{
WOLFSSL_MEM_STATS mem_stats;
fprintf(stderr, "After creating SSL\n"); fprintf(stderr, "After creating SSL\n");
if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1)
err_sys_ex(runWithErrors, "ctx not using static memory"); err_sys_ex(runWithErrors, "ctx not using static memory");
if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */
err_sys_ex(runWithErrors, "error printing out memory stats"); err_sys_ex(runWithErrors, "error printing out memory stats");
}
#endif #endif
if (doMcast) { if (doMcast) {

View File

@@ -71,7 +71,7 @@ do_test() {
if [ $client_result != 0 ] if [ $client_result != 0 ]
then then
echo -e "client failed!" echo -e "client failed!\ncapture_out=$capture_out\nclient_result=$client_result"
do_cleanup do_cleanup
exit 1 exit 1
fi fi

View File

@@ -2838,7 +2838,7 @@ void FreeX509(WOLFSSL_X509* x509)
} }
#endif /* OPENSSL_EXTRA */ #endif /* OPENSSL_EXTRA */
if (x509->altNames) if (x509->altNames)
FreeAltNames(x509->altNames, NULL); FreeAltNames(x509->altNames, x509->heap);
} }
#endif /* !NO_DH || HAVE_ECC */ #endif /* !NO_DH || HAVE_ECC */
@@ -4850,6 +4850,7 @@ void SSL_ResourceFree(WOLFSSL* ssl)
#endif #endif
WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap; WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
WOLFSSL_HEAP* ctx_heap; WOLFSSL_HEAP* ctx_heap;
void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
ctx_heap = ssl_hint->memory; ctx_heap = ssl_hint->memory;
if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) { if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
@@ -4869,9 +4870,9 @@ void SSL_ResourceFree(WOLFSSL* ssl)
/* check if tracking stats */ /* check if tracking stats */
if (ctx_heap->flag & WOLFMEM_TRACK_STATS) { if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
XFREE(ssl_hint->stats, ssl->ctx->heap, DYNAMIC_TYPE_SSL); XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
} }
XFREE(ssl->heap, ssl->ctx->heap, DYNAMIC_TYPE_SSL); XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
#ifdef WOLFSSL_HEAP_TEST #ifdef WOLFSSL_HEAP_TEST
} }
#endif #endif