From f3817e76cf955761d18c199eff7f50ba5da75d1c Mon Sep 17 00:00:00 2001 From: Jorge Vergara Date: Thu, 23 Feb 2017 22:01:59 -0800 Subject: [PATCH] Enable mbedTLS dynamic memory allocation in user mode on Windows (#1373) * change user mode openthread to enable dynamic memory allocation in mbedtls * complete merge by adding OPENTHREAD_MULTIPLE_INSTANCE to last file * remove some extraneous changes that got pulled in accidentally * fix spacing * fix crash in existing tests due to this change * fix x86 build --- etc/visual-studio/UnitTests.vcxproj | 1 + etc/visual-studio/libopenthread-cli.vcxproj | 1 + .../libopenthread-ncp-spi.vcxproj | 1 + .../libopenthread-ncp-uart.vcxproj | 1 + etc/visual-studio/libopenthread.vcxproj | 3 ++- .../libopenthread.vcxproj.filters | 5 +---- etc/visual-studio/mbedtls.vcxproj | 5 +++-- etc/visual-studio/ot-cli.vcxproj | 1 + etc/visual-studio/ot-ncp-spi.vcxproj | 1 + etc/visual-studio/ot-ncp-uart.vcxproj | 1 + examples/apps/cli/main.c | 12 +++++++++++ examples/apps/ncp/main.c | 12 +++++++++++ tests/unit/test_aes.cpp | 2 ++ tests/unit/test_fuzz.cpp | 4 ++-- tests/unit/test_hmac_sha256.cpp | 4 +++- tests/unit/test_message_queue.cpp | 21 +++++++++++++++++++ tests/unit/test_platform.cpp | 12 +++++++++++ 17 files changed, 77 insertions(+), 10 deletions(-) diff --git a/etc/visual-studio/UnitTests.vcxproj b/etc/visual-studio/UnitTests.vcxproj index b495f00ad..74b9f468f 100644 --- a/etc/visual-studio/UnitTests.vcxproj +++ b/etc/visual-studio/UnitTests.vcxproj @@ -49,6 +49,7 @@ %(PreprocessorDefinitions) MBEDTLS_CONFIG_FILE="mbedtls-config.h"; OPENTHREAD_CONFIG_FILE="openthread-windows-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; Level3 true diff --git a/etc/visual-studio/libopenthread-cli.vcxproj b/etc/visual-studio/libopenthread-cli.vcxproj index 9171ca4e9..a64f92422 100644 --- a/etc/visual-studio/libopenthread-cli.vcxproj +++ b/etc/visual-studio/libopenthread-cli.vcxproj @@ -40,6 +40,7 @@ %(PreprocessorDefinitions); MBEDTLS_CONFIG_FILE="mbedtls-config.h"; OPENTHREAD_CONFIG_FILE="openthread-windows-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; %(AdditionalIncludeDirectories); diff --git a/etc/visual-studio/libopenthread-ncp-spi.vcxproj b/etc/visual-studio/libopenthread-ncp-spi.vcxproj index 9009a4d42..3313d1cd2 100644 --- a/etc/visual-studio/libopenthread-ncp-spi.vcxproj +++ b/etc/visual-studio/libopenthread-ncp-spi.vcxproj @@ -40,6 +40,7 @@ %(PreprocessorDefinitions); MBEDTLS_CONFIG_FILE="mbedtls-config.h"; OPENTHREAD_CONFIG_FILE="openthread-windows-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; %(AdditionalIncludeDirectories); diff --git a/etc/visual-studio/libopenthread-ncp-uart.vcxproj b/etc/visual-studio/libopenthread-ncp-uart.vcxproj index b5e3e0566..a5f9765a1 100644 --- a/etc/visual-studio/libopenthread-ncp-uart.vcxproj +++ b/etc/visual-studio/libopenthread-ncp-uart.vcxproj @@ -40,6 +40,7 @@ %(PreprocessorDefinitions); MBEDTLS_CONFIG_FILE="mbedtls-config.h"; OPENTHREAD_CONFIG_FILE="openthread-windows-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; %(AdditionalIncludeDirectories); diff --git a/etc/visual-studio/libopenthread.vcxproj b/etc/visual-studio/libopenthread.vcxproj index e6745b3d1..38f7f4c01 100644 --- a/etc/visual-studio/libopenthread.vcxproj +++ b/etc/visual-studio/libopenthread.vcxproj @@ -40,6 +40,7 @@ %(PreprocessorDefinitions); MBEDTLS_CONFIG_FILE="mbedtls-config.h"; OPENTHREAD_CONFIG_FILE="openthread-windows-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; %(AdditionalIncludeDirectories); @@ -210,4 +211,4 @@ - + \ No newline at end of file diff --git a/etc/visual-studio/libopenthread.vcxproj.filters b/etc/visual-studio/libopenthread.vcxproj.filters index f7f5723c5..a73a75dff 100644 --- a/etc/visual-studio/libopenthread.vcxproj.filters +++ b/etc/visual-studio/libopenthread.vcxproj.filters @@ -174,9 +174,6 @@ Source Files\thread - - Source Files\thread - Source Files\thread @@ -501,4 +498,4 @@ Header Files\common - + \ No newline at end of file diff --git a/etc/visual-studio/mbedtls.vcxproj b/etc/visual-studio/mbedtls.vcxproj index 5f6f62e7e..a08835d07 100644 --- a/etc/visual-studio/mbedtls.vcxproj +++ b/etc/visual-studio/mbedtls.vcxproj @@ -1,6 +1,6 @@  - + {4111C8BB-D354-4348-AD3C-EB6832E84831} Win32Proj @@ -38,7 +38,8 @@ ;%(PreprocessorDefinitions); - MBEDTLS_CONFIG_FILE="mbedtls-config.h" + MBEDTLS_CONFIG_FILE="mbedtls-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; ..\..\include; diff --git a/etc/visual-studio/ot-cli.vcxproj b/etc/visual-studio/ot-cli.vcxproj index 121890ab2..2c18ad24f 100644 --- a/etc/visual-studio/ot-cli.vcxproj +++ b/etc/visual-studio/ot-cli.vcxproj @@ -39,6 +39,7 @@ %(PreprocessorDefinitions); OPENTHREAD_CONFIG_FILE="openthread-windows-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; %(AdditionalIncludeDirectories); diff --git a/etc/visual-studio/ot-ncp-spi.vcxproj b/etc/visual-studio/ot-ncp-spi.vcxproj index cc56e3d19..0dbf5c68f 100644 --- a/etc/visual-studio/ot-ncp-spi.vcxproj +++ b/etc/visual-studio/ot-ncp-spi.vcxproj @@ -39,6 +39,7 @@ %(PreprocessorDefinitions); OPENTHREAD_CONFIG_FILE="openthread-windows-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; %(AdditionalIncludeDirectories); diff --git a/etc/visual-studio/ot-ncp-uart.vcxproj b/etc/visual-studio/ot-ncp-uart.vcxproj index c1c8767ab..5536ecf99 100644 --- a/etc/visual-studio/ot-ncp-uart.vcxproj +++ b/etc/visual-studio/ot-ncp-uart.vcxproj @@ -39,6 +39,7 @@ %(PreprocessorDefinitions); OPENTHREAD_CONFIG_FILE="openthread-windows-config.h"; + OPENTHREAD_MULTIPLE_INSTANCE; %(AdditionalIncludeDirectories); diff --git a/examples/apps/cli/main.c b/examples/apps/cli/main.c index b0c99faac..78c3d51ce 100644 --- a/examples/apps/cli/main.c +++ b/examples/apps/cli/main.c @@ -40,6 +40,18 @@ #include #include +#ifdef OPENTHREAD_MULTIPLE_INSTANCE +void *otPlatCAlloc(size_t aNum, size_t aSize) +{ + return calloc(aNum, aSize); +} + +void otPlatFree(void *aPtr) +{ + free(aPtr); +} +#endif + void otSignalTaskletPending(otInstance *aInstance) { (void)aInstance; diff --git a/examples/apps/ncp/main.c b/examples/apps/ncp/main.c index 97dfe1d98..d33ed009b 100644 --- a/examples/apps/ncp/main.c +++ b/examples/apps/ncp/main.c @@ -40,6 +40,18 @@ #include #include +#ifdef OPENTHREAD_MULTIPLE_INSTANCE +void *otPlatCAlloc(size_t aNum, size_t aSize) +{ + return calloc(aNum, aSize); +} + +void otPlatFree(void *aPtr) +{ + free(aPtr); +} +#endif + void otSignalTaskletPending(otInstance *aInstance) { (void)aInstance; diff --git a/tests/unit/test_aes.cpp b/tests/unit/test_aes.cpp index f2895ec3c..1a32fa3c9 100644 --- a/tests/unit/test_aes.cpp +++ b/tests/unit/test_aes.cpp @@ -33,7 +33,9 @@ #include #include +#ifndef OPENTHREAD_MULTIPLE_INSTANCE static Thread::Crypto::MbedTls mbedtls; +#endif /** * Verifies test vectors from IEEE 802.15.4-2006 Annex C Section C.2.1 diff --git a/tests/unit/test_fuzz.cpp b/tests/unit/test_fuzz.cpp index e824b8857..3e10a368f 100644 --- a/tests/unit/test_fuzz.cpp +++ b/tests/unit/test_fuzz.cpp @@ -110,7 +110,7 @@ void TestFuzz(uint32_t aSeconds) #endif #ifdef OPENTHREAD_MULTIPLE_INSTANCE - uint64_t otInstanceBufferLength = 0; + size_t otInstanceBufferLength = 0; uint8_t *otInstanceBuffer = NULL; // Call to query the buffer size @@ -119,7 +119,7 @@ void TestFuzz(uint32_t aSeconds) // Call to allocate the buffer otInstanceBuffer = (uint8_t *)malloc(otInstanceBufferLength); VerifyOrQuit(otInstanceBuffer != NULL, "Failed to allocate otInstance"); - memset(&otInstanceBuffer, 0, otInstanceBufferLength); + memset(otInstanceBuffer, 0, otInstanceBufferLength); // Initialize Openthread with the buffer aInstance = otInstanceInit(otInstanceBuffer, &otInstanceBufferLength); diff --git a/tests/unit/test_hmac_sha256.cpp b/tests/unit/test_hmac_sha256.cpp index 526d72e24..41dd289de 100644 --- a/tests/unit/test_hmac_sha256.cpp +++ b/tests/unit/test_hmac_sha256.cpp @@ -34,7 +34,9 @@ #include #include -static Thread::Crypto::MbedTls mbedtls; +#ifndef OPENTHREAD_MULTIPLE_INSTANCE +static Thread::Crypto::MbedTls mMbedTls; +#endif void TestHmacSha256(void) { diff --git a/tests/unit/test_message_queue.cpp b/tests/unit/test_message_queue.cpp index 97c99efde..490a339ae 100644 --- a/tests/unit/test_message_queue.cpp +++ b/tests/unit/test_message_queue.cpp @@ -192,7 +192,23 @@ void TestMessageQueueOtApis(void) ThreadError error; otMessage message; +#ifdef OPENTHREAD_MULTIPLE_INSTANCE + size_t otInstanceBufferLength = 0; + uint8_t *otInstanceBuffer = NULL; + + // Call to query the buffer size + (void)otInstanceInit(NULL, &otInstanceBufferLength); + + // Call to allocate the buffer + otInstanceBuffer = (uint8_t *)malloc(otInstanceBufferLength); + assert(otInstanceBuffer); + + // Initialize Openthread with the buffer + instance = otInstanceInit(otInstanceBuffer, &otInstanceBufferLength); +#else instance = otInstanceInit(); +#endif + VerifyOrQuit(instance != NULL, "Failed to get and init an otInstance.\n"); for (int i = 0; i < kNumTestMessages; i++) @@ -251,6 +267,11 @@ void TestMessageQueueOtApis(void) // Remove all element and make sure queue is empty SuccessOrQuit(otMessageQueueDequeue(&queue, msg[2]), "Failed to dequeue a message from otMessageQueue.\n"); VerifyMessageQueueContentUsingOtApi(&queue, 0); + + otInstanceFinalize(instance); +#ifdef OPENTHREAD_MULTIPLE_INSTANCE + free(otInstanceBuffer); +#endif } #ifdef ENABLE_TEST_MAIN diff --git a/tests/unit/test_platform.cpp b/tests/unit/test_platform.cpp index a3a042efc..ea2b03076 100644 --- a/tests/unit/test_platform.cpp +++ b/tests/unit/test_platform.cpp @@ -81,6 +81,18 @@ bool sDiagMode = false; extern "C" { +#ifdef OPENTHREAD_MULTIPLE_INSTANCE + void *otPlatCAlloc(size_t aNum, size_t aSize) + { + return calloc(aNum, aSize); + } + + void otPlatFree(void *aPtr) + { + free(aPtr); + } +#endif + void otSignalTaskletPending(otInstance *) { }