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 #ifndef BTM_BLE_SCAN_PARAM_TOUT
     34 #define BTM_BLE_SCAN_PARAM_TOUT      50    /* 50 seconds */
     35 #endif
     36 
     37 #if (BLE_INCLUDED == TRUE)
     38 /*******************************************************************************
     39 **
     40 ** Function         btm_update_scanner_filter_policy
     41 **
     42 ** Description      This function update the filter policy of scnner or advertiser.
     43 *******************************************************************************/
     44 void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy)
     45 {
     46     tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
     47     BTM_TRACE_EVENT0 ("btm_update_scanner_filter_policy");
     48     btm_cb.ble_ctr_cb.inq_var.sfp = scan_policy;
     49 
     50     btsnd_hcic_ble_set_scan_params ((UINT8)((p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type),
     51                                     (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
     52                                     (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
     53                                      BLE_ADDR_PUBLIC,
     54                                      scan_policy);
     55 }
     56 /*******************************************************************************
     57 **
     58 ** Function         btm_update_adv_filter_policy
     59 **
     60 ** Description      This function update the filter policy of scnner or advertiser.
     61 *******************************************************************************/
     62 void btm_update_adv_filter_policy(tBTM_BLE_AFP adv_policy)
     63 {
     64     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
     65     BTM_TRACE_EVENT0 ("btm_update_adv_filter_policy");
     66     p_cb->afp = adv_policy;
     67 }
     68 /*******************************************************************************
     69 **
     70 ** Function         btm_update_dev_to_white_list
     71 **
     72 ** Description      This function adds a device into white list.
     73 *******************************************************************************/
     74 BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, tBLE_ADDR_TYPE addr_type)
     75 {
     76     /* look up the sec device record, and find the address */
     77     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
     78     tBTM_SEC_DEV_REC    *p_dev_rec;
     79     BD_ADDR             dummy_bda = {0};
     80     BOOLEAN             started = FALSE, suspend = FALSE;
     81 
     82     if (btm_cb.btm_inq_vars.inq_active)
     83     {
     84         suspend = TRUE;
     85         btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
     86     }
     87 
     88     if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL &&
     89         p_dev_rec->device_type == BT_DEVICE_TYPE_BLE)
     90     {
     91         BTM_TRACE_DEBUG0("btm_update_dev_to_white_list 1");
     92 
     93         if ((to_add && p_cb->num_empty_filter == 0) ||
     94             (!to_add && p_cb->num_empty_filter == p_cb->max_filter_entries))
     95         {
     96             BTM_TRACE_ERROR1("num_entry available in controller: %d", p_cb->num_empty_filter);
     97             return started;
     98         }
     99 
    100 
    101         if ( p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC)
    102         {
    103             if (to_add)
    104                 started = btsnd_hcic_ble_add_white_list (BLE_ADDR_PUBLIC, bd_addr);
    105             else
    106                 started = btsnd_hcic_ble_remove_from_white_list (BLE_ADDR_PUBLIC, bd_addr);
    107         }
    108         else
    109         {
    110             if (BLE_ADDR_IS_STATIC(bd_addr))
    111             {
    112                 if (to_add)
    113                     started = btsnd_hcic_ble_add_white_list (BLE_ADDR_RANDOM, bd_addr);
    114                 else
    115                     started = btsnd_hcic_ble_remove_from_white_list (BLE_ADDR_RANDOM, bd_addr);
    116 
    117             }
    118             if (memcmp(p_dev_rec->ble.reconn_addr, dummy_bda, BD_ADDR_LEN) != 0)
    119             {
    120                 if (to_add)
    121                     started = btsnd_hcic_ble_add_white_list (BLE_ADDR_RANDOM, p_dev_rec->ble.reconn_addr);
    122                 else
    123                     started = btsnd_hcic_ble_remove_from_white_list (BLE_ADDR_RANDOM, p_dev_rec->ble.reconn_addr);
    124             }
    125         }
    126     }
    127     /* if not a known device, shall we add it? */
    128     else
    129     {
    130         if (to_add)
    131             started = btsnd_hcic_ble_add_white_list (addr_type, bd_addr);
    132         else
    133             started = btsnd_hcic_ble_remove_from_white_list (addr_type, bd_addr);
    134     }
    135 
    136     if (suspend)
    137     {
    138         btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE);
    139     }
    140 
    141     return started;
    142 }
    143 /*******************************************************************************
    144 **
    145 ** Function         btm_ble_clear_white_list
    146 **
    147 ** Description      This function clears the white list.
    148 *******************************************************************************/
    149 void btm_ble_clear_white_list (void)
    150 {
    151     BTM_TRACE_EVENT0 ("btm_ble_clear_white_list");
    152     btsnd_hcic_ble_clear_white_list();
    153 }
    154 
    155 /*******************************************************************************
    156 **
    157 ** Function         btm_ble_clear_white_list_complete
    158 **
    159 ** Description      This function clears the white list complete.
    160 *******************************************************************************/
    161 void btm_ble_clear_white_list_complete(UINT8 *p_data, UINT16 evt_len)
    162 {
    163     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    164     UINT8       status;
    165     BTM_TRACE_EVENT0 ("btm_ble_clear_white_list_complete");
    166     STREAM_TO_UINT8  (status, p_data);
    167 
    168     if (status == HCI_SUCCESS)
    169         p_cb->num_empty_filter = p_cb->max_filter_entries;
    170 
    171 }
    172 /*******************************************************************************
    173 **
    174 ** Function         btm_ble_add_2_white_list_complete
    175 **
    176 ** Description      This function read the current white list size.
    177 *******************************************************************************/
    178 void btm_ble_add_2_white_list_complete(UINT8 *p, UINT16 evt_len)
    179 {
    180     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    181     BTM_TRACE_EVENT0 ("btm_ble_add_2_white_list_complete");
    182 
    183     if (*p == HCI_SUCCESS)
    184     {
    185         p_cb->num_empty_filter --;
    186     }
    187 }
    188 /*******************************************************************************
    189 **
    190 ** Function         btm_ble_add_2_white_list_complete
    191 **
    192 ** Description      This function read the current white list size.
    193 *******************************************************************************/
    194 void btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len)
    195 {
    196     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    197     BTM_TRACE_EVENT0 ("btm_ble_remove_from_white_list_complete");
    198     if (*p == HCI_SUCCESS)
    199     {
    200         p_cb->num_empty_filter ++;
    201     }
    202 }
    203 /*******************************************************************************
    204 **
    205 ** Function         btm_ble_find_dev_in_whitelist
    206 **
    207 ** Description      This function check if the device is in the white list
    208 *******************************************************************************/
    209 BOOLEAN btm_ble_find_dev_in_whitelist(BD_ADDR bd_addr)
    210 {
    211     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    212     UINT8 i;
    213 
    214     BTM_TRACE_EVENT0 ("btm_ble_find_dev_in_whitelist");
    215 
    216     /* empty wl */
    217     if (p_cb->num_empty_filter == p_cb->max_filter_entries)
    218     {
    219         BTM_TRACE_DEBUG0("white list empty");
    220         return FALSE;
    221     }
    222 
    223     for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && i < p_cb->max_filter_entries; i ++)
    224     {
    225         if (memcmp(p_cb->bg_conn_dev_list[i], bd_addr, BD_ADDR_LEN) == 0)
    226             return TRUE;
    227     }
    228     return FALSE;
    229 }
    230 /*******************************************************************************
    231 **
    232 ** Function         btm_ble_count_unconn_dev_in_whitelist
    233 **
    234 ** Description      This function check the number of unconnected device in white list.
    235 *******************************************************************************/
    236 UINT8 btm_ble_count_unconn_dev_in_whitelist(void)
    237 {
    238     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    239     UINT8 count = 0, i;
    240     BD_ADDR dummy_bda ={0};
    241 
    242     BTM_TRACE_EVENT0 ("btm_ble_find_dev_in_whitelist");
    243 
    244     for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && i < p_cb->max_filter_entries; i ++)
    245     {
    246         if (memcmp(p_cb->bg_conn_dev_list[i], dummy_bda, BD_ADDR_LEN) != 0 &&
    247             !BTM_IsAclConnectionUp(p_cb->bg_conn_dev_list[i]))
    248         {
    249             count ++;
    250         }
    251     }
    252     return count;
    253 }
    254 /*******************************************************************************
    255 **
    256 ** Function         btm_update_bg_conn_list
    257 **
    258 ** Description      This function update the local background connection device list.
    259 *******************************************************************************/
    260 BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr)
    261 {
    262     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    263     UINT8 i;
    264     BD_ADDR dummy_bda = {0};
    265     BTM_TRACE_EVENT0 ("btm_update_bg_conn_list");
    266     if ((to_add && (p_cb->bg_conn_dev_num == BTM_BLE_MAX_BG_CONN_DEV_NUM || p_cb->num_empty_filter == 0)) ||
    267         (!to_add && p_cb->num_empty_filter == p_cb->max_filter_entries))
    268     {
    269         BTM_TRACE_DEBUG1("num_empty_filter = %d", p_cb->num_empty_filter);
    270         return FALSE;
    271     }
    272 
    273     for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && i < p_cb->max_filter_entries; i ++)
    274     {
    275         /* to add */
    276         if (memcmp(p_cb->bg_conn_dev_list[i], dummy_bda, BD_ADDR_LEN) == 0 && to_add)
    277         {
    278             memcpy(p_cb->bg_conn_dev_list[i], bd_addr, BD_ADDR_LEN);
    279             p_cb->bg_conn_dev_num ++;
    280             return TRUE;
    281         }
    282         /* to remove */
    283         if (!to_add && memcmp(p_cb->bg_conn_dev_list[i], bd_addr, BD_ADDR_LEN) == 0)
    284         {
    285             memset(p_cb->bg_conn_dev_list[i], 0, BD_ADDR_LEN);
    286             p_cb->bg_conn_dev_num --;
    287             return TRUE;
    288         }
    289     }
    290     return FALSE;
    291 }
    292 /*******************************************************************************
    293 **
    294 ** Function         btm_write_bg_conn_wl
    295 **
    296 ** Description      This function write background connection device list into
    297 **                  controller.
    298 *******************************************************************************/
    299 void btm_write_bg_conn_wl(void)
    300 {
    301     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    302     UINT8       i;
    303     BTM_TRACE_EVENT0 ("btm_write_bg_conn_wl");
    304     btm_ble_clear_white_list();
    305 
    306     for (i = 0; i < p_cb->bg_conn_dev_num; i ++)
    307     {
    308         if (!btm_update_dev_to_white_list(TRUE, p_cb->bg_conn_dev_list[i], BLE_ADDR_PUBLIC))
    309             break;
    310     }
    311     return;
    312 }
    313 /*******************************************************************************
    314 **
    315 ** Function         btm_ble_start_auto_conn
    316 **
    317 ** Description      This function is to start/stop auto connection procedure.
    318 **
    319 ** Parameters       start: TRUE to start; FALSE to stop.
    320 **
    321 ** Returns          void
    322 **
    323 *******************************************************************************/
    324 BOOLEAN btm_ble_start_auto_conn(BOOLEAN start)
    325 {
    326     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    327     BD_ADDR dummy_bda = {0};
    328     BOOLEAN exec = TRUE;
    329     UINT16 scan_int, scan_win;
    330 
    331     scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_CONN_EST_SCAN_INT : p_cb->scan_int;
    332     scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_CONN_EST_SCAN_WIND : p_cb->scan_win;
    333 
    334     if (start)
    335     {
    336         if (!l2cb.is_ble_connecting &&
    337             btm_ble_count_unconn_dev_in_whitelist() > 0)
    338         {
    339             if (p_cb->bg_conn_state != BLE_BG_CONN_ACTIVE && p_cb->bg_conn_dev_num > 0)
    340             {
    341                 if (!btsnd_hcic_ble_create_ll_conn (scan_int,  /* UINT16 scan_int      */
    342                                                     scan_win,    /* UINT16 scan_win      */
    343                                                     0x01,                   /* UINT8 white_list     */
    344                                                     BLE_ADDR_PUBLIC,        /* UINT8 addr_type_peer */
    345                                                     dummy_bda,              /* BD_ADDR bda_peer     */
    346                                                     BLE_ADDR_PUBLIC,         /* UINT8 addr_type_own  */
    347                                                     BTM_BLE_CONN_INT_MIN_DEF,   /* UINT16 conn_int_min  */
    348                                                     BTM_BLE_CONN_INT_MAX_DEF,   /* UINT16 conn_int_max  */
    349                                                     BTM_BLE_CONN_SLAVE_LATENCY_DEF,  /* UINT16 conn_latency  */
    350                                                     BTM_BLE_CONN_TIMEOUT_DEF,        /* UINT16 conn_timeout  */
    351                                                     0,                       /* UINT16 min_len       */
    352                                                     0))                      /* UINT16 max_len       */
    353                 {
    354                     /* start auto connection failed */
    355                     exec =  FALSE;
    356                 }
    357                 else
    358                 {
    359                     p_cb->bg_conn_state = BLE_BG_CONN_ACTIVE;
    360                 }
    361             }
    362         }
    363         else
    364             exec = FALSE;
    365     }
    366     else
    367     {
    368         if (p_cb->bg_conn_state == BLE_BG_CONN_ACTIVE)
    369         {
    370             if (!btsnd_hcic_ble_create_conn_cancel())
    371                 exec = FALSE;
    372             else
    373                 p_cb->bg_conn_state = BLE_BG_CONN_IDLE;
    374         }
    375     }
    376     return exec;
    377 }
    378 
    379 /*******************************************************************************
    380 **
    381 ** Function         btm_ble_start_select_conn
    382 **
    383 ** Description      This function is to start/stop selective connection procedure.
    384 **
    385 ** Parameters       start: TRUE to start; FALSE to stop.
    386 **                  p_select_cback: callback function to return application
    387 **                                  selection.
    388 **
    389 ** Returns          BOOLEAN: selective connectino procedure is started.
    390 **
    391 *******************************************************************************/
    392 BOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK   *p_select_cback)
    393 {
    394     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    395     UINT16 scan_int, scan_win;
    396 
    397     BTM_TRACE_EVENT0 ("btm_ble_start_select_conn");
    398 
    399     scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_CONN_EST_SCAN_INT : p_cb->scan_int;
    400     scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_CONN_EST_SCAN_WIND : p_cb->scan_win;
    401 
    402     if (start)
    403     {
    404         if (!btm_cb.btm_inq_vars.inq_active)
    405         {
    406             btm_cb.ble_ctr_cb.p_select_cback = p_select_cback;
    407 
    408             btm_update_scanner_filter_policy(SP_ADV_WL);
    409 
    410             if (!btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_PASS,  /* use passive scan by default */
    411                                                 scan_int, /* scan interval */
    412                                                 scan_win,    /* scan window */
    413                                                 BLE_ADDR_PUBLIC,         /* own device, DUMO always use public */
    414                                                 SP_ADV_WL)              /* process advertising packets only from devices in the White List */
    415                 )
    416                 return FALSE;
    417 
    418             if (p_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE)
    419             {
    420                 BTM_TRACE_ERROR0("peripheral device cannot initiate a selective connection");
    421                 return FALSE;
    422             }
    423             else if (p_cb->bg_conn_dev_num > 0 && btm_ble_count_unconn_dev_in_whitelist() > 0 )
    424             {
    425 
    426                 if (!btsnd_hcic_ble_set_scan_enable(TRUE, TRUE)) /* duplicate filtering enabled */
    427                     return FALSE;
    428 
    429                 /* mark up inquiry status flag */
    430                 btm_cb.btm_inq_vars.inq_active = TRUE;
    431                 btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_SELECT_SCAN;
    432 
    433                 p_cb->bg_conn_state = BLE_BG_CONN_ACTIVE;
    434 
    435             }
    436         }
    437         else
    438         {
    439             BTM_TRACE_ERROR0("scan active, can not start selective connection procedure");
    440             return FALSE;
    441         }
    442     }
    443     else /* disable selective connection mode */
    444     {
    445         p_cb->p_select_cback = NULL;
    446         btm_cb.btm_inq_vars.inq_active = FALSE;
    447         btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE;
    448 
    449         btm_update_scanner_filter_policy(SP_ADV_ALL);
    450 
    451         /* stop scanning */
    452         if (p_cb->bg_conn_dev_num > 0)
    453         {
    454             if (!btsnd_hcic_ble_set_scan_enable(FALSE, TRUE)) /* duplicate filtering enabled */
    455                 return FALSE;
    456         }
    457     }
    458     return TRUE;
    459 }
    460 /*******************************************************************************
    461 **
    462 ** Function         btm_ble_initiate_select_conn
    463 **
    464 ** Description      This function is to start/stop selective connection procedure.
    465 **
    466 ** Parameters       start: TRUE to start; FALSE to stop.
    467 **                  p_select_cback: callback function to return application
    468 **                                  selection.
    469 **
    470 ** Returns          BOOLEAN: selective connectino procedure is started.
    471 **
    472 *******************************************************************************/
    473 void btm_ble_initiate_select_conn(BD_ADDR bda)
    474 {
    475     UINT8   addr_type;
    476     BTM_TRACE_EVENT0 ("btm_ble_initiate_select_conn");
    477     addr_type = btm_ble_map_bda_to_conn_bda(bda);
    478 
    479     /* use direct connection procedure to initiate connection */
    480     if (!L2CA_ConnectFixedChnl(L2CAP_ATT_CID, bda))
    481     {
    482         BTM_TRACE_ERROR0("btm_ble_initiate_select_conn failed");
    483     }
    484 }
    485 /*******************************************************************************
    486 **
    487 ** Function         btm_ble_suspend_bg_sele_conn
    488 **
    489 ** Description      This function is to suspend an active background connection
    490 **                  procedure.
    491 **
    492 ** Parameters       none.
    493 **
    494 ** Returns          none.
    495 **
    496 *******************************************************************************/
    497 void btm_ble_suspend_bg_sele_conn(void)
    498 {
    499     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    500     BTM_TRACE_EVENT0 ("btm_ble_suspend_bg_sele_conn");
    501 
    502     if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE)
    503     {
    504         p_cb->bg_conn_state = BLE_BG_CONN_SUSPEND;
    505         btm_ble_start_select_conn(FALSE, NULL);
    506     }
    507 }
    508 /*******************************************************************************
    509 **
    510 ** Function         btm_ble_suspend_bg_conn
    511 **
    512 ** Description      This function is to suspend an active background connection
    513 **                  procedure.
    514 **
    515 ** Parameters       none.
    516 **
    517 ** Returns          none.
    518 **
    519 *******************************************************************************/
    520 void btm_ble_suspend_bg_conn(void)
    521 {
    522     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    523     BTM_TRACE_EVENT0 ("btm_ble_suspend_bg_conn");
    524 
    525     if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO)
    526     {
    527         if (btm_ble_start_auto_conn(FALSE))
    528             p_cb->bg_conn_state = BLE_BG_CONN_SUSPEND;
    529     }
    530 }
    531 /*******************************************************************************
    532 **
    533 ** Function         btm_ble_scan_param_idle
    534 **
    535 ** Description      This function is to process the scan parameter idle timeout
    536 **                  timeout.
    537 ********************************************************************************/
    538 void btm_ble_scan_param_idle(void)
    539 {
    540     BTM_BleSetConnScanParams(BTM_BLE_CONN_EST_SCAN_INT_LO, BTM_BLE_CONN_EST_SCAN_WIND_LO);
    541 }
    542 /*******************************************************************************
    543 **
    544 ** Function         btm_ble_resume_bg_conn
    545 **
    546 ** Description      This function is to resume a background auto connection
    547 **                  procedure.
    548 **
    549 ** Parameters       none.
    550 **
    551 ** Returns          none.
    552 **
    553 *******************************************************************************/
    554 BOOLEAN btm_ble_resume_bg_conn(tBTM_BLE_SEL_CBACK *p_sele_callback, BOOLEAN def_param)
    555 {
    556     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    557     BOOLEAN ret = FALSE;
    558 
    559     if (p_cb->bg_conn_state != BLE_BG_CONN_ACTIVE )
    560     {
    561         if (def_param)
    562         {
    563             p_cb->scan_int = BTM_BLE_CONN_PARAM_UNDEF;
    564             p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
    565 
    566             /* start scan param idle timer */
    567             btu_start_timer(&p_cb->scan_param_idle_timer,
    568                             BTU_TTYPE_BLE_SCAN_PARAM_IDLE,
    569                             BTM_BLE_SCAN_PARAM_TOUT);
    570         }
    571 
    572         if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO)
    573             ret = btm_ble_start_auto_conn(TRUE);
    574 
    575         if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE)
    576         {
    577             /* terminate selective connection mode if all devices are connected */
    578             if (btm_ble_count_unconn_dev_in_whitelist() == 0)
    579             {
    580                 btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_DISABLE);
    581                 btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE;
    582                 btm_cb.btm_inq_vars.inq_active = FALSE;
    583             }
    584             else if (!btm_cb.btm_inq_vars.inq_active)
    585                 btm_ble_start_select_conn(TRUE, btm_cb.ble_ctr_cb.p_select_cback);
    586         }
    587 
    588         if (ret)
    589             p_cb->bg_conn_state = BLE_BG_CONN_ACTIVE;
    590 
    591     }
    592 
    593     return ret;
    594 }
    595 /*******************************************************************************
    596 **
    597 ** Function         btm_ble_update_bg_state
    598 **
    599 ** Description      This function is to update the bg connection status.
    600 **
    601 ** Parameters       none.
    602 **
    603 ** Returns          none.
    604 **
    605 *******************************************************************************/
    606 void btm_ble_update_bg_state(void)
    607 {
    608     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
    609 
    610     if (!l2cb.is_ble_connecting && (p_cb->bg_conn_state != BLE_BG_CONN_SUSPEND))
    611         p_cb->bg_conn_state = BLE_BG_CONN_IDLE;
    612 
    613 }
    614 
    615 #endif
    616 
    617