Home | History | Annotate | Download | only in btm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains functions for BLE whitelist operation.
     22  *
     23  ******************************************************************************/
     24 
     25 #include <string.h>
     26 
     27 #include "bt_types.h"
     28 #include "btu.h"
     29 #include "btm_int.h"
     30 #include "l2c_int.h"
     31 #include "hcimsgs.h"
     32 
     33 
     34 #ifndef BTM_BLE_SCAN_PARAM_TOUT
     35 #define BTM_BLE_SCAN_PARAM_TOUT      50    /* 50 seconds */
     36 #endif
     37 
     38 #if (BLE_INCLUDED == TRUE)
     39 
     40 static void btm_suspend_wl_activity(tBTM_BLE_WL_STATE wl_state);
     41 static void btm_resume_wl_activity(tBTM_BLE_WL_STATE wl_state);
     42 
     43 /*******************************************************************************
     44 **
     45 ** Function         btm_update_scanner_filter_policy
     46 **
     47 ** Description      This function update the filter policy of scnner or advertiser.
     48 *******************************************************************************/
     49 void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy)
     50 {
     51     tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
     52     BTM_TRACE_EVENT0 ("btm_update_scanner_filter_policy");
     53 
     54     p_inq->sfp = scan_policy;
     55     p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
     56 
     57     btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
     58                                     (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
     59                                     (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
     60                                      BLE_ADDR_PUBLIC,
     61                                      scan_policy);
     62 }
     63 /*******************************************************************************
     64 **
     65 ** Function         btm_add_dev_to_controller
     66 **
     67 ** Description      This function load the device into controller white list
     68 *******************************************************************************/
     69 BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
     70 {
     71     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev (bd_addr);
     72     tBLE_ADDR_TYPE  addr_type = BLE_ADDR_PUBLIC;
     73     BOOLEAN             started = FALSE;
     74     BD_ADDR             dummy_bda = {0};
     75     tBT_DEVICE_TYPE dev_type;
     76 
     77     if (p_dev_rec != NULL &&
     78         p_dev_rec->device_type == BT_DEVICE_TYPE_BLE)
     79     {
     80 
     81         if (to_add)
     82         {
     83             if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr))
     84             {
     85                 started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.ble_addr_type, bd_addr);
     86             }
     87             if (memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0 &&
     88                 memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) != 0)
     89             {
     90                  started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.static_addr_type, p_dev_rec->ble.static_addr);
     91             }
     92         }
     93         else
     94         {
     95             if (!BTM_BLE_IS_RESOLVE_BDA(bd_addr))
     96             {
     97                     started = btsnd_hcic_ble_remove_from_white_list (p_dev_rec->ble.ble_addr_type, bd_addr);
     98             }
     99             if (memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) != 0 &&
    100                 memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0)
    101             {
    102                     started = btsnd_hcic_ble_remove_from_white_list (p_dev_rec->ble.static_addr_type, p_dev_rec->ble.static_addr);
    103             }
    104         }
    105     }    /* if not a known device, shall we add it? */
    106     else
    107     {
    108         BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
    109 
    110         if (to_add)
    111             started = btsnd_hcic_ble_add_white_list (addr_type, bd_addr);
    112         else
    113             started = btsnd_hcic_ble_remove_from_white_list (addr_type, bd_addr);
    114     }
    115 
    116     return started;
    117 
    118 }
    119 /*******************************************************************************
    120 **
    121 ** Function         btm_execute_wl_dev_operation
    122 **
    123 ** Description      execute the pending whitelist device operation(loading or removing)
    124 *******************************************************************************/
    125 BOOLEAN btm_execute_wl_dev_operation(void)
    126 {
    127     tBTM_BLE_WL_OP *p_dev_op = btm_cb.ble_ctr_cb.wl_op_q;
    128     UINT8   i = 0;
    129     BOOLEAN rt = TRUE;
    130 
    131     for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && rt; i ++, p_dev_op ++)
    132     {
    133         if (p_dev_op->in_use)
    134         {
    135             rt = btm_add_dev_to_controller(p_dev_op->to_add, p_dev_op->bd_addr, p_dev_op->attr);
    136             memset(p_dev_op, 0, sizeof(tBTM_BLE_WL_OP));
    137         }
    138         else
    139             break;
    140     }
    141     return rt;
    142 }
    143 /*******************************************************************************
    144 **
    145 ** Function         btm_enq_wl_dev_operation
    146 **
    147 ** Description      enqueue the pending whitelist device operation(loading or removing).
    148 *******************************************************************************/
    149 void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
    150 {
    151     tBTM_BLE_WL_OP *p_dev_op = btm_cb.ble_ctr_cb.wl_op_q;
    152     UINT8   i = 0;
    153 
    154     for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++, p_dev_op ++)
    155     {
    156         if (p_dev_op->in_use && !memcmp(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN))
    157         {
    158             p_dev_op->to_add = to_add;
    159             p_dev_op->attr = attr;
    160             return;
    161         }
    162         else if (!p_dev_op->in_use)
    163             break;
    164     }
    165     if (i != BTM_BLE_MAX_BG_CONN_DEV_NUM)
    166     {
    167         p_dev_op->in_use = TRUE;
    168         p_dev_op->to_add = to_add;
    169         p_dev_op->attr  = attr;
    170         memcpy(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN);
    171     }
    172     else
    173     {
    174         BTM_TRACE_ERROR0("max pending WL operation reached, discard");
    175     }
    176     return;
    177 }
    178 /*******************************************************************************
    179 **
    180 ** Function         btm_update_dev_to_white_list
    181 **
    182 ** Description      This function adds a device into white list.
    183 *******************************************************************************/
    184 BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
    185 {
    186     /* look up the sec device record, and find the address */
    187     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    188     BOOLEAN     started = FALSE;
    189     UINT8       wl_state = p_cb->wl_state;
    190 
    191     if ((to_add && p_cb->num_empty_filter == 0) ||
    192         (!to_add && p_cb->num_empty_filter == p_cb->max_filter_entries))
    193     {
    194         BTM_TRACE_ERROR1("WL full or empty, unable to update to WL. num_entry available: %d",
    195                           p_cb->num_empty_filter);
    196         return started;
    197     }
    198 
    199     btm_suspend_wl_activity(wl_state);
    200 
    201     /* enq pending WL device operation */
    202     btm_enq_wl_dev_operation(to_add, bd_addr, attr);
    203 
    204     btm_resume_wl_activity(wl_state);
    205 
    206     return started;
    207 }
    208 /*******************************************************************************
    209 **
    210 ** Function         btm_ble_clear_white_list
    211 **
    212 ** Description      This function clears the white list.
    213 *******************************************************************************/
    214 void btm_ble_clear_white_list (void)
    215 {
    216     BTM_TRACE_EVENT0 ("btm_ble_clear_white_list");
    217     btsnd_hcic_ble_clear_white_list();
    218 }
    219 
    220 /*******************************************************************************
    221 **
    222 ** Function         btm_ble_clear_white_list_complete
    223 **
    224 ** Description      This function clears the white list complete.
    225 *******************************************************************************/
    226 void btm_ble_clear_white_list_complete(UINT8 *p_data, UINT16 evt_len)
    227 {
    228     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    229     UINT8       status;
    230     BTM_TRACE_EVENT0 ("btm_ble_clear_white_list_complete");
    231     STREAM_TO_UINT8  (status, p_data);
    232 
    233     if (status == HCI_SUCCESS)
    234         p_cb->num_empty_filter = p_cb->max_filter_entries;
    235 
    236 }
    237 /*******************************************************************************
    238 **
    239 ** Function         btm_ble_add_2_white_list_complete
    240 **
    241 ** Description      This function read the current white list size.
    242 *******************************************************************************/
    243 void btm_ble_add_2_white_list_complete(UINT8 status)
    244 {
    245     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    246     BTM_TRACE_EVENT0 ("btm_ble_add_2_white_list_complete");
    247 
    248     if (status == HCI_SUCCESS)
    249     {
    250         p_cb->num_empty_filter --;
    251     }
    252 }
    253 /*******************************************************************************
    254 **
    255 ** Function         btm_ble_add_2_white_list_complete
    256 **
    257 ** Description      This function read the current white list size.
    258 *******************************************************************************/
    259 void btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len)
    260 {
    261     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    262     BTM_TRACE_EVENT0 ("btm_ble_remove_from_white_list_complete");
    263     if (*p == HCI_SUCCESS)
    264     {
    265         p_cb->num_empty_filter ++;
    266     }
    267 }
    268 /*******************************************************************************
    269 **
    270 ** Function         btm_ble_count_unconn_dev_in_whitelist
    271 **
    272 ** Description      This function find the number of un-connected background device
    273 *******************************************************************************/
    274 UINT8 btm_ble_count_unconn_dev_in_whitelist(void)
    275 {
    276     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    277     UINT8 i, count = 0;
    278 
    279     for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++)
    280     {
    281         if (p_cb->bg_dev_list[i].in_use &&
    282             !BTM_IsAclConnectionUp(p_cb->bg_dev_list[i].bd_addr))
    283         {
    284             count ++;
    285         }
    286     }
    287     return count;
    288 
    289 }
    290 /*******************************************************************************
    291 **
    292 ** Function         btm_update_bg_conn_list
    293 **
    294 ** Description      This function update the local background connection device list.
    295 *******************************************************************************/
    296 BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 *p_attr_tag)
    297 {
    298     tBTM_BLE_CB             *p_cb = &btm_cb.ble_ctr_cb;
    299     tBTM_LE_BG_CONN_DEV     *p_bg_dev = &p_cb->bg_dev_list[0], *p_next, *p_cur;
    300     UINT8                   i, j;
    301     BOOLEAN             ret = FALSE;
    302 
    303     BTM_TRACE_EVENT0 ("btm_update_bg_conn_list");
    304 
    305     if ((to_add && (p_cb->bg_dev_num == BTM_BLE_MAX_BG_CONN_DEV_NUM || p_cb->num_empty_filter == 0)))
    306     {
    307         BTM_TRACE_DEBUG1("num_empty_filter = %d", p_cb->num_empty_filter);
    308         return ret;
    309     }
    310 
    311     for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++, p_bg_dev ++)
    312     {
    313         if (p_bg_dev->in_use && memcmp(p_bg_dev->bd_addr, bd_addr, BD_ADDR_LEN) == 0)
    314         {
    315             if (!to_add)
    316             {
    317                 memset(p_bg_dev, 0, sizeof(tBTM_LE_BG_CONN_DEV));
    318                 p_cb->bg_dev_num --;
    319                 p_cur = p_bg_dev;
    320                 p_next = p_bg_dev + 1;
    321                 for (j = i + 1 ;j < BTM_BLE_MAX_BG_CONN_DEV_NUM && p_next->in_use ; j ++, p_cur ++, p_next ++ )
    322                     memcpy(p_cur, p_next, sizeof(tBTM_LE_BG_CONN_DEV));
    323             }
    324             ret = TRUE;
    325             break;
    326         }
    327         else if (!p_bg_dev->in_use && to_add)
    328         {
    329             BTM_TRACE_DEBUG0("add new WL entry in bg_dev_list");
    330 
    331             memcpy(p_bg_dev->bd_addr, bd_addr, BD_ADDR_LEN);
    332             p_bg_dev->in_use = TRUE;
    333             p_cb->bg_dev_num ++;
    334 
    335             ret = TRUE;
    336             break;
    337         }
    338     }
    339 
    340 
    341     return ret;
    342 }
    343 
    344 /*******************************************************************************
    345 **
    346 ** Function         btm_ble_start_auto_conn
    347 **
    348 ** Description      This function is to start/stop auto connection procedure.
    349 **
    350 ** Parameters       start: TRUE to start; FALSE to stop.
    351 **
    352 ** Returns          void
    353 **
    354 *******************************************************************************/
    355 BOOLEAN btm_ble_start_auto_conn(BOOLEAN start)
    356 {
    357     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    358     BD_ADDR dummy_bda = {0};
    359     BOOLEAN exec = TRUE;
    360     UINT8  own_addr_type = BLE_ADDR_PUBLIC;
    361     UINT16 scan_int, scan_win;
    362 
    363     if (start)
    364     {
    365         if (p_cb->conn_state == BLE_CONN_IDLE && btm_ble_count_unconn_dev_in_whitelist() > 0)
    366         {
    367             btm_execute_wl_dev_operation();
    368 
    369             scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_SLOW_INT_1 : p_cb->scan_int;
    370             scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_SLOW_WIN_1 : p_cb->scan_win;
    371 
    372             if (!btsnd_hcic_ble_create_ll_conn (scan_int,  /* UINT16 scan_int      */
    373                                                 scan_win,    /* UINT16 scan_win      */
    374                                                 0x01,                   /* UINT8 white_list     */
    375                                                 BLE_ADDR_PUBLIC,        /* UINT8 addr_type_peer */
    376                                                 dummy_bda,              /* BD_ADDR bda_peer     */
    377                                                 own_addr_type,         /* UINT8 addr_type_own, not allow random address for central  */
    378                                                 BTM_BLE_CONN_INT_MIN_DEF,   /* UINT16 conn_int_min  */
    379                                                 BTM_BLE_CONN_INT_MAX_DEF,   /* UINT16 conn_int_max  */
    380                                                 BTM_BLE_CONN_SLAVE_LATENCY_DEF,  /* UINT16 conn_latency  */
    381                                                 BTM_BLE_CONN_TIMEOUT_DEF,        /* UINT16 conn_timeout  */
    382                                                 0,                       /* UINT16 min_len       */
    383                                                 0))                      /* UINT16 max_len       */
    384             {
    385                 /* start auto connection failed */
    386                 exec =  FALSE;
    387             }
    388             else
    389             {
    390                 btm_ble_set_conn_st (BLE_BG_CONN);
    391 
    392             }
    393         }
    394         else
    395         {
    396             exec = FALSE;
    397         }
    398     }
    399     else
    400     {
    401         if (p_cb->conn_state == BLE_BG_CONN)
    402         {
    403             btsnd_hcic_ble_create_conn_cancel();
    404             btm_ble_set_conn_st (BLE_CONN_CANCEL);
    405 
    406         }
    407         else
    408         {
    409 #if 0
    410             BTM_TRACE_ERROR1("conn_st = %d, not in auto conn state, can not stop.", p_cb->conn_state);
    411             exec = FALSE;
    412 #endif
    413         }
    414     }
    415     return exec;
    416 }
    417 
    418 /*******************************************************************************
    419 **
    420 ** Function         btm_ble_start_select_conn
    421 **
    422 ** Description      This function is to start/stop selective connection procedure.
    423 **
    424 ** Parameters       start: TRUE to start; FALSE to stop.
    425 **                  p_select_cback: callback function to return application
    426 **                                  selection.
    427 **
    428 ** Returns          BOOLEAN: selective connectino procedure is started.
    429 **
    430 *******************************************************************************/
    431 BOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK   *p_select_cback)
    432 {
    433     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    434     UINT16 scan_int, scan_win;
    435 
    436     BTM_TRACE_EVENT0 ("btm_ble_start_select_conn");
    437 
    438     scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int;
    439     scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win;
    440 
    441     if (start)
    442     {
    443         if (btm_cb.btm_inq_vars.inq_active == BTM_INQUIRY_INACTIVE)
    444         {
    445             if (p_select_cback != NULL)
    446                 btm_cb.ble_ctr_cb.p_select_cback = p_select_cback;
    447 
    448             btm_update_scanner_filter_policy(SP_ADV_WL);
    449             btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_PASS;
    450 
    451             if (!btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_PASS,  /* use passive scan by default */
    452                                                 scan_int, /* scan interval */
    453                                                 scan_win,    /* scan window */
    454                                                 BLE_ADDR_PUBLIC,         /* own device, DUMO always use public */
    455                                                 SP_ADV_WL)              /* process advertising packets only from devices in the White List */
    456                 )
    457                 return FALSE;
    458 
    459             if (p_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE
    460                 )
    461             {
    462                 BTM_TRACE_ERROR0("peripheral device cannot initiate a selective connection");
    463                 return FALSE;
    464             }
    465             else if (p_cb->bg_dev_num > 0 && btm_ble_count_unconn_dev_in_whitelist() > 0 )
    466             {
    467 
    468                 if (!btsnd_hcic_ble_set_scan_enable(TRUE, TRUE)) /* duplicate filtering enabled */
    469                     return FALSE;
    470 
    471                 /* mark up inquiry status flag */
    472                 btm_cb.btm_inq_vars.inq_active |= BTM_LE_SELECT_CONN_ACTIVE;
    473                 p_cb->inq_var.proc_mode = BTM_BLE_SELECT_SCAN;
    474                 p_cb->conn_state                = BLE_BG_CONN;
    475             }
    476         }
    477         else
    478         {
    479             BTM_TRACE_ERROR0("scan active, can not start selective connection procedure");
    480             return FALSE;
    481         }
    482     }
    483     else /* disable selective connection mode */
    484     {
    485         btm_cb.btm_inq_vars.inq_active &= ~BTM_LE_SELECT_CONN_ACTIVE;
    486         btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE;
    487 
    488         btm_update_scanner_filter_policy(SP_ADV_ALL);
    489         /* stop scanning */
    490             if (!btsnd_hcic_ble_set_scan_enable(FALSE, TRUE)) /* duplicate filtering enabled */
    491                 return FALSE;
    492         btm_update_scanner_filter_policy(SP_ADV_ALL);
    493     }
    494     return TRUE;
    495 }
    496 /*******************************************************************************
    497 **
    498 ** Function         btm_ble_initiate_select_conn
    499 **
    500 ** Description      This function is to start/stop selective connection procedure.
    501 **
    502 ** Parameters       start: TRUE to start; FALSE to stop.
    503 **                  p_select_cback: callback function to return application
    504 **                                  selection.
    505 **
    506 ** Returns          BOOLEAN: selective connectino procedure is started.
    507 **
    508 *******************************************************************************/
    509 void btm_ble_initiate_select_conn(BD_ADDR bda)
    510 {
    511     BTM_TRACE_EVENT0 ("btm_ble_initiate_select_conn");
    512 
    513     /* use direct connection procedure to initiate connection */
    514     if (!L2CA_ConnectFixedChnl(L2CAP_ATT_CID, bda))
    515     {
    516         BTM_TRACE_ERROR0("btm_ble_initiate_select_conn failed");
    517     }
    518 }
    519 /*******************************************************************************
    520 **
    521 ** Function         btm_ble_suspend_bg_conn
    522 **
    523 ** Description      This function is to suspend an active background connection
    524 **                  procedure.
    525 **
    526 ** Parameters       none.
    527 **
    528 ** Returns          none.
    529 **
    530 *******************************************************************************/
    531 void btm_ble_suspend_bg_conn(void)
    532 {
    533     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    534     BTM_TRACE_EVENT0 ("btm_ble_suspend_bg_conn");
    535 
    536     if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO)
    537     {
    538         btm_ble_start_auto_conn(FALSE);
    539     }
    540     else if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE)
    541     {
    542         btm_ble_start_select_conn(FALSE, NULL);
    543     }
    544 }
    545 /*******************************************************************************
    546 **
    547 ** Function         btm_suspend_wl_activity
    548 **
    549 ** Description      This function is to suspend white list related activity
    550 **
    551 ** Returns          none.
    552 **
    553 *******************************************************************************/
    554 static void btm_suspend_wl_activity(tBTM_BLE_WL_STATE wl_state)
    555 {
    556     if (wl_state & BTM_BLE_WL_INIT)
    557     {
    558         btm_ble_start_auto_conn(FALSE);
    559     }
    560     if (wl_state & BTM_BLE_WL_SCAN)
    561     {
    562         btm_ble_start_select_conn(FALSE, NULL);
    563     }
    564     if (wl_state & BTM_BLE_WL_ADV)
    565     {
    566         btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_DISABLE);
    567     }
    568 
    569 }
    570 /*******************************************************************************
    571 **
    572 ** Function         btm_resume_wl_activity
    573 **
    574 ** Description      This function is to resume white list related activity
    575 **
    576 ** Returns          none.
    577 **
    578 *******************************************************************************/
    579 static void btm_resume_wl_activity(tBTM_BLE_WL_STATE wl_state)
    580 {
    581     btm_ble_resume_bg_conn();
    582 
    583     if (wl_state & BTM_BLE_WL_ADV)
    584     {
    585         btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_ENABLE);
    586     }
    587 
    588 }
    589 /*******************************************************************************
    590 **
    591 ** Function         btm_ble_resume_bg_conn
    592 **
    593 ** Description      This function is to resume a background auto connection
    594 **                  procedure.
    595 **
    596 ** Parameters       none.
    597 **
    598 ** Returns          none.
    599 **
    600 *******************************************************************************/
    601 BOOLEAN btm_ble_resume_bg_conn(void)
    602 {
    603     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    604     BOOLEAN ret = FALSE;
    605 
    606     if (p_cb->bg_conn_type != BTM_BLE_CONN_NONE)
    607     {
    608         if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO)
    609             ret = btm_ble_start_auto_conn(TRUE);
    610 
    611         if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE)
    612             ret = btm_ble_start_select_conn(TRUE, btm_cb.ble_ctr_cb.p_select_cback);
    613     }
    614 
    615     return ret;
    616 }
    617 /*******************************************************************************
    618 **
    619 ** Function         btm_ble_get_conn_st
    620 **
    621 ** Description      This function get BLE connection state
    622 **
    623 ** Returns          connection state
    624 **
    625 *******************************************************************************/
    626 tBTM_BLE_CONN_ST btm_ble_get_conn_st(void)
    627 {
    628     return btm_cb.ble_ctr_cb.conn_state;
    629 }
    630 /*******************************************************************************
    631 **
    632 ** Function         btm_ble_set_conn_st
    633 **
    634 ** Description      This function set BLE connection state
    635 **
    636 ** Returns          None.
    637 **
    638 *******************************************************************************/
    639 void btm_ble_set_conn_st(tBTM_BLE_CONN_ST new_st)
    640 {
    641     btm_cb.ble_ctr_cb.conn_state = new_st;
    642 }
    643 
    644 /*******************************************************************************
    645 **
    646 ** Function         btm_ble_enqueue_direct_conn_req
    647 **
    648 ** Description      This function enqueue the direct connection request
    649 **
    650 ** Returns          None.
    651 **
    652 *******************************************************************************/
    653 void btm_ble_enqueue_direct_conn_req(void *p_param)
    654 {
    655     tBTM_BLE_CONN_REQ   *p = (tBTM_BLE_CONN_REQ *)GKI_getbuf(sizeof(tBTM_BLE_CONN_REQ));
    656 
    657     p->p_param = p_param;
    658 
    659     GKI_enqueue (&btm_cb.ble_ctr_cb.conn_pending_q, p);
    660 }
    661 /*******************************************************************************
    662 **
    663 ** Function         btm_send_pending_direct_conn
    664 **
    665 ** Description      This function send the pending direct connection request in queue
    666 **
    667 ** Returns          TRUE if started, FALSE otherwise
    668 **
    669 *******************************************************************************/
    670 BOOLEAN btm_send_pending_direct_conn(void )
    671 {
    672     tBTM_BLE_CONN_REQ *p_req;
    673     BOOLEAN     rt = FALSE;
    674 
    675     if ( btm_cb.ble_ctr_cb.conn_pending_q.count )
    676     {
    677         p_req = (tBTM_BLE_CONN_REQ*)GKI_dequeue (&btm_cb.ble_ctr_cb.conn_pending_q);
    678 
    679         rt = l2cble_init_direct_conn((tL2C_LCB *)(p_req->p_param));
    680 
    681         GKI_freebuf((void *)p_req);
    682     }
    683 
    684     return rt;
    685 }
    686 #endif
    687 
    688 
    689