From a3b69fde2a072dd4de0a84fe13f4210754a06b30 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 17 Aug 2020 15:34:40 +0200 Subject: [PATCH] gap: provide LE Whitelist API via gap_whitelist_add/remove/clear --- src/gap.h | 25 +++++++++++++++++++++++++ src/hci.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/src/gap.h b/src/gap.h index e4ff7bd74..37992455a 100644 --- a/src/gap.h +++ b/src/gap.h @@ -442,6 +442,28 @@ int gap_connection_parameter_range_included(le_connection_parameter_range_t * ex */ void gap_set_max_number_peripheral_connections(int max_peripheral_connections); +/** + * @brief Add Device to Whitelist + * @param address_typ + * @param address + * @returns 0 if ok + */ +uint8_t gap_whitelist_add(bd_addr_type_t address_type, bd_addr_t address); + +/** + * @brief Remove Device from Whitelist + * @param address_typ + * @param address + * @returns 0 if ok + */ +uint8_t gap_whitelist_remove(bd_addr_type_t address_type, bd_addr_t address); + +/** + * @brief Clear Whitelist + * @returns 0 if ok + */ +uint8_t gap_whitelist_clear(void); + /** * @brief Connect to remote LE device */ @@ -461,6 +483,7 @@ uint8_t gap_connect_cancel(void); /** * @brief Auto Connection Establishment - Start Connecting to device + * @deprecated Please setup Whitelist with gap_whitelist_* and start connecting with gap_connect_with_whitelist * @param address_typ * @param address * @returns 0 if ok @@ -469,6 +492,7 @@ uint8_t gap_auto_connection_start(bd_addr_type_t address_typ, bd_addr_t address) /** * @brief Auto Connection Establishment - Stop Connecting to device + * @deprecated Please setup Whitelist with gap_whitelist_* and start connecting with gap_connect_with_whitelist * @param address_typ * @param address * @returns 0 if ok @@ -477,6 +501,7 @@ uint8_t gap_auto_connection_stop(bd_addr_type_t address_typ, bd_addr_t address); /** * @brief Auto Connection Establishment - Stop everything + * @deprecated Please setup Whitelist with gap_whitelist_* and start connecting with gap_connect_with_whitelist * @note Convenience function to stop all active auto connection attempts */ uint8_t gap_auto_connection_stop_all(void); diff --git a/src/hci.c b/src/hci.c index 2b0f6e2f7..a0e3b2e32 100644 --- a/src/hci.c +++ b/src/hci.c @@ -165,7 +165,7 @@ static int hci_have_usb_transport(void); #ifdef ENABLE_LE_CENTRAL // called from test/ble_client/advertising_data_parser.c void le_handle_advertisement_report(uint8_t *packet, uint16_t size); -static void hci_whitelist_remove(bd_addr_type_t address_type, bd_addr_t address); +static uint8_t hci_whitelist_remove(bd_addr_type_t address_type, bd_addr_t address); static hci_connection_t * gap_get_outgoing_connection(void); #endif #endif @@ -5288,7 +5288,7 @@ static uint8_t hci_whitelist_add(bd_addr_type_t address_type, bd_addr_t address) return ERROR_CODE_SUCCESS; } -static void hci_whitelist_remove(bd_addr_type_t address_type, bd_addr_t address){ +static uint8_t hci_whitelist_remove(bd_addr_type_t address_type, bd_addr_t address){ btstack_linked_list_iterator_t it; btstack_linked_list_iterator_init(&it, &hci_stack->le_whitelist); while (btstack_linked_list_iterator_has_next(&it)){ @@ -5298,12 +5298,14 @@ static void hci_whitelist_remove(bd_addr_type_t address_type, bd_addr_t address) if (entry->state & LE_WHITELIST_ON_CONTROLLER){ // remove from controller if already present entry->state |= LE_WHITELIST_REMOVE_FROM_CONTROLLER; - continue; + } else { + // directly remove entry from whitelist + btstack_linked_list_iterator_remove(&it); + btstack_memory_whitelist_entry_free(entry); } - // directly remove entry from whitelist - btstack_linked_list_iterator_remove(&it); - btstack_memory_whitelist_entry_free(entry); + return ERROR_CODE_SUCCESS; } + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } static void hci_whitelist_clear(void){ @@ -5322,6 +5324,46 @@ static void hci_whitelist_clear(void){ } } +/** + * @brief Clear Whitelist + * @returns 0 if ok + */ +uint8_t gap_whitelist_clear(void){ + hci_whitelist_clear(); + hci_run(); + return ERROR_CODE_SUCCESS; +} + +/** + * @brief Add Device to Whitelist + * @param address_typ + * @param address + * @returns 0 if ok + */ +uint8_t gap_whitelist_add(bd_addr_type_t address_type, bd_addr_t address){ + uint8_t status = hci_whitelist_add(address_type, address); + if (status){ + return status; + } + hci_run(); + return ERROR_CODE_SUCCESS; +} + +/** + * @brief Remove Device from Whitelist + * @param address_typ + * @param address + * @returns 0 if ok + */ +uint8_t gap_whitelist_remove(bd_addr_type_t address_type, bd_addr_t address){ + uint8_t status = hci_whitelist_remove(address_type, address); + if (status){ + return status; + } + hci_run(); + return ERROR_CODE_SUCCESS; +} + #ifdef ENABLE_LE_CENTRAL /** * @brief Connect with Whitelist