hci: define periodic_advertiser_list_entry_t

This commit is contained in:
Matthias Ringwald 2022-01-17 22:19:01 +01:00
parent 0c10ebdb23
commit dbca66ff5b
5 changed files with 120 additions and 2 deletions

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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']