From dbca66ff5b7d5d6c4b8a34e88f8c8497a15a22f5 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 17 Jan 2022 22:19:01 +0100 Subject: [PATCH] hci: define periodic_advertiser_list_entry_t --- src/btstack_memory.c | 60 +++++++++++++++++++++ src/btstack_memory.h | 4 +- src/hci.h | 14 +++++ test/btstack_memory/btstack_memory_test.cpp | 42 +++++++++++++++ tool/btstack_memory_generator.py | 2 +- 5 files changed, 120 insertions(+), 2 deletions(-) diff --git a/src/btstack_memory.c b/src/btstack_memory.c index 917f70e86..4fa2f7c71 100644 --- a/src/btstack_memory.c +++ b/src/btstack_memory.c @@ -1385,6 +1385,63 @@ void btstack_memory_whitelist_entry_free(whitelist_entry_t *whitelist_entry){ #endif +// MARK: periodic_advertiser_list_entry_t +#if !defined(HAVE_MALLOC) && !defined(MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES) + #if defined(MAX_NO_PERIODIC_ADVERTISER_LIST_ENTRIES) + #error "Deprecated MAX_NO_PERIODIC_ADVERTISER_LIST_ENTRIES defined instead of MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES. Please update your btstack_config.h to use MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES." + #else + #define MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES 0 + #endif +#endif + +#ifdef MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES +#if MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES > 0 +static periodic_advertiser_list_entry_t periodic_advertiser_list_entry_storage[MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES]; +static btstack_memory_pool_t periodic_advertiser_list_entry_pool; +periodic_advertiser_list_entry_t * btstack_memory_periodic_advertiser_list_entry_get(void){ + void * buffer = btstack_memory_pool_get(&periodic_advertiser_list_entry_pool); + if (buffer){ + memset(buffer, 0, sizeof(periodic_advertiser_list_entry_t)); + } + return (periodic_advertiser_list_entry_t *) buffer; +} +void btstack_memory_periodic_advertiser_list_entry_free(periodic_advertiser_list_entry_t *periodic_advertiser_list_entry){ + btstack_memory_pool_free(&periodic_advertiser_list_entry_pool, periodic_advertiser_list_entry); +} +#else +periodic_advertiser_list_entry_t * btstack_memory_periodic_advertiser_list_entry_get(void){ + return NULL; +} +void btstack_memory_periodic_advertiser_list_entry_free(periodic_advertiser_list_entry_t *periodic_advertiser_list_entry){ + UNUSED(periodic_advertiser_list_entry); +}; +#endif +#elif defined(HAVE_MALLOC) + +typedef struct { + btstack_memory_buffer_t tracking; + periodic_advertiser_list_entry_t data; +} btstack_memory_periodic_advertiser_list_entry_t; + +periodic_advertiser_list_entry_t * btstack_memory_periodic_advertiser_list_entry_get(void){ + btstack_memory_periodic_advertiser_list_entry_t * buffer = (btstack_memory_periodic_advertiser_list_entry_t *) malloc(sizeof(btstack_memory_periodic_advertiser_list_entry_t)); + if (buffer){ + memset(buffer, 0, sizeof(btstack_memory_periodic_advertiser_list_entry_t)); + btstack_memory_tracking_add(&buffer->tracking); + return &buffer->data; + } else { + return NULL; + } +} +void btstack_memory_periodic_advertiser_list_entry_free(periodic_advertiser_list_entry_t *periodic_advertiser_list_entry){ + // reconstruct buffer start + btstack_memory_buffer_t * buffer = &((btstack_memory_buffer_t *) periodic_advertiser_list_entry)[-1]; + btstack_memory_tracking_remove(buffer); + free(buffer); +} +#endif + + #endif #ifdef ENABLE_MESH @@ -1865,6 +1922,9 @@ void btstack_memory_init(void){ #if MAX_NR_WHITELIST_ENTRIES > 0 btstack_memory_pool_create(&whitelist_entry_pool, whitelist_entry_storage, MAX_NR_WHITELIST_ENTRIES, sizeof(whitelist_entry_t)); #endif +#if MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES > 0 + btstack_memory_pool_create(&periodic_advertiser_list_entry_pool, periodic_advertiser_list_entry_storage, MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES, sizeof(periodic_advertiser_list_entry_t)); +#endif #endif #ifdef ENABLE_MESH #if MAX_NR_MESH_NETWORK_PDUS > 0 diff --git a/src/btstack_memory.h b/src/btstack_memory.h index 5f4918452..48bdd7133 100644 --- a/src/btstack_memory.h +++ b/src/btstack_memory.h @@ -160,7 +160,7 @@ void btstack_memory_avrcp_browsing_connection_free(avrcp_browsing_connection_t #endif #ifdef ENABLE_BLE -// battery_service_client, gatt_client, hids_client, scan_parameters_service_client, sm_lookup_entry, whitelist_entry +// battery_service_client, gatt_client, hids_client, scan_parameters_service_client, sm_lookup_entry, whitelist_entry, periodic_advertiser_list_entry battery_service_client_t * btstack_memory_battery_service_client_get(void); void btstack_memory_battery_service_client_free(battery_service_client_t *battery_service_client); gatt_client_t * btstack_memory_gatt_client_get(void); @@ -173,6 +173,8 @@ 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); whitelist_entry_t * btstack_memory_whitelist_entry_get(void); void btstack_memory_whitelist_entry_free(whitelist_entry_t *whitelist_entry); +periodic_advertiser_list_entry_t * btstack_memory_periodic_advertiser_list_entry_get(void); +void btstack_memory_periodic_advertiser_list_entry_free(periodic_advertiser_list_entry_t *periodic_advertiser_list_entry); #endif #ifdef ENABLE_MESH // mesh_network_pdu, mesh_segmented_pdu, mesh_upper_transport_pdu, mesh_network_key, mesh_transport_key, mesh_virtual_address, mesh_subnet diff --git a/src/hci.h b/src/hci.h index 1484e2f24..505332626 100644 --- a/src/hci.h +++ b/src/hci.h @@ -830,6 +830,12 @@ enum { LE_WHITELIST_REMOVE_FROM_CONTROLLER = 1 << 2, }; +enum { + LE_PERIODIC_ADVERTISER_LIST_ENTRY_ON_CONTROLLER = 1 << 0, + LE_PERIODIC_ADVERTISER_LIST_ENTRY_ADD_TO_CONTROLLER = 1 << 1, + LE_PERIODIC_ADVERTISER_LIST_ENTRY_REMOVE_FROM_CONTROLLER = 1 << 2, +}; + typedef struct { btstack_linked_item_t item; bd_addr_t address; @@ -837,6 +843,14 @@ typedef struct { uint8_t state; } whitelist_entry_t; +typedef struct { + btstack_linked_item_t item; + bd_addr_t address; + bd_addr_type_t address_type; + uint8_t sid; + uint8_t state; +} periodic_advertiser_list_entry_t; + #define MAX_NUM_RESOLVING_LIST_ENTRIES 64 typedef enum { LE_RESOLVING_LIST_SEND_ENABLE_ADDRESS_RESOLUTION, diff --git a/test/btstack_memory/btstack_memory_test.cpp b/test/btstack_memory/btstack_memory_test.cpp index b900f3925..f36ff0e9b 100644 --- a/test/btstack_memory/btstack_memory_test.cpp +++ b/test/btstack_memory/btstack_memory_test.cpp @@ -1010,6 +1010,48 @@ TEST(btstack_memory, whitelist_entry_NotEnoughBuffers){ CHECK(context == NULL); } + + +TEST(btstack_memory, periodic_advertiser_list_entry_GetAndFree){ + periodic_advertiser_list_entry_t * context; +#ifdef HAVE_MALLOC + context = btstack_memory_periodic_advertiser_list_entry_get(); + CHECK(context != NULL); + btstack_memory_periodic_advertiser_list_entry_free(context); +#else +#ifdef MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES + // single + context = btstack_memory_periodic_advertiser_list_entry_get(); + CHECK(context != NULL); + btstack_memory_periodic_advertiser_list_entry_free(context); +#else + // none + context = btstack_memory_periodic_advertiser_list_entry_get(); + CHECK(context == NULL); + btstack_memory_periodic_advertiser_list_entry_free(context); +#endif +#endif +} + +TEST(btstack_memory, periodic_advertiser_list_entry_NotEnoughBuffers){ + periodic_advertiser_list_entry_t * context; +#ifdef HAVE_MALLOC + simulate_no_memory = 1; +#else +#ifdef MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES + int i; + // alloc all static buffers + for (i = 0; i < MAX_NR_PERIODIC_ADVERTISER_LIST_ENTRIES; i++){ + context = btstack_memory_periodic_advertiser_list_entry_get(); + CHECK(context != NULL); + } +#endif +#endif + // get one more + context = btstack_memory_periodic_advertiser_list_entry_get(); + CHECK(context == NULL); +} + #endif #ifdef ENABLE_MESH diff --git a/tool/btstack_memory_generator.py b/tool/btstack_memory_generator.py index 3088d0fb4..4244661da 100755 --- a/tool/btstack_memory_generator.py +++ b/tool/btstack_memory_generator.py @@ -303,7 +303,7 @@ list_of_classic_structs = [ ["avrcp_browsing_connection"], ] list_of_le_structs = [ - ["battery_service_client", "gatt_client", "hids_client", "scan_parameters_service_client", "sm_lookup_entry", "whitelist_entry"], + ["battery_service_client", "gatt_client", "hids_client", "scan_parameters_service_client", "sm_lookup_entry", "whitelist_entry", "periodic_advertiser_list_entry"], ] list_of_mesh_structs = [ ['mesh_network_pdu', 'mesh_segmented_pdu', 'mesh_upper_transport_pdu', 'mesh_network_key', 'mesh_transport_key', 'mesh_virtual_address', 'mesh_subnet']