diff options
-rwxr-xr-x | bta/gatt/bta_gattc_act.c | 1 | ||||
-rw-r--r-- | bta/jv/bta_jv_act.c | 1 | ||||
-rw-r--r-- | bta/sdp/bta_sdp_act.c | 3 | ||||
-rw-r--r-- | device/include/controller.h | 2 | ||||
-rw-r--r-- | device/src/controller.c | 8 | ||||
-rw-r--r-- | stack/btm/btm_ble_bgconn.c | 157 | ||||
-rw-r--r-- | stack/btm/btm_ble_gap.c | 10 | ||||
-rw-r--r-- | stack/btm/btm_ble_int.h | 8 | ||||
-rw-r--r-- | stack/btm/btm_devctl.c | 5 |
9 files changed, 63 insertions, 132 deletions
diff --git a/bta/gatt/bta_gattc_act.c b/bta/gatt/bta_gattc_act.c index 38d05a4cc..aa9fcae2f 100755 --- a/bta/gatt/bta_gattc_act.c +++ b/bta/gatt/bta_gattc_act.c @@ -811,6 +811,7 @@ void bta_gattc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) else if (p_data->hdr.event == BTA_GATTC_INT_DISCONN_EVT) { cb_data.close.status = p_data->int_conn.reason; + cb_data.close.reason = p_data->int_conn.reason; } if(p_cback) diff --git a/bta/jv/bta_jv_act.c b/bta/jv/bta_jv_act.c index a1826725f..363a1ad4e 100644 --- a/bta/jv/bta_jv_act.c +++ b/bta/jv/bta_jv_act.c @@ -24,6 +24,7 @@ #include <hardware/bluetooth.h> #include <arpa/inet.h> #include <pthread.h> +#include <stdlib.h> #include "bt_types.h" #include "gki.h" diff --git a/bta/sdp/bta_sdp_act.c b/bta/sdp/bta_sdp_act.c index e45042ce2..cbb1fcb97 100644 --- a/bta/sdp/bta_sdp_act.c +++ b/bta/sdp/bta_sdp_act.c @@ -23,6 +23,8 @@ #include <hardware/bluetooth.h> #include <hardware/bt_sdp.h> #include <arpa/inet.h> +#include <stdlib.h> +#include <string.h> #include "bt_types.h" #include "gki.h" @@ -34,7 +36,6 @@ #include "btm_api.h" #include "btm_int.h" #include "sdp_api.h" -#include <string.h> /***************************************************************************** ** Constants diff --git a/device/include/controller.h b/device/include/controller.h index 2acca1bc0..3e181b9c8 100644 --- a/device/include/controller.h +++ b/device/include/controller.h @@ -71,6 +71,8 @@ typedef struct controller_t { uint16_t (*get_acl_buffer_count_classic)(void); uint8_t (*get_acl_buffer_count_ble)(void); + uint8_t (*get_ble_white_list_size)(void); + uint8_t (*get_ble_resolving_list_max_size)(void); void (*set_ble_resolving_list_max_size)(int resolving_list_max_size); } controller_t; diff --git a/device/src/controller.c b/device/src/controller.c index 02edc4faf..62051d5fe 100644 --- a/device/src/controller.c +++ b/device/src/controller.c @@ -407,6 +407,12 @@ static uint8_t get_acl_buffer_count_ble(void) { return acl_buffer_count_ble; } +static uint8_t get_ble_white_list_size(void) { + assert(readable); + assert(ble_supported); + return ble_white_list_size; +} + static uint8_t get_ble_resolving_list_max_size(void) { assert(readable); assert(ble_supported); @@ -455,6 +461,8 @@ static const controller_t interface = { get_acl_buffer_count_classic, get_acl_buffer_count_ble, + get_ble_white_list_size, + get_ble_resolving_list_max_size, set_ble_resolving_list_max_size }; diff --git a/stack/btm/btm_ble_bgconn.c b/stack/btm/btm_ble_bgconn.c index a83a3c7b8..093a9eec2 100644 --- a/stack/btm/btm_ble_bgconn.c +++ b/stack/btm/btm_ble_bgconn.c @@ -177,53 +177,50 @@ void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr) } return; } + /******************************************************************************* ** ** Function btm_update_dev_to_white_list ** -** Description This function adds a device into white list. +** Description This function adds or removes a device into/from +** the white list. +** *******************************************************************************/ BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr) { - /* look up the sec device record, and find the address */ tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; - UINT8 wl_state = p_cb->wl_state; - if ((to_add && p_cb->num_empty_filter == 0) || - (!to_add && p_cb->num_empty_filter == p_cb->max_filter_entries)) + if (to_add && p_cb->white_list_avail_size == 0) { - BTM_TRACE_ERROR("WL full or empty, unable to update to WL. num_entry available: %d", - p_cb->num_empty_filter); + BTM_TRACE_ERROR("%s Whitelist full, unable to add device", __func__); return FALSE; } - btm_suspend_wl_activity(wl_state); - - /* enq pending WL device operation */ + btm_suspend_wl_activity(p_cb->wl_state); btm_enq_wl_dev_operation(to_add, bd_addr); - - btm_resume_wl_activity(wl_state); - + btm_resume_wl_activity(p_cb->wl_state); return TRUE; } + /******************************************************************************* ** ** Function btm_ble_clear_white_list ** ** Description This function clears the white list. +** *******************************************************************************/ void btm_ble_clear_white_list (void) { BTM_TRACE_EVENT ("btm_ble_clear_white_list"); btsnd_hcic_ble_clear_white_list(); - memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM)); } /******************************************************************************* ** ** Function btm_ble_clear_white_list_complete ** -** Description This function clears the white list complete. +** Description Indicates white list cleared. +** *******************************************************************************/ void btm_ble_clear_white_list_complete(UINT8 *p_data, UINT16 evt_len) { @@ -235,125 +232,57 @@ void btm_ble_clear_white_list_complete(UINT8 *p_data, UINT16 evt_len) STREAM_TO_UINT8 (status, p_data); if (status == HCI_SUCCESS) - p_cb->num_empty_filter = p_cb->max_filter_entries; + p_cb->white_list_avail_size = controller_get_interface()->get_ble_white_list_size(); +} +/******************************************************************************* +** +** Function btm_ble_white_list_init +** +** Description Initialize white list size +** +*******************************************************************************/ +void btm_ble_white_list_init(UINT8 white_list_size) +{ + BTM_TRACE_DEBUG("%s white_list_size = %d", __func__, white_list_size); + btm_cb.ble_ctr_cb.white_list_avail_size = white_list_size; } + /******************************************************************************* ** ** Function btm_ble_add_2_white_list_complete ** -** Description This function read the current white list size. +** Description White list element added +** *******************************************************************************/ void btm_ble_add_2_white_list_complete(UINT8 status) { - tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; - BTM_TRACE_EVENT ("btm_ble_add_2_white_list_complete"); - + BTM_TRACE_EVENT("%s status=%d", __func__, status); if (status == HCI_SUCCESS) - { - p_cb->num_empty_filter --; - } + --btm_cb.ble_ctr_cb.white_list_avail_size; } + /******************************************************************************* ** ** Function btm_ble_remove_from_white_list_complete ** -** Description This function remove the white list element complete. +** Description White list element removal complete +** *******************************************************************************/ void btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len) { - tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; UNUSED(evt_len); - - BTM_TRACE_EVENT ("btm_ble_remove_from_white_list_complete"); + BTM_TRACE_EVENT ("%s status=%d", __func__, *p); if (*p == HCI_SUCCESS) - { - p_cb->num_empty_filter ++; - } + ++btm_cb.ble_ctr_cb.white_list_avail_size; } -/******************************************************************************* -** -** Function btm_ble_count_unconn_dev_in_whitelist -** -** Description This function find the number of un-connected background device -*******************************************************************************/ -UINT8 btm_ble_count_unconn_dev_in_whitelist(void) -{ - tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; - UINT8 i, count = 0; - - for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++) - { - if (p_cb->bg_dev_list[i].in_use && - !BTM_IsAclConnectionUp(p_cb->bg_dev_list[i].bd_addr, BT_TRANSPORT_LE)) - { - count ++; - } - } - return count; -} -/******************************************************************************* -** -** Function btm_update_bg_conn_list -** -** Description This function update the local background connection device list. -*******************************************************************************/ -BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr) +static UINT8 btm_ble_count_dev_in_whitelist(void) { - tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; - tBTM_LE_BG_CONN_DEV *p_bg_dev = &p_cb->bg_dev_list[0], *p_next, *p_cur; - UINT8 i, j; - BOOLEAN ret = FALSE; - - BTM_TRACE_EVENT ("btm_update_bg_conn_list"); - - if ((to_add && (p_cb->bg_dev_num == BTM_BLE_MAX_BG_CONN_DEV_NUM || p_cb->num_empty_filter == 0))) - { - BTM_TRACE_DEBUG("num_empty_filter = %d", p_cb->num_empty_filter); - return ret; - } - - /* Look for existing device to add/remove attribute */ - for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++, p_bg_dev ++) - { - if (p_bg_dev->in_use && memcmp(p_bg_dev->bd_addr, bd_addr, BD_ADDR_LEN) == 0) - { - if (!to_add) - { - memset(p_bg_dev, 0, sizeof(tBTM_LE_BG_CONN_DEV)); - if (p_cb->bg_dev_num < BTM_BLE_MAX_BG_CONN_DEV_NUM) - { - /* The entry being removed is not at the highest index of the array: shift */ - p_cur = p_bg_dev; - p_next = p_bg_dev + 1; - for (j = i + 1 ;j < BTM_BLE_MAX_BG_CONN_DEV_NUM && p_next->in_use ; - j ++, p_cur ++, p_next ++ ) - { - memcpy(p_cur, p_next, sizeof(tBTM_LE_BG_CONN_DEV)); - memset(p_next, 0, sizeof(tBTM_LE_BG_CONN_DEV)); - } - } - p_cb->bg_dev_num --; - } - ret = TRUE; - break; - } - else if (!p_bg_dev->in_use && to_add) - { - BTM_TRACE_DEBUG("add new WL entry in bg_dev_list"); - - memcpy(p_bg_dev->bd_addr, bd_addr, BD_ADDR_LEN); - p_bg_dev->in_use = TRUE; - p_cb->bg_dev_num ++; - - ret = TRUE; - break; - } - } - - - return ret; + const uint8_t white_list_size = controller_get_interface()->get_ble_white_list_size(); + if (white_list_size == 0) + return 0; + return white_list_size - btm_cb.ble_ctr_cb.white_list_avail_size; } /******************************************************************************* @@ -379,7 +308,7 @@ BOOLEAN btm_ble_start_auto_conn(BOOLEAN start) if (start) { - if (p_cb->conn_state == BLE_CONN_IDLE && btm_ble_count_unconn_dev_in_whitelist() > 0 + if (p_cb->conn_state == BLE_CONN_IDLE && btm_ble_count_dev_in_whitelist() > 0 && btm_ble_topology_check(BTM_BLE_STATE_INIT)) { p_cb->wl_state |= BTM_BLE_WL_INIT; @@ -493,7 +422,7 @@ BOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK *p_select_c BTM_TRACE_ERROR("peripheral device cannot initiate passive scan for a selective connection"); return FALSE; } - else if (p_cb->bg_dev_num > 0 && btm_ble_count_unconn_dev_in_whitelist() > 0 ) + else if (btm_ble_count_dev_in_whitelist() > 0) { if (!btsnd_hcic_ble_set_scan_enable(TRUE, TRUE)) /* duplicate filtering enabled */ @@ -701,7 +630,7 @@ void btm_ble_enqueue_direct_conn_req(void *p_param) ** Returns TRUE if started, FALSE otherwise ** *******************************************************************************/ -BOOLEAN btm_send_pending_direct_conn(void ) +BOOLEAN btm_send_pending_direct_conn(void) { tBTM_BLE_CONN_REQ *p_req; BOOLEAN rt = FALSE; diff --git a/stack/btm/btm_ble_gap.c b/stack/btm/btm_ble_gap.c index e77f7019a..46953db83 100644 --- a/stack/btm/btm_ble_gap.c +++ b/stack/btm/btm_ble_gap.c @@ -800,14 +800,8 @@ void BTM_BleClearBgConnDev(void) *******************************************************************************/ BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR remote_bda) { - BOOLEAN ret = FALSE; - BTM_TRACE_EVENT (" BTM_BleUpdateBgConnDev"); - - /* update white list */ - if (btm_update_bg_conn_list(add_remove, remote_bda)) - ret = btm_update_dev_to_white_list(add_remove, remote_bda); - - return ret; + BTM_TRACE_EVENT("%s() add=%d", __func__, add_remove); + return btm_update_dev_to_white_list(add_remove, remote_bda); } /******************************************************************************* diff --git a/stack/btm/btm_ble_int.h b/stack/btm/btm_ble_int.h index cb37ff45a..9d5c49353 100644 --- a/stack/btm/btm_ble_int.h +++ b/stack/btm/btm_ble_int.h @@ -304,11 +304,8 @@ typedef struct tBTM_BLE_SEL_CBACK *p_select_cback; /* white list information */ - UINT8 num_empty_filter; /* Number of entries in white list */ - UINT8 max_filter_entries; /* Maximum number of entries that can be stored */ + UINT8 white_list_avail_size; tBTM_BLE_WL_STATE wl_state; - UINT8 bg_dev_num; - tBTM_LE_BG_CONN_DEV bg_dev_list[BTM_BLE_MAX_BG_CONN_DEV_NUM]; BUFFER_Q conn_pending_q; tBTM_BLE_CONN_ST conn_state; @@ -392,7 +389,6 @@ extern UINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr); /* white list function */ extern BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr); -extern BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr); extern void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy); extern void btm_update_adv_filter_policy(tBTM_BLE_AFP adv_policy); extern void btm_ble_clear_white_list (void); @@ -400,6 +396,7 @@ extern void btm_read_white_list_size_complete(UINT8 *p, UINT16 evt_len); extern void btm_ble_add_2_white_list_complete(UINT8 status); extern void btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len); extern void btm_ble_clear_white_list_complete(UINT8 *p, UINT16 evt_len); +extern void btm_ble_white_list_init(UINT8 white_list_size); /* background connection function */ extern void btm_ble_suspend_bg_conn(void); @@ -408,7 +405,6 @@ extern void btm_ble_initiate_select_conn(BD_ADDR bda); extern BOOLEAN btm_ble_start_auto_conn(BOOLEAN start); extern BOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK *p_select_cback); extern BOOLEAN btm_ble_renew_bg_conn_params(BOOLEAN add, BD_ADDR bd_addr); -extern UINT8 btm_ble_count_unconn_dev_in_whitelist(void); extern void btm_write_dir_conn_wl(BD_ADDR target_addr); extern void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bda, UINT8 status); extern BOOLEAN btm_execute_wl_dev_operation(void); diff --git a/stack/btm/btm_devctl.c b/stack/btm/btm_devctl.c index 4e46bac4c..e635cd19e 100644 --- a/stack/btm/btm_devctl.c +++ b/stack/btm/btm_devctl.c @@ -162,10 +162,8 @@ static void reset_complete(void *result) { #if (BLE_INCLUDED == TRUE) btm_cb.ble_ctr_cb.conn_state = BLE_CONN_IDLE; - btm_cb.ble_ctr_cb.bg_dev_num = 0; btm_cb.ble_ctr_cb.bg_conn_type = BTM_BLE_CONN_NONE; btm_cb.ble_ctr_cb.p_select_cback = NULL; - memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM)); gatt_reset_bgdev_list(); btm_ble_multi_adv_init(); #endif @@ -179,13 +177,14 @@ static void reset_complete(void *result) { /* Set up the BLE privacy settings */ if (controller->supports_ble() && controller->supports_ble_privacy() && controller->get_ble_resolving_list_max_size() > 0) { - btm_ble_resolving_list_init (controller->get_ble_resolving_list_max_size()); + btm_ble_resolving_list_init(controller->get_ble_resolving_list_max_size()); /* set the default random private address timeout */ btsnd_hcic_ble_set_rand_priv_addr_timeout(BTM_BLE_PRIVATE_ADDR_INT); } #endif if (controller->supports_ble()) { + btm_ble_white_list_init(controller->get_ble_white_list_size()); l2c_link_processs_ble_num_bufs(controller->get_acl_buffer_count_ble()); } #endif |