From 898500f031ad1a9e2b47e464fc0a657f7ae298ac Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Fri, 9 Nov 2018 11:33:32 +0100 Subject: [PATCH] mesh: add mesh_access_pdu_t and provide memory pool --- src/ble/mesh/mesh_network.h | 27 +++++++++++++++++++++-- src/btstack_memory.c | 38 ++++++++++++++++++++++++++++++++ src/btstack_memory.h | 4 +++- tool/btstack_memory_generator.py | 2 +- 4 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/ble/mesh/mesh_network.h b/src/ble/mesh/mesh_network.h index b96d0aa67..0a27ff9b8 100644 --- a/src/ble/mesh/mesh_network.h +++ b/src/ble/mesh/mesh_network.h @@ -45,13 +45,36 @@ extern "C" { #endif +#define MESH_DEVICE_KEY_INDEX 0xffff +#define MESH_NETWORK_PAYLOAD_MAX 29 +#define MESH_ACCESS_PAYLOAD_MAX 384 + +// both mesh_network_du and mesh_access_pdu_t the same basic struct typedef struct { + // allow for linked lists btstack_linked_item_t item; + // meta data network layer uint16_t netkey_index; - uint8_t len; - uint8_t data[29]; + // meta data transport layer + uint16_t appkey_index; + // pdu + uint16_t len; + uint8_t data[MESH_NETWORK_PAYLOAD_MAX]; } mesh_network_pdu_t; +typedef struct { + // allow for linked lists + btstack_linked_item_t item; + // meta data network layer + uint16_t netkey_index; + // meta data transport layer + uint16_t appkey_index; + // pdu + uint16_t len; + uint8_t data[MESH_ACCESS_PAYLOAD_MAX]; +} mesh_access_pdu_t; + +// typedef struct { btstack_linked_item_t item; diff --git a/src/btstack_memory.c b/src/btstack_memory.c index 1186c63aa..db9eafbd9 100644 --- a/src/btstack_memory.c +++ b/src/btstack_memory.c @@ -938,6 +938,44 @@ void btstack_memory_mesh_network_pdu_free(mesh_network_pdu_t *mesh_network_pdu){ #endif +// MARK: mesh_access_pdu_t +#if !defined(HAVE_MALLOC) && !defined(MAX_NR_MESH_ACCESS_PDUS) + #if defined(MAX_NO_MESH_ACCESS_PDUS) + #error "Deprecated MAX_NO_MESH_ACCESS_PDUS defined instead of MAX_NR_MESH_ACCESS_PDUS. Please update your btstack_config.h to use MAX_NR_MESH_ACCESS_PDUS." + #else + #define MAX_NR_MESH_ACCESS_PDUS 0 + #endif +#endif + +#ifdef MAX_NR_MESH_ACCESS_PDUS +#if MAX_NR_MESH_ACCESS_PDUS > 0 +static mesh_access_pdu_t mesh_access_pdu_storage[MAX_NR_MESH_ACCESS_PDUS]; +static btstack_memory_pool_t mesh_access_pdu_pool; +mesh_access_pdu_t * btstack_memory_mesh_access_pdu_get(void){ + return (mesh_access_pdu_t *) btstack_memory_pool_get(&mesh_access_pdu_pool); +} +void btstack_memory_mesh_access_pdu_free(mesh_access_pdu_t *mesh_access_pdu){ + btstack_memory_pool_free(&mesh_access_pdu_pool, mesh_access_pdu); +} +#else +mesh_access_pdu_t * btstack_memory_mesh_access_pdu_get(void){ + return NULL; +} +void btstack_memory_mesh_access_pdu_free(mesh_access_pdu_t *mesh_access_pdu){ + // silence compiler warning about unused parameter in a portable way + (void) mesh_access_pdu; +}; +#endif +#elif defined(HAVE_MALLOC) +mesh_access_pdu_t * btstack_memory_mesh_access_pdu_get(void){ + return (mesh_access_pdu_t*) malloc(sizeof(mesh_access_pdu_t)); +} +void btstack_memory_mesh_access_pdu_free(mesh_access_pdu_t *mesh_access_pdu){ + free(mesh_access_pdu); +} +#endif + + // MARK: mesh_network_key_t #if !defined(HAVE_MALLOC) && !defined(MAX_NR_MESH_NETWORK_KEYS) #if defined(MAX_NO_MESH_NETWORK_KEYS) diff --git a/src/btstack_memory.h b/src/btstack_memory.h index 74fedccb7..e6500ff56 100644 --- a/src/btstack_memory.h +++ b/src/btstack_memory.h @@ -151,9 +151,11 @@ sm_lookup_entry_t * btstack_memory_sm_lookup_entry_get(void); void btstack_memory_sm_lookup_entry_free(sm_lookup_entry_t *sm_lookup_entry); #endif #ifdef ENABLE_MESH -// mesh_network_pdu, mesh_network_key +// mesh_network_pdu, mesh_access_pdu, mesh_network_key mesh_network_pdu_t * btstack_memory_mesh_network_pdu_get(void); void btstack_memory_mesh_network_pdu_free(mesh_network_pdu_t *mesh_network_pdu); +mesh_access_pdu_t * btstack_memory_mesh_access_pdu_get(void); +void btstack_memory_mesh_access_pdu_free(mesh_access_pdu_t *mesh_access_pdu); mesh_network_key_t * btstack_memory_mesh_network_key_get(void); void btstack_memory_mesh_network_key_free(mesh_network_key_t *mesh_network_key); #endif diff --git a/tool/btstack_memory_generator.py b/tool/btstack_memory_generator.py index eec9b17dd..e7291d2db 100755 --- a/tool/btstack_memory_generator.py +++ b/tool/btstack_memory_generator.py @@ -208,7 +208,7 @@ list_of_le_structs = [ ["gatt_client", "whitelist_entry", "sm_lookup_entry"], ] list_of_mesh_structs = [ - ['mesh_network_pdu', 'mesh_network_key'] + ['mesh_network_pdu', 'mesh_access_pdu', 'mesh_network_key'] ] btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')