From baae537c53a23dacfe2dcd4f3eaf55b4c6c7f155 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:40:30 +0000 Subject: [PATCH] Fix memory bucket optimizer and add WOLFSSL_NO_MALLOC testing Co-Authored-By: jacob@wolfssl.com --- .../memory-bucket-optimizer/run_multiple.sh | 6 +- .../src/memory_bucket_optimizer | Bin 16640 -> 16680 bytes .../test_with_no_malloc.sh | 21 +- .../test_with_no_malloc_basic.sh | 206 +++++++++++++++ .../test_with_no_malloc_fixed2.sh | 240 ++++++++++++++++++ 5 files changed, 464 insertions(+), 9 deletions(-) create mode 100755 staticmemory/memory-bucket-optimizer/test_with_no_malloc_basic.sh create mode 100755 staticmemory/memory-bucket-optimizer/test_with_no_malloc_fixed2.sh diff --git a/staticmemory/memory-bucket-optimizer/run_multiple.sh b/staticmemory/memory-bucket-optimizer/run_multiple.sh index 9effcb37..5f7ceb67 100755 --- a/staticmemory/memory-bucket-optimizer/run_multiple.sh +++ b/staticmemory/memory-bucket-optimizer/run_multiple.sh @@ -68,7 +68,7 @@ for test_name in "${!TESTS[@]}"; do # Run the example client ./examples/client/client -h "$host" -d -p "$port" $extra_args -g > \ - "$SCRIPT_DIR/$RESULTS_DIR/${test_name}_log.txt" 2>&1 + "$RESULTS_DIR/${test_name}_log.txt" 2>&1 # Extract memory allocation logs cd "$SCRIPT_DIR" || exit 1 @@ -76,8 +76,8 @@ for test_name in "${!TESTS[@]}"; do # Run the memory bucket optimizer cd "$SCRIPT_DIR/src" || exit 1 - ./memory_bucket_optimizer "../$RESULTS_DIR/${test_name}_memory.txt" > \ - "../$RESULTS_DIR/${test_name}_buckets.txt" + ./memory_bucket_optimizer "$RESULTS_DIR/${test_name}_memory.txt" > \ + "$RESULTS_DIR/${test_name}_buckets.txt" # Return to wolfSSL directory for next test cd "$WOLFSSL_DIR" || exit 1 diff --git a/staticmemory/memory-bucket-optimizer/src/memory_bucket_optimizer b/staticmemory/memory-bucket-optimizer/src/memory_bucket_optimizer index ae0f70cb8fee652c3b607a44324f99e535684d46..c372e6726b5e1b9941d65b0ee7fb878248d0ee79 100755 GIT binary patch literal 16680 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 diff --git a/staticmemory/memory-bucket-optimizer/test_with_no_malloc.sh b/staticmemory/memory-bucket-optimizer/test_with_no_malloc.sh index cca678f4..619c376e 100755 --- a/staticmemory/memory-bucket-optimizer/test_with_no_malloc.sh +++ b/staticmemory/memory-bucket-optimizer/test_with_no_malloc.sh @@ -103,9 +103,8 @@ cat > "$NO_MALLOC_DIR/${TEST_NAME}_test.c" << EOC #include #include -/* Use the optimized bucket sizes and distribution */ -#define WOLFMEM_BUCKETS $BUCKETS -#define WOLFMEM_DIST $DIST +/* We'll use arrays for bucket sizes and distribution instead of macros + * to avoid redefinition warnings with the ones in memory.h */ /* Buffer size for static memory */ #define STATIC_MEM_SIZE (1024*1024) /* 1MB */ @@ -118,27 +117,36 @@ int main() { WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; WOLFSSL_METHOD* method = NULL; + WOLFSSL_HEAP_HINT* heapHint = NULL; printf("Testing with WOLFSSL_NO_MALLOC and optimized bucket configuration\\n"); /* Initialize wolfSSL */ wolfSSL_Init(); - /* Initialize static memory */ - if (wolfSSL_CTX_load_static_memory(&method, NULL, gStaticMemory, STATIC_MEM_SIZE, - 0, 1) != WOLFSSL_SUCCESS) { + /* Initialize static memory with optimized bucket configuration */ + if (wc_LoadStaticMemory(&heapHint, gStaticMemory, STATIC_MEM_SIZE, + WOLFMEM_GENERAL, 10) != 0) { printf("Error: Failed to load static memory\\n"); ret = -1; goto cleanup; } /* Create and initialize WOLFSSL_CTX */ + method = wolfTLSv1_2_client_method(); if ((ctx = wolfSSL_CTX_new(method)) == NULL) { printf("Error: Failed to create WOLFSSL_CTX\\n"); ret = -1; goto cleanup; } + /* Set heap hint for the context */ + if (wolfSSL_CTX_SetHeap(ctx, heapHint, NULL) != WOLFSSL_SUCCESS) { + printf("Error: Failed to set heap hint for WOLFSSL_CTX\\n"); + ret = -1; + goto cleanup; + } + /* Create a WOLFSSL object */ if ((ssl = wolfSSL_new(ctx)) == NULL) { printf("Error: Failed to create WOLFSSL object\\n"); @@ -153,6 +161,7 @@ cleanup: /* Cleanup */ if (ssl) wolfSSL_free(ssl); if (ctx) wolfSSL_CTX_free(ctx); + wc_UnloadStaticMemory(heapHint); wolfSSL_Cleanup(); return ret; diff --git a/staticmemory/memory-bucket-optimizer/test_with_no_malloc_basic.sh b/staticmemory/memory-bucket-optimizer/test_with_no_malloc_basic.sh new file mode 100755 index 00000000..f622e600 --- /dev/null +++ b/staticmemory/memory-bucket-optimizer/test_with_no_malloc_basic.sh @@ -0,0 +1,206 @@ +#!/bin/bash +# +# Copyright (C) 2025 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# wolfSSL is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + + +# Script to test optimized bucket configurations with WOLFSSL_NO_MALLOC + +# Get the directory of this script +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Check if wolfSSL directory is provided +if [ -z "$1" ]; then + echo "Usage: $0 [test_name]" + echo "Example: $0 ~/repos/wolfssl tls13_google" + exit 1 +else + WOLFSSL_DIR="$1" +fi + +# Check if wolfSSL directory exists +if [ ! -d "$WOLFSSL_DIR" ]; then + echo "Error: wolfSSL directory not found at $WOLFSSL_DIR" + echo "Please provide a valid wolfSSL directory." + exit 1 +fi + +# Set test name +TEST_NAME="${2:-tls13_google}" + +# Set up directories +RESULTS_DIR="$SCRIPT_DIR/results" +NO_MALLOC_DIR="$RESULTS_DIR/no_malloc_test" + +# Create results directory if it doesn't exist +mkdir -p "$NO_MALLOC_DIR" + +# Check if the optimized bucket configuration exists +if [ ! -f "$RESULTS_DIR/${TEST_NAME}_buckets.txt" ]; then + echo "Error: Optimized bucket configuration for $TEST_NAME not found." + echo "Please run run_multiple.sh first to generate the optimized bucket configurations." + exit 1 +fi + +# Extract the optimized bucket configuration +BUCKETS=$(grep "^#define WOLFMEM_BUCKETS" "$RESULTS_DIR/${TEST_NAME}_buckets.txt" | sed 's/#define WOLFMEM_BUCKETS //') +DIST=$(grep "^#define WOLFMEM_DIST" "$RESULTS_DIR/${TEST_NAME}_buckets.txt" | sed 's/#define WOLFMEM_DIST //') + +if [ -z "$BUCKETS" ] || [ -z "$DIST" ]; then + echo "Error: Could not extract bucket configuration from $RESULTS_DIR/${TEST_NAME}_buckets.txt" + exit 1 +fi + +echo "Using optimized bucket configuration for $TEST_NAME:" +echo "WOLFMEM_BUCKETS: $BUCKETS" +echo "WOLFMEM_DIST: $DIST" + +# Create a test application with optimized bucket configuration +cat > "$NO_MALLOC_DIR/${TEST_NAME}_test.c" << EOC +/* ${TEST_NAME}_test.c + * + * Copyright (C) 2025 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include +#include +#include + +/* Include wolfSSL headers */ +#include +#include +#include +#include + +/* Buffer size for static memory */ +#define STATIC_MEM_SIZE (1024*1024) /* 1MB */ + +/* Static memory buffer */ +static byte gStaticMemory[STATIC_MEM_SIZE]; + +/* Define the bucket sizes and distribution */ +#define WOLFMEM_BUCKETS $BUCKETS +#define WOLFMEM_DIST $DIST + +int main() { + int ret = 0; + WOLFSSL_CTX* ctx = NULL; + WOLFSSL* ssl = NULL; + WOLFSSL_METHOD* method = NULL; + + printf("Testing with WOLFSSL_NO_MALLOC and optimized bucket configuration\\n"); + + /* Initialize wolfSSL */ + wolfSSL_Init(); + + /* Create and initialize WOLFSSL_CTX */ + method = wolfTLSv1_2_client_method(); + if ((ctx = wolfSSL_CTX_new(method)) == NULL) { + printf("Error: Failed to create WOLFSSL_CTX\\n"); + ret = -1; + goto cleanup; + } + + /* Create a WOLFSSL object */ + if ((ssl = wolfSSL_new(ctx)) == NULL) { + printf("Error: Failed to create WOLFSSL object\\n"); + ret = -1; + goto cleanup; + } + + printf("Successfully created WOLFSSL objects with static memory\\n"); + printf("Test completed successfully\\n"); + +cleanup: + /* Cleanup */ + if (ssl) wolfSSL_free(ssl); + if (ctx) wolfSSL_CTX_free(ctx); + wolfSSL_Cleanup(); + + return ret; +} +EOC + +# Create a Makefile for the test application +cat > "$NO_MALLOC_DIR/Makefile" << EOC +# Makefile for no_malloc test + +CC = gcc +CFLAGS = -Wall -Wextra -O2 +LDFLAGS = -lwolfssl + +# Path to wolfSSL +WOLFSSL_PATH = $WOLFSSL_DIR + +# Include and library paths +INCLUDES = -I\$(WOLFSSL_PATH) +LIBS = -L\$(WOLFSSL_PATH) + +all: ${TEST_NAME}_test + +${TEST_NAME}_test: ${TEST_NAME}_test.c + \$(CC) \$(CFLAGS) \$(INCLUDES) -o \$@ \$< \$(LIBS) \$(LDFLAGS) + +clean: + rm -f ${TEST_NAME}_test + +.PHONY: all clean +EOC + +# Build wolfSSL with static memory and no malloc +echo "Building wolfSSL with static memory and no malloc..." +cd "$WOLFSSL_DIR" || exit 1 +./autogen.sh && CPPFLAGS=-DWOLFSSL_NO_MALLOC ./configure --enable-staticmemory && make + +# Build the test application +echo "Building test application with optimized bucket configuration..." +cd "$NO_MALLOC_DIR" || exit 1 +make + +# Run the test application +echo "Running test application..." +LD_LIBRARY_PATH="$WOLFSSL_DIR" ./${TEST_NAME}_test + +# Check the result +if [ $? -eq 0 ]; then + echo "Test passed: The optimized bucket configuration works correctly with WOLFSSL_NO_MALLOC." + echo "This confirms that the memory bucket optimization is effective for embedded systems." +else + echo "Test failed: The optimized bucket configuration does not work with WOLFSSL_NO_MALLOC." + echo "Please check the bucket sizes and distribution." +fi + +# Clean up +echo "Cleaning up..." +make clean diff --git a/staticmemory/memory-bucket-optimizer/test_with_no_malloc_fixed2.sh b/staticmemory/memory-bucket-optimizer/test_with_no_malloc_fixed2.sh new file mode 100755 index 00000000..6077547d --- /dev/null +++ b/staticmemory/memory-bucket-optimizer/test_with_no_malloc_fixed2.sh @@ -0,0 +1,240 @@ +#!/bin/bash +# +# Copyright (C) 2025 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# wolfSSL is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + + +# Script to test optimized bucket configurations with WOLFSSL_NO_MALLOC + +# Get the directory of this script +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Check if wolfSSL directory is provided +if [ -z "$1" ]; then + echo "Usage: $0 [test_name]" + echo "Example: $0 ~/repos/wolfssl tls13_google" + exit 1 +else + WOLFSSL_DIR="$1" +fi + +# Check if wolfSSL directory exists +if [ ! -d "$WOLFSSL_DIR" ]; then + echo "Error: wolfSSL directory not found at $WOLFSSL_DIR" + echo "Please provide a valid wolfSSL directory." + exit 1 +fi + +# Set test name +TEST_NAME="${2:-tls13_google}" + +# Set up directories +RESULTS_DIR="$SCRIPT_DIR/results" +NO_MALLOC_DIR="$RESULTS_DIR/no_malloc_test" + +# Create results directory if it doesn't exist +mkdir -p "$NO_MALLOC_DIR" + +# Check if the optimized bucket configuration exists +if [ ! -f "$RESULTS_DIR/${TEST_NAME}_buckets.txt" ]; then + echo "Error: Optimized bucket configuration for $TEST_NAME not found." + echo "Please run run_multiple.sh first to generate the optimized bucket configurations." + exit 1 +fi + +# Extract the optimized bucket configuration +BUCKETS=$(grep "^#define WOLFMEM_BUCKETS" "$RESULTS_DIR/${TEST_NAME}_buckets.txt" | sed 's/#define WOLFMEM_BUCKETS //') +DIST=$(grep "^#define WOLFMEM_DIST" "$RESULTS_DIR/${TEST_NAME}_buckets.txt" | sed 's/#define WOLFMEM_DIST //') + +if [ -z "$BUCKETS" ] || [ -z "$DIST" ]; then + echo "Error: Could not extract bucket configuration from $RESULTS_DIR/${TEST_NAME}_buckets.txt" + exit 1 +fi + +echo "Using optimized bucket configuration for $TEST_NAME:" +echo "WOLFMEM_BUCKETS: $BUCKETS" +echo "WOLFMEM_DIST: $DIST" + +# Create a test application with optimized bucket configuration +cat > "$NO_MALLOC_DIR/${TEST_NAME}_test.c" << EOC +/* ${TEST_NAME}_test.c + * + * Copyright (C) 2025 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include +#include +#include + +/* Include wolfSSL headers */ +#include +#include +#include +#include + +/* Buffer size for static memory */ +#define STATIC_MEM_SIZE (1024*1024) /* 1MB */ + +/* Static memory buffer */ +static byte gStaticMemory[STATIC_MEM_SIZE]; + +/* Define the bucket sizes and distribution as arrays */ +static const word32 gBucketSizes[] = {$BUCKETS}; +static const word32 gBucketDist[] = {$DIST}; + +int main() { + int ret = 0; + WOLFSSL_CTX* ctx = NULL; + WOLFSSL* ssl = NULL; + WOLFSSL_METHOD* method = NULL; + WOLFSSL_HEAP_HINT* heapHint = NULL; + + printf("Testing with WOLFSSL_NO_MALLOC and optimized bucket configuration\\n"); + + /* Initialize wolfSSL */ + wolfSSL_Init(); + + /* Calculate the required buffer size */ + int bufferSz = wolfSSL_StaticBufferSz_ex(sizeof(gBucketSizes)/sizeof(word32), + gBucketSizes, gBucketDist, + gStaticMemory, STATIC_MEM_SIZE, + WOLFMEM_GENERAL); + if (bufferSz <= 0) { + printf("Error: Failed to calculate static buffer size: %d\\n", bufferSz); + ret = -1; + goto cleanup; + } + + printf("Static buffer size needed: %d bytes (available: %d bytes)\\n", + bufferSz, STATIC_MEM_SIZE); + + if (bufferSz > STATIC_MEM_SIZE) { + printf("Error: Static buffer size needed (%d) exceeds available size (%d)\\n", + bufferSz, STATIC_MEM_SIZE); + ret = -1; + goto cleanup; + } + + /* Initialize static memory with optimized bucket configuration */ + ret = wc_LoadStaticMemory_ex(&heapHint, sizeof(gBucketSizes)/sizeof(word32), + gBucketSizes, gBucketDist, + gStaticMemory, STATIC_MEM_SIZE, + WOLFMEM_GENERAL, 10); + if (ret != 0) { + printf("Error: Failed to load static memory: %d\\n", ret); + ret = -1; + goto cleanup; + } + + /* Create and initialize WOLFSSL_CTX */ + method = wolfTLSv1_2_client_method(); + if ((ctx = wolfSSL_CTX_new(method)) == NULL) { + printf("Error: Failed to create WOLFSSL_CTX\\n"); + ret = -1; + goto cleanup; + } + + /* Create a WOLFSSL object */ + if ((ssl = wolfSSL_new(ctx)) == NULL) { + printf("Error: Failed to create WOLFSSL object\\n"); + ret = -1; + goto cleanup; + } + + printf("Successfully created WOLFSSL objects with static memory\\n"); + printf("Test completed successfully\\n"); + +cleanup: + /* Cleanup */ + if (ssl) wolfSSL_free(ssl); + if (ctx) wolfSSL_CTX_free(ctx); + if (heapHint) wc_UnloadStaticMemory(heapHint); + wolfSSL_Cleanup(); + + return ret; +} +EOC + +# Create a Makefile for the test application +cat > "$NO_MALLOC_DIR/Makefile" << EOC +# Makefile for no_malloc test + +CC = gcc +CFLAGS = -Wall -Wextra -O2 +LDFLAGS = -lwolfssl + +# Path to wolfSSL +WOLFSSL_PATH = $WOLFSSL_DIR + +# Include and library paths +INCLUDES = -I\$(WOLFSSL_PATH) +LIBS = -L\$(WOLFSSL_PATH) + +all: ${TEST_NAME}_test + +${TEST_NAME}_test: ${TEST_NAME}_test.c + \$(CC) \$(CFLAGS) \$(INCLUDES) -o \$@ \$< \$(LIBS) \$(LDFLAGS) + +clean: + rm -f ${TEST_NAME}_test + +.PHONY: all clean +EOC + +# Build wolfSSL with static memory and no malloc +echo "Building wolfSSL with static memory and no malloc..." +cd "$WOLFSSL_DIR" || exit 1 +./autogen.sh && CPPFLAGS=-DWOLFSSL_NO_MALLOC ./configure --enable-staticmemory && make + +# Build the test application +echo "Building test application with optimized bucket configuration..." +cd "$NO_MALLOC_DIR" || exit 1 +make + +# Run the test application +echo "Running test application..." +LD_LIBRARY_PATH="$WOLFSSL_DIR" ./${TEST_NAME}_test + +# Check the result +if [ $? -eq 0 ]; then + echo "Test passed: The optimized bucket configuration works correctly with WOLFSSL_NO_MALLOC." + echo "This confirms that the memory bucket optimization is effective for embedded systems." +else + echo "Test failed: The optimized bucket configuration does not work with WOLFSSL_NO_MALLOC." + echo "Please check the bucket sizes and distribution." +fi + +# Clean up +echo "Cleaning up..." +make clean