Home | History | Annotate | Download | only in btm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2000-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 that handle ACL connections. This includes
     22  *  operations such as hold and sniff modes, supported packet types.
     23  *
     24  ******************************************************************************/
     25 
     26 #include <stdlib.h>
     27 #include <string.h>
     28 #include <stdio.h>
     29 #include <stddef.h>
     30 
     31 #include "bt_types.h"
     32 #include "bt_target.h"
     33 #include "gki.h"
     34 #include "hcimsgs.h"
     35 #include "btu.h"
     36 #include "btm_api.h"
     37 #include "btm_int.h"
     38 #include "l2c_int.h"
     39 #include "hcidefs.h"
     40 
     41 static void btm_establish_continue (tACL_CONN *p_acl_cb);
     42 static void btm_read_remote_features (UINT16 handle);
     43 static void btm_read_remote_ext_features (UINT16 handle, UINT8 page_number);
     44 static void btm_process_remote_ext_features_page (tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec,
     45                                                   UINT8 page_idx);
     46 static void btm_process_remote_ext_features (tACL_CONN *p_acl_cb, UINT8 num_read_pages);
     47 
     48 #define BTM_DEV_REPLY_TIMEOUT   3       /* 3 second timeout waiting for responses */
     49 
     50 /*******************************************************************************
     51 **
     52 ** Function         btm_save_remote_device_role
     53 **
     54 ** Description      This function is to save remote device role
     55 **
     56 ** Returns          void
     57 **
     58 *******************************************************************************/
     59 static void btm_save_remote_device_role(BD_ADDR bd_addr, UINT8 role)
     60 {
     61     UINT8 i, j;
     62     if (role == BTM_ROLE_UNDEFINED) return;
     63 
     64     for (i = 0; i < BTM_ROLE_DEVICE_NUM; i++) {
     65         if ((btm_cb.previous_connected_role[i] != BTM_ROLE_UNDEFINED) &&
     66             (!bdcmp(bd_addr, btm_cb.previous_connected_remote_addr[i]))) {
     67             break;
     68         }
     69     }
     70 
     71     if (i < BTM_ROLE_DEVICE_NUM) {
     72         UINT8 end;
     73         if (i < btm_cb.front) {
     74             for (j = i; j > 0; j--) {
     75                 bdcpy(btm_cb.previous_connected_remote_addr[j],
     76                     btm_cb.previous_connected_remote_addr[j-1]);
     77             }
     78             bdcpy(btm_cb.previous_connected_remote_addr[0],
     79                 btm_cb.previous_connected_remote_addr[BTM_ROLE_DEVICE_NUM-1]);
     80             end = BTM_ROLE_DEVICE_NUM-1;
     81         } else {
     82             end = i;
     83         }
     84 
     85         for (j = end; j > btm_cb.front; j--) {
     86             bdcpy(btm_cb.previous_connected_remote_addr[j],
     87                 btm_cb.previous_connected_remote_addr[j-1]);
     88         }
     89     }
     90 
     91     bdcpy(btm_cb.previous_connected_remote_addr[btm_cb.front], bd_addr);
     92     btm_cb.previous_connected_role[btm_cb.front] = role;
     93     btm_cb.front = (btm_cb.front + 1) % BTM_ROLE_DEVICE_NUM;
     94 }
     95 
     96 /*******************************************************************************
     97 **
     98 ** Function         btm_acl_init
     99 **
    100 ** Description      This function is called at BTM startup to initialize
    101 **
    102 ** Returns          void
    103 **
    104 *******************************************************************************/
    105 void btm_acl_init (void)
    106 {
    107     BTM_TRACE_DEBUG0 ("btm_acl_init");
    108 #if 0  /* cleared in btm_init; put back in if called from anywhere else! */
    109     memset (&btm_cb.acl_db, 0, sizeof (btm_cb.acl_db));
    110 #if RFCOMM_INCLUDED == TRUE
    111     memset (btm_cb.btm_scn, 0, BTM_MAX_SCN);          /* Initialize the SCN usage to FALSE */
    112 #endif
    113     btm_cb.btm_def_link_policy     = 0;
    114 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
    115     btm_cb.p_bl_changed_cb         = NULL;
    116 #else
    117     btm_cb.p_acl_changed_cb        = NULL;
    118 #endif
    119 #endif
    120 
    121     /* Initialize nonzero defaults */
    122     btm_cb.btm_def_link_super_tout = HCI_DEFAULT_INACT_TOUT;
    123     btm_cb.acl_disc_reason         = 0xff ;
    124 }
    125 
    126 /*******************************************************************************
    127 **
    128 ** Function         btm_bda_to_acl
    129 **
    130 ** Description      This function returns the FIRST acl_db entry for the passed BDA.
    131 **
    132 ** Returns          Returns pointer to the ACL DB for the requested BDA if found.
    133 **                  NULL if not found.
    134 **
    135 *******************************************************************************/
    136 tACL_CONN *btm_bda_to_acl (BD_ADDR bda)
    137 {
    138     tACL_CONN   *p = &btm_cb.acl_db[0];
    139     UINT16       xx;
    140     if (bda)
    141     {
    142         for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
    143         {
    144             if ((p->in_use) && (!memcmp (p->remote_addr, bda, BD_ADDR_LEN)))
    145             {
    146                 BTM_TRACE_DEBUG0 ("btm_bda_to_acl found");
    147                 return(p);
    148             }
    149         }
    150     }
    151 
    152     /* If here, no BD Addr found */
    153     return((tACL_CONN *)NULL);
    154 }
    155 
    156 /*******************************************************************************
    157 **
    158 ** Function         btm_handle_to_acl_index
    159 **
    160 ** Description      This function returns the FIRST acl_db entry for the passed hci_handle.
    161 **
    162 ** Returns          index to the acl_db or MAX_L2CAP_LINKS.
    163 **
    164 *******************************************************************************/
    165 UINT8 btm_handle_to_acl_index (UINT16 hci_handle)
    166 {
    167     tACL_CONN   *p = &btm_cb.acl_db[0];
    168     UINT8       xx;
    169     BTM_TRACE_DEBUG0 ("btm_handle_to_acl_index");
    170     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
    171     {
    172         if ((p->in_use) && (p->hci_handle == hci_handle))
    173         {
    174             break;
    175         }
    176     }
    177 
    178     /* If here, no BD Addr found */
    179     return(xx);
    180 }
    181 /*******************************************************************************
    182 **
    183 ** Function         btm_acl_created
    184 **
    185 ** Description      This function is called by L2CAP when an ACL connection
    186 **                  is created.
    187 **
    188 ** Returns          void
    189 **
    190 *******************************************************************************/
    191 void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
    192                       UINT16 hci_handle, UINT8 link_role, UINT8 is_le_link)
    193 {
    194     tBTM_SEC_DEV_REC *p_dev_rec = NULL;
    195     UINT8             yy;
    196     tACL_CONN        *p;
    197     UINT8             xx;
    198 
    199     BTM_TRACE_DEBUG3 ("btm_acl_created hci_handle=%d link_role=%d  is_le_link=%d",
    200                       hci_handle,link_role, is_le_link);
    201     /* Ensure we don't have duplicates */
    202     p = btm_bda_to_acl(bda);
    203     if (p != (tACL_CONN *)NULL)
    204     {
    205         p->hci_handle = hci_handle;
    206         p->link_role  = link_role;
    207         btm_save_remote_device_role(bda, link_role);
    208 #if BLE_INCLUDED == TRUE
    209         p->is_le_link = is_le_link;
    210 #endif
    211         BTM_TRACE_DEBUG6 ("Duplicate btm_acl_created: RemBdAddr: %02x%02x%02x%02x%02x%02x",
    212                           bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
    213         BTM_SetLinkPolicy(p->remote_addr, &btm_cb.btm_def_link_policy);
    214         return;
    215     }
    216 
    217     /* Allocate acl_db entry */
    218     for (xx = 0, p = &btm_cb.acl_db[0]; xx < MAX_L2CAP_LINKS; xx++, p++)
    219     {
    220         if (!p->in_use)
    221         {
    222             p->in_use            = TRUE;
    223             p->hci_handle        = hci_handle;
    224             p->link_role         = link_role;
    225             btm_save_remote_device_role(bda, link_role);
    226             p->link_up_issued    = FALSE;
    227 
    228 #if BLE_INCLUDED == TRUE
    229             p->is_le_link        = is_le_link;
    230 
    231             if (is_le_link)
    232             {
    233                 p->conn_addr_type = BLE_ADDR_PUBLIC;
    234                 BTM_GetLocalDeviceAddr(p->conn_addr);
    235             }
    236 
    237 #endif
    238             p->restore_pkt_types = 0;   /* Only exists while SCO is active */
    239             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
    240 
    241 #if BTM_PWR_MGR_INCLUDED == FALSE
    242             p->mode             = BTM_ACL_MODE_NORMAL;
    243 #else
    244             btm_pm_sm_alloc(xx);
    245 #endif /* BTM_PWR_MGR_INCLUDED == FALSE */
    246 
    247             memcpy (p->remote_addr, bda, BD_ADDR_LEN);
    248 
    249             if (dc)
    250                 memcpy (p->remote_dc, dc, DEV_CLASS_LEN);
    251 
    252             if (bdn)
    253                 memcpy (p->remote_name, bdn, BTM_MAX_REM_BD_NAME_LEN);
    254 
    255             /* if BR/EDR do something more */
    256             if (!is_le_link)
    257             {
    258                 btsnd_hcic_read_rmt_clk_offset (p->hci_handle);
    259                 btsnd_hcic_rmt_ver_req (p->hci_handle);
    260             }
    261             p_dev_rec = btm_find_dev_by_handle (hci_handle);
    262 
    263 #if (BLE_INCLUDED == TRUE)
    264             if (p_dev_rec )
    265             {
    266                 BTM_TRACE_DEBUG1 ("device_type=0x%x", p_dev_rec->device_type);
    267             }
    268 #endif
    269 
    270             if (p_dev_rec && !is_le_link)
    271             {
    272                 /* If remote features already known, copy them and continue connection setup */
    273                 if ((p_dev_rec->num_read_pages) &&
    274                     (p_dev_rec->num_read_pages <= (HCI_EXT_FEATURES_PAGE_MAX + 1)) /* sanity check */)
    275                 {
    276                     memcpy (p->peer_lmp_features, p_dev_rec->features,
    277                         (HCI_FEATURE_BYTES_PER_PAGE * p_dev_rec->num_read_pages));
    278                     p->num_read_pages = p_dev_rec->num_read_pages;
    279 
    280                     if (BTM_SEC_MODE_SP == btm_cb.security_mode
    281                         && HCI_SSP_HOST_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_1])
    282                         && HCI_SIMPLE_PAIRING_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0]))
    283                     {
    284                         p_dev_rec->sm4 = BTM_SM4_TRUE;
    285                     }
    286                     else
    287                     {
    288                         p_dev_rec->sm4 |= BTM_SM4_KNOWN;
    289                     }
    290 
    291                     btm_establish_continue (p);
    292                     return;
    293                 }
    294             }
    295 
    296 #if (BLE_INCLUDED == TRUE)
    297             /* If here, features are not known yet */
    298             if (p_dev_rec && is_le_link)
    299             {
    300                 btm_establish_continue(p);
    301 
    302 #if (!defined(BTA_SKIP_BLE_READ_REMOTE_FEAT) || BTA_SKIP_BLE_READ_REMOTE_FEAT == FALSE)
    303                 if (link_role == HCI_ROLE_MASTER)
    304                 {
    305                     btsnd_hcic_ble_read_remote_feat(p->hci_handle);
    306                 }
    307 #endif
    308             }
    309             else
    310 #endif
    311             {
    312                 btm_read_remote_features (p->hci_handle);
    313             }
    314 
    315             /* read page 1 - on rmt feature event for buffer reasons */
    316             return;
    317         }
    318     }
    319 }
    320 
    321 
    322 /*******************************************************************************
    323 **
    324 ** Function         btm_acl_report_role_change
    325 **
    326 ** Description      This function is called when the local device is deemed
    327 **                  to be down. It notifies L2CAP of the failure.
    328 **
    329 ** Returns          void
    330 **
    331 *******************************************************************************/
    332 void btm_acl_report_role_change (UINT8 hci_status, BD_ADDR bda)
    333 {
    334     tBTM_ROLE_SWITCH_CMPL   ref_data;
    335     BTM_TRACE_DEBUG0 ("btm_acl_report_role_change");
    336     if (btm_cb.devcb.p_switch_role_cb
    337         && (bda && (0 == memcmp(btm_cb.devcb.switch_role_ref_data.remote_bd_addr, bda, BD_ADDR_LEN))))
    338     {
    339         memcpy (&ref_data, &btm_cb.devcb.switch_role_ref_data, sizeof(tBTM_ROLE_SWITCH_CMPL));
    340         ref_data.hci_status = hci_status;
    341         (*btm_cb.devcb.p_switch_role_cb)(&ref_data);
    342         memset (&btm_cb.devcb.switch_role_ref_data, 0, sizeof(tBTM_ROLE_SWITCH_CMPL));
    343         btm_cb.devcb.p_switch_role_cb = NULL;
    344     }
    345 }
    346 
    347 /*******************************************************************************
    348 **
    349 ** Function         btm_acl_removed
    350 **
    351 ** Description      This function is called by L2CAP when an ACL connection
    352 **                  is removed. Since only L2CAP creates ACL links, we use
    353 **                  the L2CAP link index as our index into the control blocks.
    354 **
    355 ** Returns          void
    356 **
    357 *******************************************************************************/
    358 void btm_acl_removed (BD_ADDR bda)
    359 {
    360     tACL_CONN   *p;
    361 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
    362     tBTM_BL_EVENT_DATA  evt_data;
    363 #endif
    364 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
    365     tBTM_SEC_DEV_REC *p_dev_rec=NULL;
    366 #endif
    367 
    368     BTM_TRACE_DEBUG0 ("btm_acl_removed");
    369     p = btm_bda_to_acl(bda);
    370     if (p != (tACL_CONN *)NULL)
    371     {
    372         p->in_use = FALSE;
    373 
    374         /* if the disconnected channel has a pending role switch, clear it now */
    375         btm_acl_report_role_change(HCI_ERR_NO_CONNECTION, bda);
    376 
    377         /* Only notify if link up has had a chance to be issued */
    378         if (p->link_up_issued)
    379         {
    380             p->link_up_issued = FALSE;
    381 
    382             /* If anyone cares, tell him database changed */
    383 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
    384             if (btm_cb.p_bl_changed_cb)
    385             {
    386                 evt_data.event = BTM_BL_DISCN_EVT;
    387                 evt_data.discn.p_bda = bda;
    388 
    389                 (*btm_cb.p_bl_changed_cb)(&evt_data);
    390             }
    391 
    392             btm_acl_update_busy_level (BTM_BLI_ACL_DOWN_EVT);
    393 #else
    394             if (btm_cb.p_acl_changed_cb)
    395                 (*btm_cb.p_acl_changed_cb) (bda, NULL, NULL, NULL, FALSE);
    396 #endif
    397         }
    398 
    399 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
    400 
    401         BTM_TRACE_DEBUG4 ("acl hci_handle=%d is_le_link=%d connectable_mode=0x%0x link_role=%d",
    402                           p->hci_handle,
    403                           p->is_le_link,
    404                           btm_cb.ble_ctr_cb.inq_var.connectable_mode,
    405                           p->link_role);
    406 
    407         p_dev_rec = btm_find_dev(bda);
    408         if ( p_dev_rec)
    409         {
    410             BTM_TRACE_DEBUG1("before update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
    411             if (p->is_le_link)
    412             {
    413                 BTM_TRACE_DEBUG0("LE link down");
    414                 p_dev_rec->sec_flags &= ~(BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
    415                 if ( (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) == 0)
    416                 {
    417                     BTM_TRACE_DEBUG0("Not Bonded");
    418                     p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHENTICATED | BTM_SEC_LINK_KEY_AUTHED);
    419                 }
    420                 else
    421                 {
    422                     BTM_TRACE_DEBUG0("Bonded");
    423                 }
    424             }
    425             else
    426             {
    427                 BTM_TRACE_DEBUG0("Bletooth link down");
    428                 p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED
    429                                         | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
    430             }
    431             BTM_TRACE_DEBUG1("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
    432         }
    433         else
    434         {
    435             BTM_TRACE_ERROR0("Device not found");
    436 
    437         }
    438 #endif
    439 
    440         return;
    441     }
    442 }
    443 
    444 
    445 /*******************************************************************************
    446 **
    447 ** Function         btm_acl_device_down
    448 **
    449 ** Description      This function is called when the local device is deemed
    450 **                  to be down. It notifies L2CAP of the failure.
    451 **
    452 ** Returns          void
    453 **
    454 *******************************************************************************/
    455 void btm_acl_device_down (void)
    456 {
    457     tACL_CONN   *p = &btm_cb.acl_db[0];
    458     UINT16      xx;
    459     BTM_TRACE_DEBUG0 ("btm_acl_device_down");
    460     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
    461     {
    462         if (p->in_use)
    463         {
    464             BTM_TRACE_DEBUG1 ("hci_handle=%d HCI_ERR_HW_FAILURE ",p->hci_handle );
    465             l2c_link_hci_disc_comp (p->hci_handle, HCI_ERR_HW_FAILURE);
    466         }
    467     }
    468 }
    469 
    470 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
    471 /*******************************************************************************
    472 **
    473 ** Function         btm_acl_update_busy_level
    474 **
    475 ** Description      This function is called to update the busy level of the system
    476 **                  .
    477 **
    478 ** Returns          void
    479 **
    480 *******************************************************************************/
    481 void btm_acl_update_busy_level (tBTM_BLI_EVENT event)
    482 {
    483     tBTM_BL_UPDATE_DATA  evt;
    484     UINT8 busy_level;
    485     BTM_TRACE_DEBUG0 ("btm_acl_update_busy_level");
    486     switch (event)
    487     {
    488         case BTM_BLI_ACL_UP_EVT:
    489             BTM_TRACE_DEBUG0 ("BTM_BLI_ACL_UP_EVT");
    490             btm_cb.num_acl++;
    491             break;
    492         case BTM_BLI_ACL_DOWN_EVT:
    493             if (btm_cb.num_acl)
    494             {
    495                 btm_cb.num_acl--;
    496                 BTM_TRACE_DEBUG1 ("BTM_BLI_ACL_DOWN_EVT", btm_cb.num_acl);
    497             }
    498             else
    499             {
    500                 BTM_TRACE_ERROR0 ("BTM_BLI_ACL_DOWN_EVT issued, but num_acl already zero !!!");
    501             }
    502             break;
    503         case BTM_BLI_PAGE_EVT:
    504             BTM_TRACE_DEBUG0 ("BTM_BLI_PAGE_EVT");
    505             btm_cb.is_paging = TRUE;
    506             evt.busy_level_flags= BTM_BL_PAGING_STARTED;
    507             break;
    508         case BTM_BLI_PAGE_DONE_EVT:
    509             BTM_TRACE_DEBUG0 ("BTM_BLI_PAGE_DONE_EVT");
    510             btm_cb.is_paging = FALSE;
    511             evt.busy_level_flags = BTM_BL_PAGING_COMPLETE;
    512             break;
    513         case BTM_BLI_INQ_EVT:
    514             BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_EVT");
    515             btm_cb.is_inquiry = TRUE;
    516             evt.busy_level_flags = BTM_BL_INQUIRY_STARTED;
    517             break;
    518         case BTM_BLI_INQ_CANCEL_EVT:
    519             BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_CANCEL_EVT");
    520             btm_cb.is_inquiry = FALSE;
    521             evt.busy_level_flags = BTM_BL_INQUIRY_CANCELLED;
    522             break;
    523         case BTM_BLI_INQ_DONE_EVT:
    524             BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_DONE_EVT");
    525             btm_cb.is_inquiry = FALSE;
    526             evt.busy_level_flags = BTM_BL_INQUIRY_COMPLETE;
    527             break;
    528     }
    529 
    530     if (btm_cb.is_paging || btm_cb.is_inquiry)
    531         busy_level = 10;
    532     else
    533         busy_level = (UINT8)btm_cb.num_acl;
    534 
    535     if (busy_level != btm_cb.busy_level)
    536     {
    537         evt.event         = BTM_BL_UPDATE_EVT;
    538         evt.busy_level    = busy_level;
    539         btm_cb.busy_level = busy_level;
    540         if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_UPDATE_MASK))
    541         {
    542             (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
    543         }
    544     }
    545 }
    546 #endif
    547 
    548 
    549 /*******************************************************************************
    550 **
    551 ** Function         BTM_GetRole
    552 **
    553 ** Description      This function is called to get the role of the local device
    554 **                  for the ACL connection with the specified remote device
    555 **
    556 ** Returns          BTM_SUCCESS if connection exists.
    557 **                  BTM_UNKNOWN_ADDR if no active link with bd addr specified
    558 **
    559 *******************************************************************************/
    560 tBTM_STATUS BTM_GetRole (BD_ADDR remote_bd_addr, UINT8 *p_role)
    561 {
    562     tACL_CONN   *p;
    563     BTM_TRACE_DEBUG0 ("BTM_GetRole");
    564     if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
    565     {
    566         *p_role = BTM_ROLE_UNDEFINED;
    567         return(BTM_UNKNOWN_ADDR);
    568     }
    569 
    570     /* Get the current role */
    571     *p_role = p->link_role;
    572     return(BTM_SUCCESS);
    573 }
    574 
    575 
    576 /*******************************************************************************
    577 **
    578 ** Function         BTM_SwitchRole
    579 **
    580 ** Description      This function is called to switch role between master and
    581 **                  slave.  If role is already set it will do nothing.  If the
    582 **                  command was initiated, the callback function is called upon
    583 **                  completion.
    584 **
    585 ** Returns          BTM_SUCCESS if already in specified role.
    586 **                  BTM_CMD_STARTED if command issued to controller.
    587 **                  BTM_NO_RESOURCES if couldn't allocate memory to issue command
    588 **                  BTM_UNKNOWN_ADDR if no active link with bd addr specified
    589 **                  BTM_MODE_UNSUPPORTED if local device does not support role switching
    590 **                  BTM_BUSY if the previous command is not completed
    591 **
    592 *******************************************************************************/
    593 tBTM_STATUS BTM_SwitchRole (BD_ADDR remote_bd_addr, UINT8 new_role, tBTM_CMPL_CB *p_cb)
    594 {
    595     tACL_CONN   *p;
    596     tBTM_SEC_DEV_REC  *p_dev_rec = NULL;
    597 #if BTM_SCO_INCLUDED == TRUE
    598     BOOLEAN    is_sco_active;
    599 #endif
    600 #if BTM_PWR_MGR_INCLUDED == TRUE
    601     tBTM_STATUS  status;
    602     tBTM_PM_MODE pwr_mode;
    603     tBTM_PM_PWR_MD settings;
    604 #endif
    605 #if (BT_USE_TRACES == TRUE)
    606     BD_ADDR_PTR  p_bda;
    607 #endif
    608     BTM_TRACE_API6 ("BTM_SwitchRole BDA: %02x-%02x-%02x-%02x-%02x-%02x",
    609                     remote_bd_addr[0], remote_bd_addr[1], remote_bd_addr[2],
    610                     remote_bd_addr[3], remote_bd_addr[4], remote_bd_addr[5]);
    611 
    612     /* Make sure the local device supports switching */
    613     if (!(HCI_SWITCH_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])))
    614         return(BTM_MODE_UNSUPPORTED);
    615 
    616     if (btm_cb.devcb.p_switch_role_cb && p_cb)
    617     {
    618 #if (BT_USE_TRACES == TRUE)
    619         p_bda = btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
    620         BTM_TRACE_DEBUG6 ("Role switch on other device is in progress 0x%02x%02x%02x%02x%02x%02x",
    621                           p_bda[0], p_bda[1], p_bda[2],
    622                           p_bda[3], p_bda[4], p_bda[5]);
    623 #endif
    624         return(BTM_BUSY);
    625     }
    626 
    627     if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
    628         return(BTM_UNKNOWN_ADDR);
    629 
    630     /* Finished if already in desired role */
    631     if (p->link_role == new_role)
    632         return(BTM_SUCCESS);
    633 
    634 #if BTM_SCO_INCLUDED == TRUE
    635     /* Check if there is any SCO Active on this BD Address */
    636     is_sco_active = btm_is_sco_active_by_bdaddr(remote_bd_addr);
    637 
    638     if (is_sco_active == TRUE)
    639         return(BTM_NO_RESOURCES);
    640 #endif
    641 
    642     /* Ignore role switch request if the previous request was not completed */
    643     if (p->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE)
    644     {
    645         BTM_TRACE_DEBUG1 ("BTM_SwitchRole busy: %d",
    646                           p->switch_role_state);
    647         return(BTM_BUSY);
    648     }
    649 
    650     /* Cannot switch role while parked or sniffing */
    651 #if BTM_PWR_MGR_INCLUDED == FALSE
    652     if (p->mode == HCI_MODE_PARK)
    653     {
    654         if (!btsnd_hcic_exit_park_mode (p->hci_handle))
    655             return(BTM_NO_RESOURCES);
    656 
    657         p->switch_role_state = BTM_ACL_SWKEY_STATE_MODE_CHANGE;
    658     }
    659     else if (p->mode == HCI_MODE_SNIFF)
    660     {
    661         if (!btsnd_hcic_exit_sniff_mode (p->hci_handle))
    662             return(BTM_NO_RESOURCES);
    663 
    664         p->switch_role_state = BTM_ACL_SWKEY_STATE_MODE_CHANGE;
    665     }
    666 #else   /* power manager is in use */
    667 
    668     if ((status = BTM_ReadPowerMode(p->remote_addr, &pwr_mode)) != BTM_SUCCESS)
    669         return(status);
    670 
    671     /* Wake up the link if in sniff or park before attempting switch */
    672     if (pwr_mode == BTM_PM_MD_PARK || pwr_mode == BTM_PM_MD_SNIFF)
    673     {
    674         memset( (void*)&settings, 0, sizeof(settings));
    675         settings.mode = BTM_PM_MD_ACTIVE;
    676         status = BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p->remote_addr, &settings);
    677         if (status != BTM_CMD_STARTED)
    678             return(BTM_WRONG_MODE);
    679 
    680         p->switch_role_state = BTM_ACL_SWKEY_STATE_MODE_CHANGE;
    681     }
    682 #endif
    683     /* some devices do not support switch while encryption is on */
    684     else
    685     {
    686         p_dev_rec = btm_find_dev (remote_bd_addr);
    687         if ((p_dev_rec != NULL)
    688             && ((p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) != 0)
    689             && !BTM_EPR_AVAILABLE(p))
    690         {
    691             /* bypass turning off encryption if change link key is already doing it */
    692             if (p->encrypt_state != BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF)
    693             {
    694                 if (!btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE))
    695                     return(BTM_NO_RESOURCES);
    696                 else
    697                     p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF;
    698             }
    699 
    700             p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF;
    701         }
    702         else
    703         {
    704             if (!btsnd_hcic_switch_role (remote_bd_addr, new_role))
    705                 return(BTM_NO_RESOURCES);
    706 
    707             p->switch_role_state = BTM_ACL_SWKEY_STATE_IN_PROGRESS;
    708 
    709 #if BTM_DISC_DURING_RS == TRUE
    710             if (p_dev_rec)
    711                 p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING;
    712 #endif
    713         }
    714     }
    715 
    716     /* Initialize return structure in case request fails */
    717     if (p_cb)
    718     {
    719         memcpy (btm_cb.devcb.switch_role_ref_data.remote_bd_addr, remote_bd_addr,
    720                 BD_ADDR_LEN);
    721         btm_cb.devcb.switch_role_ref_data.role = new_role;
    722         /* initialized to an error code */
    723         btm_cb.devcb.switch_role_ref_data.hci_status = HCI_ERR_UNSUPPORTED_VALUE;
    724         btm_cb.devcb.p_switch_role_cb = p_cb;
    725     }
    726     return(BTM_CMD_STARTED);
    727 }
    728 
    729 /*******************************************************************************
    730 **
    731 ** Function         BTM_ChangeLinkKey
    732 **
    733 ** Description      This function is called to change the link key of the
    734 **                  connection.
    735 **
    736 ** Returns          BTM_CMD_STARTED if command issued to controller.
    737 **                  BTM_NO_RESOURCES if couldn't allocate memory to issue command
    738 **                  BTM_UNKNOWN_ADDR if no active link with bd addr specified
    739 **                  BTM_BUSY if the previous command is not completed
    740 **
    741 *******************************************************************************/
    742 tBTM_STATUS BTM_ChangeLinkKey (BD_ADDR remote_bd_addr, tBTM_CMPL_CB *p_cb)
    743 {
    744     tACL_CONN   *p;
    745     tBTM_SEC_DEV_REC  *p_dev_rec = NULL;
    746 #if BTM_PWR_MGR_INCLUDED == TRUE
    747     tBTM_STATUS  status;
    748     tBTM_PM_MODE pwr_mode;
    749     tBTM_PM_PWR_MD settings;
    750 #endif
    751     BTM_TRACE_DEBUG0 ("BTM_ChangeLinkKey");
    752     if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
    753         return(BTM_UNKNOWN_ADDR);
    754 
    755     /* Ignore change link key request if the previsous request has not completed */
    756     if (p->change_key_state != BTM_ACL_SWKEY_STATE_IDLE)
    757     {
    758         BTM_TRACE_DEBUG0 ("Link key change request declined since the previous request"
    759                           " for this device has not completed ");
    760         return(BTM_BUSY);
    761     }
    762 
    763     memset (&btm_cb.devcb.chg_link_key_ref_data, 0, sizeof(tBTM_CHANGE_KEY_CMPL));
    764 
    765     /* Cannot change key while parked */
    766 #if BTM_PWR_MGR_INCLUDED == FALSE
    767     if (p->mode == HCI_MODE_PARK)
    768     {
    769         if (!btsnd_hcic_exit_park_mode (p->hci_handle))
    770             return(BTM_NO_RESOURCES);
    771 
    772         p->change_key_state = BTM_ACL_SWKEY_STATE_MODE_CHANGE;
    773     }
    774 #else   /* power manager is in use */
    775 
    776 
    777     if ((status = BTM_ReadPowerMode(p->remote_addr, &pwr_mode)) != BTM_SUCCESS)
    778         return(status);
    779 
    780     /* Wake up the link if in park before attempting to change link keys */
    781     if (pwr_mode == BTM_PM_MD_PARK)
    782     {
    783         memset( (void*)&settings, 0, sizeof(settings));
    784         settings.mode = BTM_PM_MD_ACTIVE;
    785         status = BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p->remote_addr, &settings);
    786         if (status != BTM_CMD_STARTED)
    787             return(BTM_WRONG_MODE);
    788 
    789         p->change_key_state = BTM_ACL_SWKEY_STATE_MODE_CHANGE;
    790     }
    791 #endif
    792     /* some devices do not support change of link key while encryption is on */
    793     else if (((p_dev_rec = btm_find_dev (remote_bd_addr)) != NULL)
    794              && ((p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) != 0) && !BTM_EPR_AVAILABLE(p))
    795     {
    796         /* bypass turning off encryption if switch role is already doing it */
    797         if (p->encrypt_state != BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF)
    798         {
    799             if (!btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE))
    800                 return(BTM_NO_RESOURCES);
    801             else
    802                 p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF;
    803         }
    804 
    805         p->change_key_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF;
    806     }
    807     else    /* Ok to initiate change of link key */
    808     {
    809         if (!btsnd_hcic_change_link_key (p->hci_handle))
    810             return(BTM_NO_RESOURCES);
    811 
    812         p->change_key_state = BTM_ACL_SWKEY_STATE_IN_PROGRESS;
    813     }
    814 
    815     /* Initialize return structure in case request fails */
    816     memcpy (btm_cb.devcb.chg_link_key_ref_data.remote_bd_addr, remote_bd_addr,
    817             BD_ADDR_LEN);
    818     btm_cb.devcb.p_chg_link_key_cb = p_cb;
    819     return(BTM_CMD_STARTED);
    820 }
    821 
    822 /*******************************************************************************
    823 **
    824 ** Function         btm_acl_link_key_change
    825 **
    826 ** Description      This function is called to when a change link key event
    827 **                  is received.
    828 **
    829 *******************************************************************************/
    830 void btm_acl_link_key_change (UINT16 handle, UINT8 status)
    831 {
    832     tBTM_CHANGE_KEY_CMPL *p_data;
    833     tACL_CONN            *p;
    834     UINT8                xx;
    835     BTM_TRACE_DEBUG0 ("btm_acl_link_key_change");
    836     /* Look up the connection by handle and set the current mode */
    837     xx = btm_handle_to_acl_index(handle);
    838 
    839     /* don't assume that we can never get a bad hci_handle */
    840     if (xx >= MAX_L2CAP_LINKS)
    841         return;
    842 
    843     p_data = &btm_cb.devcb.chg_link_key_ref_data;
    844     p = &btm_cb.acl_db[xx];
    845     p_data->hci_status = status;
    846 
    847     /* if switching state is switching we need to turn encryption on */
    848     /* if idle, we did not change encryption */
    849     if (p->change_key_state == BTM_ACL_SWKEY_STATE_SWITCHING)
    850     {
    851         /* Make sure there's not also a role switch going on before re-enabling */
    852         if (p->switch_role_state != BTM_ACL_SWKEY_STATE_SWITCHING)
    853         {
    854             if (btsnd_hcic_set_conn_encrypt (p->hci_handle, TRUE))
    855             {
    856                 p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_ON;
    857                 p->change_key_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_ON;
    858                 return;
    859             }
    860         }
    861         else    /* Set the state and wait for change link key */
    862         {
    863             p->change_key_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_ON;
    864             return;
    865         }
    866     }
    867 
    868     /* Set the switch_role_state to IDLE since the reply received from HCI */
    869     /* regardless of its result either success or failed. */
    870     if (p->change_key_state == BTM_ACL_SWKEY_STATE_IN_PROGRESS)
    871     {
    872         p->change_key_state = BTM_ACL_SWKEY_STATE_IDLE;
    873         p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
    874     }
    875 
    876     if (btm_cb.devcb.p_chg_link_key_cb)
    877     {
    878         (*btm_cb.devcb.p_chg_link_key_cb)((void *)p_data);
    879         btm_cb.devcb.p_chg_link_key_cb = NULL;
    880     }
    881 
    882     BTM_TRACE_ERROR2("Change Link Key Complete Event: Handle 0x%02x, HCI Status 0x%02x",
    883                      handle, p_data->hci_status);
    884 }
    885 
    886 /*******************************************************************************
    887 **
    888 ** Function         btm_acl_encrypt_change
    889 **
    890 ** Description      This function is when encryption of the connection is
    891 **                  completed by the LM.  Checks to see if a role switch or
    892 **                  change of link key was active and initiates or continues
    893 **                  process if needed.
    894 **
    895 ** Returns          void
    896 **
    897 *******************************************************************************/
    898 void btm_acl_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable)
    899 {
    900     tACL_CONN *p;
    901     UINT8     xx;
    902     tBTM_SEC_DEV_REC  *p_dev_rec;
    903 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
    904     tBTM_BL_ROLE_CHG_DATA   evt;
    905 #endif
    906 
    907     BTM_TRACE_DEBUG3 ("btm_acl_encrypt_change handle=%d status=%d encr_enabl=%d",
    908                       handle, status, encr_enable);
    909     xx = btm_handle_to_acl_index(handle);
    910     /* don't assume that we can never get a bad hci_handle */
    911     if (xx < MAX_L2CAP_LINKS)
    912         p = &btm_cb.acl_db[xx];
    913     else
    914         return;
    915 
    916     /* Process Role Switch if active */
    917     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF)
    918     {
    919         /* if encryption turn off failed we still will try to switch role */
    920         if (encr_enable)
    921         {
    922             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
    923             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
    924         }
    925         else
    926         {
    927             p->switch_role_state = BTM_ACL_SWKEY_STATE_SWITCHING;
    928             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_TEMP_FUNC;
    929         }
    930 
    931         if (!btsnd_hcic_switch_role (p->remote_addr, (UINT8)!p->link_role))
    932         {
    933             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
    934             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
    935             btm_acl_report_role_change(btm_cb.devcb.switch_role_ref_data.hci_status, p->remote_addr);
    936         }
    937 #if BTM_DISC_DURING_RS == TRUE
    938         else
    939         {
    940             if ((p_dev_rec = btm_find_dev (p->remote_addr)) != NULL)
    941                 p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING;
    942         }
    943 #endif
    944 
    945     }
    946     /* Finished enabling Encryption after role switch */
    947     else if (p->switch_role_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_ON)
    948     {
    949         p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
    950         p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
    951         btm_acl_report_role_change(btm_cb.devcb.switch_role_ref_data.hci_status, p->remote_addr);
    952 
    953 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
    954         /* if role change event is registered, report it now */
    955         if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK))
    956         {
    957             evt.event       = BTM_BL_ROLE_CHG_EVT;
    958             evt.new_role    = btm_cb.devcb.switch_role_ref_data.role;
    959             evt.p_bda       = btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
    960             evt.hci_status  = btm_cb.devcb.switch_role_ref_data.hci_status;
    961             (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
    962 
    963             BTM_TRACE_DEBUG3("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
    964                              evt.new_role, evt.hci_status, p->switch_role_state);
    965         }
    966 #endif
    967 
    968 #if BTM_DISC_DURING_RS == TRUE
    969         /* If a disconnect is pending, issue it now that role switch has completed */
    970         if ((p_dev_rec = btm_find_dev (p->remote_addr)) != NULL)
    971         {
    972             if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING)
    973             {
    974                 BTM_TRACE_WARNING0("btm_acl_encrypt_change -> Issuing delayed HCI_Disconnect!!!");
    975                 btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER);
    976             }
    977             BTM_TRACE_ERROR2("btm_acl_encrypt_change: tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
    978                 (UINT32)p_dev_rec, p_dev_rec->rs_disc_pending);
    979             p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
    980         }
    981 #endif
    982     }
    983 
    984 
    985     /* Process Change Link Key if active */
    986     if (p->change_key_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF)
    987     {
    988         /* if encryption turn off failed we still will try to change link key */
    989         if (encr_enable)
    990         {
    991             p->change_key_state = BTM_ACL_SWKEY_STATE_IDLE;
    992             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
    993         }
    994         else
    995         {
    996             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_TEMP_FUNC;
    997             p->change_key_state = BTM_ACL_SWKEY_STATE_SWITCHING;
    998         }
    999 
   1000         if (!btsnd_hcic_change_link_key (p->hci_handle))
   1001         {
   1002             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
   1003             p->change_key_state = BTM_ACL_SWKEY_STATE_IDLE;
   1004             if (btm_cb.devcb.p_chg_link_key_cb)
   1005             {
   1006                 (*btm_cb.devcb.p_chg_link_key_cb)(&btm_cb.devcb.chg_link_key_ref_data);
   1007                 btm_cb.devcb.p_chg_link_key_cb = NULL;
   1008             }
   1009         }
   1010     }
   1011     /* Finished enabling Encryption after changing link key */
   1012     else if (p->change_key_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_ON)
   1013     {
   1014         p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
   1015         p->change_key_state = BTM_ACL_SWKEY_STATE_IDLE;
   1016         if (btm_cb.devcb.p_chg_link_key_cb)
   1017         {
   1018             (*btm_cb.devcb.p_chg_link_key_cb)(&btm_cb.devcb.chg_link_key_ref_data);
   1019             btm_cb.devcb.p_chg_link_key_cb = NULL;
   1020         }
   1021     }
   1022 }
   1023 /*******************************************************************************
   1024 **
   1025 ** Function         BTM_SetLinkPolicy
   1026 **
   1027 ** Description      Create and send HCI "Write Policy Set" command
   1028 **
   1029 ** Returns          status of the operation
   1030 **
   1031 *******************************************************************************/
   1032 tBTM_STATUS BTM_SetLinkPolicy (BD_ADDR remote_bda, UINT16 *settings)
   1033 {
   1034     tACL_CONN   *p;
   1035     UINT8       *localFeatures = BTM_ReadLocalFeatures();
   1036     BTM_TRACE_DEBUG0 ("BTM_SetLinkPolicy");
   1037 /*    BTM_TRACE_API1 ("BTM_SetLinkPolicy: requested settings: 0x%04x", *settings ); */
   1038 
   1039     /* First, check if hold mode is supported */
   1040     if (*settings != HCI_DISABLE_ALL_LM_MODES)
   1041     {
   1042         if ( (*settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)) )
   1043         {
   1044             *settings &= (~HCI_ENABLE_MASTER_SLAVE_SWITCH);
   1045             BTM_TRACE_API1 ("BTM_SetLinkPolicy switch not supported (settings: 0x%04x)", *settings );
   1046         }
   1047         if ( (*settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)) )
   1048         {
   1049             *settings &= (~HCI_ENABLE_HOLD_MODE);
   1050             BTM_TRACE_API1 ("BTM_SetLinkPolicy hold not supported (settings: 0x%04x)", *settings );
   1051         }
   1052         if ( (*settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)) )
   1053         {
   1054             *settings &= (~HCI_ENABLE_SNIFF_MODE);
   1055             BTM_TRACE_API1 ("BTM_SetLinkPolicy sniff not supported (settings: 0x%04x)", *settings );
   1056         }
   1057         if ( (*settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)) )
   1058         {
   1059             *settings &= (~HCI_ENABLE_PARK_MODE);
   1060             BTM_TRACE_API1 ("BTM_SetLinkPolicy park not supported (settings: 0x%04x)", *settings );
   1061         }
   1062     }
   1063 
   1064     if ((p = btm_bda_to_acl(remote_bda)) != NULL)
   1065         return(btsnd_hcic_write_policy_set (p->hci_handle, *settings) ?
   1066                                                 BTM_CMD_STARTED : BTM_NO_RESOURCES);
   1067 
   1068     /* If here, no BD Addr found */
   1069     return(BTM_UNKNOWN_ADDR);
   1070 }
   1071 
   1072 /*******************************************************************************
   1073 **
   1074 ** Function         BTM_SetDefaultLinkPolicy
   1075 **
   1076 ** Description      Set the default value for HCI "Write Policy Set" command
   1077 **                  to use when an ACL link is created.
   1078 **
   1079 ** Returns          void
   1080 **
   1081 *******************************************************************************/
   1082 void BTM_SetDefaultLinkPolicy (UINT16 settings)
   1083 {
   1084     UINT8 *localFeatures = BTM_ReadLocalFeatures();
   1085 
   1086     BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy setting:0x%04x", settings);
   1087 
   1088     if((settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)))
   1089     {
   1090         settings &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
   1091         BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy switch not supported (settings: 0x%04x)", settings);
   1092     }
   1093     if ((settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)))
   1094     {
   1095         settings &= ~HCI_ENABLE_HOLD_MODE;
   1096         BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy hold not supported (settings: 0x%04x)", settings);
   1097     }
   1098     if ((settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)))
   1099     {
   1100         settings &= ~HCI_ENABLE_SNIFF_MODE;
   1101         BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy sniff not supported (settings: 0x%04x)", settings);
   1102     }
   1103     if ((settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)))
   1104     {
   1105         settings &= ~HCI_ENABLE_PARK_MODE;
   1106         BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy park not supported (settings: 0x%04x)", settings);
   1107     }
   1108     BTM_TRACE_DEBUG1("Set DefaultLinkPolicy:0x%04x", settings);
   1109 
   1110     btm_cb.btm_def_link_policy = settings;
   1111 
   1112     /* Set the default Link Policy of the controller */
   1113     btsnd_hcic_write_def_policy_set(settings);
   1114 }
   1115 
   1116 
   1117 /*******************************************************************************
   1118 **
   1119 ** Function         BTM_ReadLinkPolicy
   1120 **
   1121 ** Description      This function is called to read the link policy settings.
   1122 **                  The address of link policy results are returned in the callback.
   1123 **                  (tBTM_LNK_POLICY_RESULTS)
   1124 **
   1125 ** Returns          status of the operation
   1126 **
   1127 *******************************************************************************/
   1128 tBTM_STATUS BTM_ReadLinkPolicy (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
   1129 {
   1130     tACL_CONN   *p;
   1131 
   1132     BTM_TRACE_API6 ("BTM_ReadLinkPolicy: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   1133                     remote_bda[0], remote_bda[1], remote_bda[2],
   1134                     remote_bda[3], remote_bda[4], remote_bda[5]);
   1135 
   1136     /* If someone already waiting on the version, do not allow another */
   1137     if (btm_cb.devcb.p_rlinkp_cmpl_cb)
   1138         return(BTM_BUSY);
   1139 
   1140     p = btm_bda_to_acl(remote_bda);
   1141     if (p != (tACL_CONN *)NULL)
   1142     {
   1143         btu_start_timer (&btm_cb.devcb.rlinkp_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT);
   1144         btm_cb.devcb.p_rlinkp_cmpl_cb = p_cb;
   1145 
   1146         if (!btsnd_hcic_read_policy_set (p->hci_handle))
   1147         {
   1148             btu_stop_timer (&btm_cb.devcb.rlinkp_timer);
   1149             btm_cb.devcb.p_rlinkp_cmpl_cb = NULL;
   1150             return(BTM_NO_RESOURCES);
   1151         }
   1152 
   1153         return(BTM_CMD_STARTED);
   1154     }
   1155 
   1156     /* If here, no BD Addr found */
   1157     return(BTM_UNKNOWN_ADDR);
   1158 }
   1159 
   1160 
   1161 /*******************************************************************************
   1162 **
   1163 ** Function         btm_read_link_policy_complete
   1164 **
   1165 ** Description      This function is called when the command complete message
   1166 **                  is received from the HCI for the read local link policy request.
   1167 **
   1168 ** Returns          void
   1169 **
   1170 *******************************************************************************/
   1171 void btm_read_link_policy_complete (UINT8 *p)
   1172 {
   1173     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_rlinkp_cmpl_cb;
   1174     tBTM_LNK_POLICY_RESULTS  lnkpol;
   1175     UINT16                   handle;
   1176     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
   1177     UINT16                   index;
   1178     BTM_TRACE_DEBUG0 ("btm_read_link_policy_complete");
   1179     btu_stop_timer (&btm_cb.devcb.rlinkp_timer);
   1180 
   1181     /* If there was a callback address for read local version, call it */
   1182     btm_cb.devcb.p_rlinkp_cmpl_cb = NULL;
   1183 
   1184     if (p_cb)
   1185     {
   1186         STREAM_TO_UINT8  (lnkpol.hci_status, p);
   1187 
   1188         if (lnkpol.hci_status == HCI_SUCCESS)
   1189         {
   1190             lnkpol.status = BTM_SUCCESS;
   1191 
   1192             STREAM_TO_UINT16 (handle, p);
   1193 
   1194             STREAM_TO_UINT16 (lnkpol.settings, p);
   1195 
   1196             /* Search through the list of active channels for the correct BD Addr */
   1197             for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++)
   1198             {
   1199                 if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle))
   1200                 {
   1201                     memcpy (lnkpol.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN);
   1202                     break;
   1203                 }
   1204             }
   1205         }
   1206         else
   1207             lnkpol.status = BTM_ERR_PROCESSING;
   1208 
   1209         (*p_cb)(&lnkpol);
   1210     }
   1211 }
   1212 
   1213 
   1214 /*******************************************************************************
   1215 **
   1216 ** Function         btm_read_remote_version_complete
   1217 **
   1218 ** Description      This function is called when the command complete message
   1219 **                  is received from the HCI for the remote version info.
   1220 **
   1221 ** Returns          void
   1222 **
   1223 *******************************************************************************/
   1224 void btm_read_remote_version_complete (UINT8 *p)
   1225 {
   1226     tACL_CONN        *p_acl_cb = &btm_cb.acl_db[0];
   1227     UINT8             status;
   1228     UINT16            handle;
   1229     int               xx;
   1230     BTM_TRACE_DEBUG0 ("btm_read_remote_version_complete");
   1231     STREAM_TO_UINT8  (status, p);
   1232     if (status == HCI_SUCCESS)
   1233     {
   1234         STREAM_TO_UINT16 (handle, p);
   1235 
   1236         /* Look up the connection by handle and copy features */
   1237         for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
   1238         {
   1239             if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
   1240             {
   1241                 STREAM_TO_UINT8  (p_acl_cb->lmp_version, p);
   1242                 STREAM_TO_UINT16 (p_acl_cb->manufacturer, p);
   1243                 STREAM_TO_UINT16 (p_acl_cb->lmp_subversion, p);
   1244                 break;
   1245             }
   1246         }
   1247     }
   1248 }
   1249 
   1250 
   1251 /*******************************************************************************
   1252 **
   1253 ** Function         btm_process_remote_ext_features
   1254 **
   1255 ** Description      Local function called to process all extended features pages
   1256 **                  read from a remote device.
   1257 **
   1258 ** Returns          void
   1259 **
   1260 *******************************************************************************/
   1261 void btm_process_remote_ext_features (tACL_CONN *p_acl_cb, UINT8 num_read_pages)
   1262 {
   1263     UINT16              handle = p_acl_cb->hci_handle;
   1264     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev_by_handle (handle);
   1265     UINT8               page_idx;
   1266 
   1267     BTM_TRACE_DEBUG0 ("btm_process_remote_ext_features");
   1268 
   1269     /* Make sure we have the record to save remote features information */
   1270     if (p_dev_rec == NULL)
   1271     {
   1272         /* Get a new device; might be doing dedicated bonding */
   1273         p_dev_rec = btm_find_or_alloc_dev (p_acl_cb->remote_addr);
   1274     }
   1275 
   1276     p_acl_cb->num_read_pages = num_read_pages;
   1277     p_dev_rec->num_read_pages = num_read_pages;
   1278 
   1279     /* Process the pages one by one */
   1280     for (page_idx = 0; page_idx < num_read_pages; page_idx++)
   1281     {
   1282         btm_process_remote_ext_features_page (p_acl_cb, p_dev_rec, page_idx);
   1283     }
   1284 }
   1285 
   1286 
   1287 /*******************************************************************************
   1288 **
   1289 ** Function         btm_process_remote_ext_features_page
   1290 **
   1291 ** Description      Local function called to process the information located
   1292 **                  in the specific extended features page read from a remote device.
   1293 **
   1294 ** Returns          void
   1295 **
   1296 *******************************************************************************/
   1297 void btm_process_remote_ext_features_page (tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec,
   1298                                            UINT8 page_idx)
   1299 {
   1300     UINT16            handle;
   1301     UINT8             req_pend;
   1302 
   1303     handle = p_acl_cb->hci_handle;
   1304 
   1305     memcpy (p_dev_rec->features[page_idx], p_acl_cb->peer_lmp_features[page_idx],
   1306             HCI_FEATURE_BYTES_PER_PAGE);
   1307 
   1308     switch (page_idx)
   1309     {
   1310     /* Extended (Legacy) Page 0 */
   1311     case HCI_EXT_FEATURES_PAGE_0:
   1312         /* Page 0 indicates Controller support for SSP */
   1313         if (btm_cb.security_mode < BTM_SEC_MODE_SP ||
   1314             !HCI_SIMPLE_PAIRING_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0]))
   1315         {
   1316             req_pend = (p_dev_rec->sm4 & BTM_SM4_REQ_PEND);
   1317             p_dev_rec->sm4 = BTM_SM4_KNOWN;
   1318             if (req_pend)
   1319             {
   1320                 l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
   1321             }
   1322         }
   1323         break;
   1324 
   1325     /* Extended Page 1 */
   1326     case HCI_EXT_FEATURES_PAGE_1:
   1327         /* Page 1 indicates Host support for SSP and SC */
   1328         req_pend = (p_dev_rec->sm4 & BTM_SM4_REQ_PEND);
   1329 
   1330         if (btm_cb.security_mode == BTM_SEC_MODE_SP
   1331             && HCI_SSP_HOST_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_1])
   1332             && HCI_SIMPLE_PAIRING_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0]))
   1333         {
   1334             p_dev_rec->sm4 = BTM_SM4_TRUE;
   1335         }
   1336         else
   1337         {
   1338             p_dev_rec->sm4 = BTM_SM4_KNOWN;
   1339         }
   1340 
   1341         BTM_TRACE_API4 ("ext_features_complt page_num:%d f[0]:x%02x, sm4:%x, pend:%d",
   1342                         HCI_EXT_FEATURES_PAGE_1, *(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_1]),
   1343                         p_dev_rec->sm4, req_pend);
   1344 
   1345         if (req_pend)
   1346             l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
   1347 
   1348         break;
   1349 
   1350     /* Extended Page 2 */
   1351     case HCI_EXT_FEATURES_PAGE_2:
   1352         /* Page 2 indicates Ping support*/
   1353         break;
   1354 
   1355     default:
   1356         BTM_TRACE_ERROR1("btm_process_remote_ext_features_page page=%d unexpected", page_idx);
   1357         break;
   1358     }
   1359 }
   1360 
   1361 
   1362 /*******************************************************************************
   1363 **
   1364 ** Function         btm_read_remote_features
   1365 **
   1366 ** Description      Local function called to send a read remote supported features/
   1367 **                  remote extended features page[0].
   1368 **
   1369 ** Returns          void
   1370 **
   1371 *******************************************************************************/
   1372 void btm_read_remote_features (UINT16 handle)
   1373 {
   1374     UINT8       acl_idx;
   1375     tACL_CONN   *p_acl_cb;
   1376 
   1377     BTM_TRACE_DEBUG1("btm_read_remote_features() handle: %d", handle);
   1378 
   1379     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
   1380     {
   1381         BTM_TRACE_ERROR1("btm_read_remote_features handle=%d invalid", handle);
   1382         return;
   1383     }
   1384 
   1385     p_acl_cb = &btm_cb.acl_db[acl_idx];
   1386     p_acl_cb->num_read_pages = 0;
   1387     memset (p_acl_cb->peer_lmp_features, 0, sizeof(p_acl_cb->peer_lmp_features));
   1388 
   1389     /* first send read remote supported features HCI command */
   1390     /* because we don't know whether the remote support extended feature command */
   1391     btsnd_hcic_rmt_features_req (handle);
   1392 }
   1393 
   1394 
   1395 /*******************************************************************************
   1396 **
   1397 ** Function         btm_read_remote_ext_features
   1398 **
   1399 ** Description      Local function called to send a read remote extended features
   1400 **
   1401 ** Returns          void
   1402 **
   1403 *******************************************************************************/
   1404 void btm_read_remote_ext_features (UINT16 handle, UINT8 page_number)
   1405 {
   1406     BTM_TRACE_DEBUG2("btm_read_remote_ext_features() handle: %d page: %d", handle, page_number);
   1407 
   1408     btsnd_hcic_rmt_ext_features(handle, page_number);
   1409 }
   1410 
   1411 
   1412 /*******************************************************************************
   1413 **
   1414 ** Function         btm_read_remote_features_complete
   1415 **
   1416 ** Description      This function is called when the remote supported features
   1417 **                  complete event is received from the HCI.
   1418 **
   1419 ** Returns          void
   1420 **
   1421 *******************************************************************************/
   1422 void btm_read_remote_features_complete (UINT8 *p)
   1423 {
   1424     tACL_CONN        *p_acl_cb;
   1425     UINT8             status;
   1426     UINT16            handle;
   1427     UINT8            acl_idx;
   1428 
   1429     BTM_TRACE_DEBUG0 ("btm_read_remote_features_complete");
   1430     STREAM_TO_UINT8  (status, p);
   1431 
   1432     if (status != HCI_SUCCESS)
   1433     {
   1434         BTM_TRACE_ERROR1 ("btm_read_remote_features_complete failed (status 0x%02x)", status);
   1435         return;
   1436     }
   1437 
   1438         STREAM_TO_UINT16 (handle, p);
   1439 
   1440     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
   1441         {
   1442         BTM_TRACE_ERROR1("btm_read_remote_features_complete handle=%d invalid", handle);
   1443         return;
   1444                 }
   1445 
   1446     p_acl_cb = &btm_cb.acl_db[acl_idx];
   1447 
   1448     /* Copy the received features page */
   1449     STREAM_TO_ARRAY(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0], p,
   1450                     HCI_FEATURE_BYTES_PER_PAGE);
   1451 
   1452     if ((HCI_LMP_EXTENDED_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) &&
   1453         (HCI_READ_REMOTE_EXT_FEATURES_SUPPORTED(btm_cb.devcb.supported_cmds)))
   1454     {
   1455         /* if the remote controller has extended features and local controller supports
   1456         ** HCI_Read_Remote_Extended_Features command then start reading these feature starting
   1457         ** with extended features page 1 */
   1458         BTM_TRACE_DEBUG0 ("Start reading remote extended features");
   1459         btm_read_remote_ext_features(handle, HCI_EXT_FEATURES_PAGE_1);
   1460         return;
   1461     }
   1462 
   1463     /* Remote controller has no extended features. Process remote controller supported features
   1464        (features page HCI_EXT_FEATURES_PAGE_0). */
   1465     btm_process_remote_ext_features (p_acl_cb, 1);
   1466 
   1467     /* Continue with HCI connection establishment */
   1468     btm_establish_continue (p_acl_cb);
   1469 }
   1470 
   1471 /*******************************************************************************
   1472 **
   1473 ** Function         btm_read_remote_ext_features_complete
   1474 **
   1475 ** Description      This function is called when the remote extended features
   1476 **                  complete event is received from the HCI.
   1477 **
   1478 ** Returns          void
   1479 **
   1480 *******************************************************************************/
   1481 void btm_read_remote_ext_features_complete (UINT8 *p)
   1482 {
   1483     tACL_CONN   *p_acl_cb;
   1484     UINT8       status, page_num, max_page;
   1485     UINT16      handle;
   1486     UINT8       acl_idx;
   1487 
   1488     BTM_TRACE_DEBUG0 ("btm_read_remote_ext_features_complete");
   1489 
   1490     STREAM_TO_UINT8  (status, p);
   1491     STREAM_TO_UINT16 (handle, p);
   1492     STREAM_TO_UINT8  (page_num, p);
   1493     STREAM_TO_UINT8  (max_page, p);
   1494 
   1495     /* Validate parameters */
   1496     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
   1497     {
   1498         BTM_TRACE_ERROR1("btm_read_remote_ext_features_complete handle=%d invalid", handle);
   1499         return;
   1500     }
   1501 
   1502     if (max_page > HCI_EXT_FEATURES_PAGE_MAX)
   1503     {
   1504         BTM_TRACE_ERROR1("btm_read_remote_ext_features_complete page=%d unknown", max_page);
   1505         return;
   1506     }
   1507 
   1508     p_acl_cb = &btm_cb.acl_db[acl_idx];
   1509 
   1510     /* Copy the received features page */
   1511     STREAM_TO_ARRAY(p_acl_cb->peer_lmp_features[page_num], p, HCI_FEATURE_BYTES_PER_PAGE);
   1512 
   1513     /* If there is the next remote features page and
   1514      * we have space to keep this page data - read this page */
   1515     if ((page_num < max_page) && (page_num < HCI_EXT_FEATURES_PAGE_MAX))
   1516     {
   1517         page_num++;
   1518         BTM_TRACE_DEBUG1("BTM reads next remote extended features page (%d)", page_num);
   1519         btm_read_remote_ext_features (handle, page_num);
   1520         return;
   1521     }
   1522 
   1523     /* Reading of remote feature pages is complete */
   1524     BTM_TRACE_DEBUG1("BTM reached last remote extended features page (%d)", page_num);
   1525 
   1526     /* Process the pages */
   1527     btm_process_remote_ext_features (p_acl_cb, (UINT8) (page_num + 1));
   1528 
   1529     /* Continue with HCI connection establishment */
   1530     btm_establish_continue (p_acl_cb);
   1531 }
   1532 
   1533 /*******************************************************************************
   1534 **
   1535 ** Function         btm_read_remote_ext_features_failed
   1536 **
   1537 ** Description      This function is called when the remote extended features
   1538 **                  complete event returns a failed status.
   1539 **
   1540 ** Returns          void
   1541 **
   1542 *******************************************************************************/
   1543 void btm_read_remote_ext_features_failed (UINT8 status, UINT16 handle)
   1544 {
   1545     tACL_CONN   *p_acl_cb;
   1546     UINT8       acl_idx;
   1547 
   1548     BTM_TRACE_WARNING2 ("btm_read_remote_ext_features_failed (status 0x%02x) for handle %d",
   1549                          status, handle);
   1550 
   1551     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
   1552     {
   1553         BTM_TRACE_ERROR1("btm_read_remote_ext_features_failed handle=%d invalid", handle);
   1554         return;
   1555     }
   1556 
   1557     p_acl_cb = &btm_cb.acl_db[acl_idx];
   1558 
   1559     /* Process supported features only */
   1560     btm_process_remote_ext_features (p_acl_cb, 1);
   1561 
   1562     /* Continue HCI connection establishment */
   1563     btm_establish_continue (p_acl_cb);
   1564 }
   1565 
   1566 /*******************************************************************************
   1567 **
   1568 ** Function         btm_establish_continue
   1569 **
   1570 ** Description      This function is called when the command complete message
   1571 **                  is received from the HCI for the read local link policy request.
   1572 **
   1573 ** Returns          void
   1574 **
   1575 *******************************************************************************/
   1576 static void btm_establish_continue (tACL_CONN *p_acl_cb)
   1577 {
   1578 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   1579     tBTM_BL_EVENT_DATA  evt_data;
   1580 #endif
   1581     BTM_TRACE_DEBUG0 ("btm_establish_continue");
   1582 #if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
   1583 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
   1584     if (!p_acl_cb->is_le_link)
   1585 #endif
   1586     {
   1587         /* For now there are a some devices that do not like sending */
   1588         /* commands events and data at the same time. */
   1589         /* Set the packet types to the default allowed by the device */
   1590         btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
   1591 
   1592         if (btm_cb.btm_def_link_policy)
   1593             BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
   1594     }
   1595 #endif
   1596     p_acl_cb->link_up_issued = TRUE;
   1597 
   1598     /* If anyone cares, tell him database changed */
   1599 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   1600     if (btm_cb.p_bl_changed_cb)
   1601     {
   1602         evt_data.event = BTM_BL_CONN_EVT;
   1603         evt_data.conn.p_bda = p_acl_cb->remote_addr;
   1604         evt_data.conn.p_bdn = p_acl_cb->remote_name;
   1605         evt_data.conn.p_dc  = p_acl_cb->remote_dc;
   1606         evt_data.conn.p_features = p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0];
   1607 
   1608 
   1609         (*btm_cb.p_bl_changed_cb)(&evt_data);
   1610     }
   1611     btm_acl_update_busy_level (BTM_BLI_ACL_UP_EVT);
   1612 #else
   1613     if (btm_cb.p_acl_changed_cb)
   1614         (*btm_cb.p_acl_changed_cb) (p_acl_cb->remote_addr,
   1615                                     p_acl_cb->remote_dc,
   1616                                     p_acl_cb->remote_name,
   1617                                     p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0],
   1618                                     TRUE);
   1619 #endif
   1620 }
   1621 
   1622 
   1623 /*******************************************************************************
   1624 **
   1625 ** Function         BTM_SetDefaultLinkSuperTout
   1626 **
   1627 ** Description      Set the default value for HCI "Write Link Supervision Timeout"
   1628 **                  command to use when an ACL link is created.
   1629 **
   1630 ** Returns          void
   1631 **
   1632 *******************************************************************************/
   1633 void BTM_SetDefaultLinkSuperTout (UINT16 timeout)
   1634 {
   1635     BTM_TRACE_DEBUG0 ("BTM_SetDefaultLinkSuperTout");
   1636     btm_cb.btm_def_link_super_tout = timeout;
   1637 }
   1638 
   1639 /*******************************************************************************
   1640 **
   1641 ** Function         BTM_GetLinkSuperTout
   1642 **
   1643 ** Description      Read the link supervision timeout value of the connection
   1644 **
   1645 ** Returns          status of the operation
   1646 **
   1647 *******************************************************************************/
   1648 tBTM_STATUS BTM_GetLinkSuperTout (BD_ADDR remote_bda, UINT16 *p_timeout)
   1649 {
   1650     tACL_CONN   *p = btm_bda_to_acl(remote_bda);
   1651 
   1652     BTM_TRACE_DEBUG0 ("BTM_GetLinkSuperTout");
   1653     if (p != (tACL_CONN *)NULL)
   1654     {
   1655         *p_timeout = p->link_super_tout;
   1656         return(BTM_SUCCESS);
   1657     }
   1658     /* If here, no BD Addr found */
   1659     return(BTM_UNKNOWN_ADDR);
   1660 }
   1661 
   1662 
   1663 /*******************************************************************************
   1664 **
   1665 ** Function         BTM_SetLinkSuperTout
   1666 **
   1667 ** Description      Create and send HCI "Write Link Supervision Timeout" command
   1668 **
   1669 ** Returns          status of the operation
   1670 **
   1671 *******************************************************************************/
   1672 tBTM_STATUS BTM_SetLinkSuperTout (BD_ADDR remote_bda, UINT16 timeout)
   1673 {
   1674     tACL_CONN   *p = btm_bda_to_acl(remote_bda);
   1675 
   1676     BTM_TRACE_DEBUG0 ("BTM_SetLinkSuperTout");
   1677     if (p != (tACL_CONN *)NULL)
   1678     {
   1679         p->link_super_tout = timeout;
   1680 
   1681         /* Only send if current role is Master; 2.0 spec requires this */
   1682         if (p->link_role == BTM_ROLE_MASTER)
   1683         {
   1684             if (!btsnd_hcic_write_link_super_tout (LOCAL_BR_EDR_CONTROLLER_ID,
   1685                                                    p->hci_handle, timeout))
   1686                 return(BTM_NO_RESOURCES);
   1687 
   1688             return(BTM_CMD_STARTED);
   1689         }
   1690         else
   1691             return(BTM_SUCCESS);
   1692     }
   1693 
   1694     /* If here, no BD Addr found */
   1695     return(BTM_UNKNOWN_ADDR);
   1696 }
   1697 
   1698 /*******************************************************************************
   1699 **
   1700 ** Function         BTM_RegForLstoEvt
   1701 **
   1702 ** Description      register for the HCI "Link Supervision Timeout Change" event
   1703 **
   1704 ** Returns          void
   1705 **
   1706 *******************************************************************************/
   1707 void BTM_RegForLstoEvt (tBTM_LSTO_CBACK *p_cback)
   1708 {
   1709     BTM_TRACE_DEBUG0 ("BTM_RegForLstoEvt");
   1710     btm_cb.p_lsto_cback = p_cback;
   1711 }
   1712 
   1713 /*******************************************************************************
   1714 **
   1715 ** Function         btm_proc_lsto_evt
   1716 **
   1717 ** Description      process the HCI "Link Supervision Timeout Change" event
   1718 **
   1719 ** Returns          void
   1720 **
   1721 *******************************************************************************/
   1722 void btm_proc_lsto_evt(UINT16 handle, UINT16 timeout)
   1723 {
   1724     UINT8 xx;
   1725 
   1726     BTM_TRACE_DEBUG0 ("btm_proc_lsto_evt");
   1727     if (btm_cb.p_lsto_cback)
   1728     {
   1729         /* Look up the connection by handle and set the current mode */
   1730         xx = btm_handle_to_acl_index(handle);
   1731 
   1732         /* don't assume that we can never get a bad hci_handle */
   1733         if (xx < MAX_L2CAP_LINKS)
   1734         {
   1735             (*btm_cb.p_lsto_cback)(btm_cb.acl_db[xx].remote_addr, timeout);
   1736         }
   1737     }
   1738 }
   1739 
   1740 #if BTM_PWR_MGR_INCLUDED == FALSE
   1741 /*******************************************************************************
   1742 **
   1743 ** Function         BTM_SetHoldMode
   1744 **
   1745 ** Description      This function is called to set a connection into hold mode.
   1746 **                  A check is made if the connection is in sniff or park mode,
   1747 **                  and if yes, the hold mode is ignored.
   1748 **
   1749 ** Returns          status of the operation
   1750 **
   1751 *******************************************************************************/
   1752 tBTM_STATUS BTM_SetHoldMode (BD_ADDR remote_bda, UINT16 min_interval, UINT16 max_interval)
   1753 {
   1754     tACL_CONN   *p;
   1755 
   1756     BTM_TRACE_DEBUG0 ("BTM_SetHoldMode");
   1757     /* First, check if hold mode is supported */
   1758     if (!HCI_HOLD_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
   1759         return(BTM_MODE_UNSUPPORTED);
   1760 
   1761     p = btm_bda_to_acl(remote_bda);
   1762     if (p != (tACL_CONN *)NULL)
   1763     {
   1764         /* If the connection is in park or sniff mode, forget about holding it */
   1765         if (p->mode != BTM_ACL_MODE_NORMAL)
   1766             return(BTM_SUCCESS);
   1767 
   1768         if (!btsnd_hcic_hold_mode (p->hci_handle, max_interval, min_interval))
   1769             return(BTM_NO_RESOURCES);
   1770 
   1771         return(BTM_CMD_STARTED);
   1772     }
   1773 
   1774     /* If here, no BD Addr found */
   1775     return(BTM_UNKNOWN_ADDR);
   1776 }
   1777 
   1778 
   1779 /*******************************************************************************
   1780 **
   1781 ** Function         BTM_SetSniffMode
   1782 **
   1783 ** Description      This function is called to set a connection into sniff mode.
   1784 **                  A check is made if the connection is already in sniff or park
   1785 **                  mode, and if yes, the sniff mode is ignored.
   1786 **
   1787 ** Returns          status of the operation
   1788 **
   1789 *******************************************************************************/
   1790 tBTM_STATUS BTM_SetSniffMode (BD_ADDR remote_bda, UINT16 min_period, UINT16 max_period,
   1791                               UINT16 attempt, UINT16 timeout)
   1792 {
   1793     tACL_CONN   *p;
   1794     BTM_TRACE_DEBUG0 ("BTM_SetSniffMode");
   1795     /* First, check if sniff mode is supported */
   1796     if (!HCI_SNIFF_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
   1797         return(BTM_MODE_UNSUPPORTED);
   1798 
   1799     p = btm_bda_to_acl(remote_bda);
   1800     if (p != (tACL_CONN *)NULL)
   1801     {
   1802         /* If the connection is in park mode, forget about sniffing it */
   1803         if (p->mode != BTM_ACL_MODE_NORMAL)
   1804             return(BTM_WRONG_MODE);
   1805 
   1806         if (!btsnd_hcic_sniff_mode (p->hci_handle, max_period,
   1807                                     min_period, attempt, timeout))
   1808             return(BTM_NO_RESOURCES);
   1809 
   1810         return(BTM_CMD_STARTED);
   1811     }
   1812 
   1813     /* If here, no BD Addr found */
   1814     return(BTM_UNKNOWN_ADDR);
   1815 }
   1816 
   1817 
   1818 
   1819 
   1820 /*******************************************************************************
   1821 **
   1822 ** Function         BTM_CancelSniffMode
   1823 **
   1824 ** Description      This function is called to put a connection out of sniff mode.
   1825 **                  A check is made if the connection is already in sniff mode,
   1826 **                  and if not, the cancel sniff mode is ignored.
   1827 **
   1828 ** Returns          status of the operation
   1829 **
   1830 *******************************************************************************/
   1831 tBTM_STATUS BTM_CancelSniffMode (BD_ADDR remote_bda)
   1832 {
   1833     tACL_CONN   *p = btm_bda_to_acl(remote_bda);
   1834     BTM_TRACE_DEBUG0 ("BTM_CancelSniffMode ");
   1835     if (p == (tACL_CONN *)NULL)
   1836         return(BTM_UNKNOWN_ADDR);
   1837 
   1838     /* If the connection is not in sniff mode, cannot cancel */
   1839     if (p->mode != BTM_ACL_MODE_SNIFF)
   1840         return(BTM_WRONG_MODE);
   1841 
   1842     if (!btsnd_hcic_exit_sniff_mode (p->hci_handle))
   1843         return(BTM_NO_RESOURCES);
   1844 
   1845     return(BTM_CMD_STARTED);
   1846 }
   1847 
   1848 
   1849 /*******************************************************************************
   1850 **
   1851 ** Function         BTM_SetParkMode
   1852 **
   1853 ** Description      This function is called to set a connection into park mode.
   1854 **                  A check is made if the connection is already in sniff or park
   1855 **                  mode, and if yes, the park mode is ignored.
   1856 **
   1857 ** Returns          status of the operation
   1858 **
   1859 *******************************************************************************/
   1860 tBTM_STATUS BTM_SetParkMode (BD_ADDR remote_bda, UINT16 beacon_min_period, UINT16 beacon_max_period)
   1861 {
   1862     tACL_CONN   *p;
   1863 
   1864     BTM_TRACE_DEBUG0 ("BTM_SetParkMode");
   1865     /* First, check if park mode is supported */
   1866     if (!HCI_PARK_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
   1867         return(BTM_MODE_UNSUPPORTED);
   1868 
   1869     p = btm_bda_to_acl(remote_bda);
   1870     if (p != (tACL_CONN *)NULL)
   1871     {
   1872         /* If the connection is in sniff mode, forget about parking it */
   1873         if (p->mode != BTM_ACL_MODE_NORMAL)
   1874             return(BTM_WRONG_MODE);
   1875 
   1876         /* no park mode if SCO exists -- CR#1982, 1.1 errata 1124
   1877            command status event should be returned /w error code 0x0C "Command Disallowed"
   1878            Let LM do this.
   1879         */
   1880         if (!btsnd_hcic_park_mode (p->hci_handle,
   1881                                    beacon_max_period, beacon_min_period))
   1882             return(BTM_NO_RESOURCES);
   1883 
   1884         return(BTM_CMD_STARTED);
   1885     }
   1886 
   1887     /* If here, no BD Addr found */
   1888     return(BTM_UNKNOWN_ADDR);
   1889 }
   1890 
   1891 /*******************************************************************************
   1892 **
   1893 ** Function         BTM_CancelParkMode
   1894 **
   1895 ** Description      This function is called to put a connection out of park mode.
   1896 **                  A check is made if the connection is already in park mode,
   1897 **                  and if not, the cancel sniff mode is ignored.
   1898 **
   1899 ** Returns          status of the operation
   1900 **
   1901 *******************************************************************************/
   1902 tBTM_STATUS BTM_CancelParkMode (BD_ADDR remote_bda)
   1903 {
   1904     tACL_CONN   *p;
   1905 
   1906     BTM_TRACE_DEBUG0 ("BTM_CancelParkMode");
   1907     p = btm_bda_to_acl(remote_bda);
   1908     if (p != (tACL_CONN *)NULL)
   1909     {
   1910         /* If the connection is not in park mode, cannot cancel */
   1911         if (p->mode != BTM_ACL_MODE_PARK)
   1912             return(BTM_WRONG_MODE);
   1913 
   1914         if (!btsnd_hcic_exit_park_mode (p->hci_handle))
   1915             return(BTM_NO_RESOURCES);
   1916 
   1917         return(BTM_CMD_STARTED);
   1918     }
   1919 
   1920     /* If here, no BD Addr found */
   1921     return(BTM_UNKNOWN_ADDR);
   1922 }
   1923 #endif /* BTM_PWR_MGR_INCLUDED == FALSE */
   1924 
   1925 
   1926 /*******************************************************************************
   1927 **
   1928 ** Function         BTM_SetPacketTypes
   1929 **
   1930 ** Description      This function is set the packet types used for a specific
   1931 **                  ACL connection,
   1932 **
   1933 ** Returns          status of the operation
   1934 **
   1935 *******************************************************************************/
   1936 tBTM_STATUS BTM_SetPacketTypes (BD_ADDR remote_bda, UINT16 pkt_types)
   1937 {
   1938     tACL_CONN   *p;
   1939     BTM_TRACE_DEBUG0 ("BTM_SetPacketTypes");
   1940 
   1941     if ((p = btm_bda_to_acl(remote_bda)) != NULL)
   1942         return(btm_set_packet_types (p, pkt_types));
   1943 
   1944     /* If here, no BD Addr found */
   1945     return(BTM_UNKNOWN_ADDR);
   1946 }
   1947 
   1948 
   1949 /*******************************************************************************
   1950 **
   1951 ** Function         BTM_ReadPacketTypes
   1952 **
   1953 ** Description      This function is set the packet types used for a specific
   1954 **                  ACL connection,
   1955 **
   1956 ** Returns          packet types supported for the connection, or 0 if no BD address
   1957 **
   1958 *******************************************************************************/
   1959 UINT16 BTM_ReadPacketTypes (BD_ADDR remote_bda)
   1960 {
   1961     tACL_CONN   *p;
   1962 
   1963     BTM_TRACE_DEBUG0 ("BTM_ReadPacketTypes");
   1964     p = btm_bda_to_acl(remote_bda);
   1965     if (p != (tACL_CONN *)NULL)
   1966     {
   1967         return(p->pkt_types_mask);
   1968     }
   1969 
   1970     /* If here, no BD Addr found */
   1971     return(0);
   1972 }
   1973 
   1974 
   1975 /*******************************************************************************
   1976 **
   1977 ** Function         BTM_ReadAclMode
   1978 **
   1979 ** Description      This returns the current mode for a specific
   1980 **                  ACL connection.
   1981 **
   1982 ** Input Param      remote_bda - device address of desired ACL connection
   1983 **
   1984 ** Output Param     p_mode - address where the current mode is copied into.
   1985 **                          BTM_ACL_MODE_NORMAL
   1986 **                          BTM_ACL_MODE_HOLD
   1987 **                          BTM_ACL_MODE_SNIFF
   1988 **                          BTM_ACL_MODE_PARK
   1989 **                          (valid only if return code is BTM_SUCCESS)
   1990 **
   1991 ** Returns          BTM_SUCCESS if successful,
   1992 **                  BTM_UNKNOWN_ADDR if bd addr is not active or bad
   1993 **
   1994 *******************************************************************************/
   1995 #if BTM_PWR_MGR_INCLUDED == FALSE
   1996 tBTM_STATUS BTM_ReadAclMode (BD_ADDR remote_bda, UINT8 *p_mode)
   1997 {
   1998     tACL_CONN   *p;
   1999 
   2000     BTM_TRACE_API6 ("BTM_ReadAclMode: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2001                     remote_bda[0], remote_bda[1], remote_bda[2],
   2002                     remote_bda[3], remote_bda[4], remote_bda[5]);
   2003 
   2004     p = btm_bda_to_acl(remote_bda);
   2005     if (p != (tACL_CONN *)NULL)
   2006     {
   2007         *p_mode = p->mode;
   2008         return(BTM_SUCCESS);
   2009     }
   2010 
   2011     /* If here, no BD Addr found */
   2012     return(BTM_UNKNOWN_ADDR);
   2013 }
   2014 #endif /* BTM_PWR_MGR_INCLUDED == FALSE */
   2015 
   2016 /*******************************************************************************
   2017 **
   2018 ** Function         BTM_ReadClockOffset
   2019 **
   2020 ** Description      This returns the clock offset for a specific
   2021 **                  ACL connection.
   2022 **
   2023 ** Input Param      remote_bda - device address of desired ACL connection
   2024 **
   2025 ** Returns          clock-offset or 0 if unknown
   2026 **
   2027 *******************************************************************************/
   2028 UINT16 BTM_ReadClockOffset (BD_ADDR remote_bda)
   2029 {
   2030     tACL_CONN   *p;
   2031 
   2032     BTM_TRACE_API6 ("BTM_ReadClockOffset: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2033                     remote_bda[0], remote_bda[1], remote_bda[2],
   2034                     remote_bda[3], remote_bda[4], remote_bda[5]);
   2035 
   2036     if ( (p = btm_bda_to_acl(remote_bda)) != NULL)
   2037         return(p->clock_offset);
   2038 
   2039     /* If here, no BD Addr found */
   2040     return(0);
   2041 }
   2042 
   2043 /*******************************************************************************
   2044 **
   2045 ** Function         BTM_IsAclConnectionUp
   2046 **
   2047 ** Description      This function is called to check if an ACL connection exists
   2048 **                  to a specific remote BD Address.
   2049 **
   2050 ** Returns          TRUE if connection is up, else FALSE.
   2051 **
   2052 *******************************************************************************/
   2053 BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda)
   2054 {
   2055     tACL_CONN   *p;
   2056 
   2057     BTM_TRACE_API6 ("BTM_IsAclConnectionUp: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2058                     remote_bda[0], remote_bda[1], remote_bda[2],
   2059                     remote_bda[3], remote_bda[4], remote_bda[5]);
   2060 
   2061     p = btm_bda_to_acl(remote_bda);
   2062     if (p != (tACL_CONN *)NULL)
   2063     {
   2064         return(TRUE);
   2065     }
   2066 
   2067     /* If here, no BD Addr found */
   2068     return(FALSE);
   2069 }
   2070 
   2071 /*******************************************************************************
   2072 **
   2073 ** Function         BTM_GetNumAclLinks
   2074 **
   2075 ** Description      This function is called to count the number of
   2076 **                  ACL links that are active.
   2077 **
   2078 ** Returns          UINT16  Number of active ACL links
   2079 **
   2080 *******************************************************************************/
   2081 UINT16 BTM_GetNumAclLinks (void)
   2082 {
   2083 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   2084     return(UINT16)btm_cb.num_acl;
   2085 #else
   2086     tACL_CONN   *p = &btm_cb.acl_db[0];
   2087     UINT16      xx, yy;
   2088     BTM_TRACE_DEBUG0 ("BTM_GetNumAclLinks");
   2089     for (xx = yy = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
   2090     {
   2091         if (p->in_use)
   2092             yy++;
   2093     }
   2094 
   2095     return(yy);
   2096 #endif
   2097 }
   2098 
   2099 /*******************************************************************************
   2100 **
   2101 ** Function         btm_get_acl_disc_reason_code
   2102 **
   2103 ** Description      This function is called to get the disconnection reason code
   2104 **                  returned by the HCI at disconnection complete event.
   2105 **
   2106 ** Returns          TRUE if connection is up, else FALSE.
   2107 **
   2108 *******************************************************************************/
   2109 UINT16 btm_get_acl_disc_reason_code (void)
   2110 {
   2111     UINT8 res = btm_cb.acl_disc_reason;
   2112     BTM_TRACE_DEBUG0 ("btm_get_acl_disc_reason_code");
   2113     return(res);
   2114 }
   2115 
   2116 
   2117 /*******************************************************************************
   2118 **
   2119 ** Function         BTM_GetHCIConnHandle
   2120 **
   2121 ** Description      This function is called to get the handle for an ACL connection
   2122 **                  to a specific remote BD Address.
   2123 **
   2124 ** Returns          the handle of the connection, or 0xFFFF if none.
   2125 **
   2126 *******************************************************************************/
   2127 UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda)
   2128 {
   2129     tACL_CONN   *p;
   2130     BTM_TRACE_DEBUG0 ("BTM_GetHCIConnHandle");
   2131     p = btm_bda_to_acl(remote_bda);
   2132     if (p != (tACL_CONN *)NULL)
   2133     {
   2134         return(p->hci_handle);
   2135     }
   2136 
   2137     /* If here, no BD Addr found */
   2138     return(0xFFFF);
   2139 }
   2140 
   2141 #if BTM_PWR_MGR_INCLUDED == FALSE
   2142 /*******************************************************************************
   2143 **
   2144 ** Function         btm_process_mode_change
   2145 **
   2146 ** Description      This function is called when an HCI mode change event occurs.
   2147 **
   2148 ** Input Parms      hci_status - status of the event (HCI_SUCCESS if no errors)
   2149 **                  hci_handle - connection handle associated with the change
   2150 **                  mode - HCI_MODE_ACTIVE, HCI_MODE_HOLD, HCI_MODE_SNIFF, or HCI_MODE_PARK
   2151 **                  interval - number of baseband slots (meaning depends on mode)
   2152 **
   2153 ** Returns          void
   2154 **
   2155 *******************************************************************************/
   2156 void btm_process_mode_change (UINT8 hci_status, UINT16 hci_handle, UINT8 mode, UINT16 interval)
   2157 {
   2158     tACL_CONN        *p;
   2159     UINT8             xx;
   2160     BTM_TRACE_DEBUG0 ("btm_process_mode_change");
   2161     if (hci_status != HCI_SUCCESS)
   2162     {
   2163         BTM_TRACE_WARNING1 ("BTM: HCI Mode Change Error Status: 0x%02x", hci_status);
   2164     }
   2165 
   2166     /* Look up the connection by handle and set the current mode */
   2167     xx = btm_handle_to_acl_index(hci_handle);
   2168 
   2169     /* don't assume that we can never get a bad hci_handle */
   2170     if (xx >= MAX_L2CAP_LINKS)
   2171         return;
   2172 
   2173     p = &btm_cb.acl_db[xx];
   2174 
   2175     /* If status is not success mode does not mean anything */
   2176     if (hci_status == HCI_SUCCESS)
   2177         p->mode = mode;
   2178 
   2179     /* If mode change was because of an active role switch or change link key */
   2180     btm_cont_rswitch_or_chglinkkey(p, btm_find_dev(p->remote_addr), hci_status);
   2181 }
   2182 #endif /* BTM_PWR_MGR_INCLUDED == FALSE */
   2183 
   2184 /*******************************************************************************
   2185 **
   2186 ** Function         btm_process_clk_off_comp_evt
   2187 **
   2188 ** Description      This function is called when clock offset command completes.
   2189 **
   2190 ** Input Parms      hci_handle - connection handle associated with the change
   2191 **                  clock offset
   2192 **
   2193 ** Returns          void
   2194 **
   2195 *******************************************************************************/
   2196 void btm_process_clk_off_comp_evt (UINT16 hci_handle, UINT16 clock_offset)
   2197 {
   2198     UINT8      xx;
   2199     BTM_TRACE_DEBUG0 ("btm_process_clk_off_comp_evt");
   2200     /* Look up the connection by handle and set the current mode */
   2201     if ((xx = btm_handle_to_acl_index(hci_handle)) < MAX_L2CAP_LINKS)
   2202         btm_cb.acl_db[xx].clock_offset = clock_offset;
   2203 }
   2204 
   2205 /*******************************************************************************
   2206 **
   2207 ** Function         btm_acl_role_changed
   2208 **
   2209 ** Description      This function is called whan a link's master/slave role change
   2210 **                  event or command status event (with error) is received.
   2211 **                  It updates the link control block, and calls
   2212 **                  the registered callback with status and role (if registered).
   2213 **
   2214 ** Returns          void
   2215 **
   2216 *******************************************************************************/
   2217 void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role)
   2218 {
   2219     UINT8                   *p_bda = (bd_addr) ? bd_addr :
   2220                                         btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
   2221     tACL_CONN               *p = btm_bda_to_acl(p_bda);
   2222     tBTM_ROLE_SWITCH_CMPL   *p_data = &btm_cb.devcb.switch_role_ref_data;
   2223     tBTM_SEC_DEV_REC        *p_dev_rec;
   2224 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   2225     tBTM_BL_ROLE_CHG_DATA   evt;
   2226 #endif
   2227 
   2228     BTM_TRACE_DEBUG0 ("btm_acl_role_changed");
   2229     /* Ignore any stray events */
   2230     if (p == NULL)
   2231     {
   2232         /* it could be a failure */
   2233         if (hci_status != HCI_SUCCESS)
   2234             btm_acl_report_role_change(hci_status, bd_addr);
   2235         return;
   2236     }
   2237 
   2238     p_data->hci_status = hci_status;
   2239 
   2240     if (hci_status == HCI_SUCCESS)
   2241     {
   2242         p_data->role = new_role;
   2243         memcpy(p_data->remote_bd_addr, p_bda, BD_ADDR_LEN);
   2244 
   2245         /* Update cached value */
   2246         p->link_role = new_role;
   2247         btm_save_remote_device_role(p_bda, new_role);
   2248         /* Reload LSTO: link supervision timeout is reset in the LM after a role switch */
   2249         if (new_role == BTM_ROLE_MASTER)
   2250         {
   2251             BTM_SetLinkSuperTout (p->remote_addr, p->link_super_tout);
   2252         }
   2253     }
   2254     else
   2255     {
   2256         /* so the BTM_BL_ROLE_CHG_EVT uses the old role */
   2257         new_role = p->link_role;
   2258     }
   2259 
   2260     /* Check if any SCO req is pending for role change */
   2261     btm_sco_chk_pend_rolechange (p->hci_handle);
   2262 
   2263     /* if switching state is switching we need to turn encryption on */
   2264     /* if idle, we did not change encryption */
   2265     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_SWITCHING)
   2266     {
   2267         /* Make sure there's not also a change link key going on before re-enabling */
   2268         if (p->change_key_state != BTM_ACL_SWKEY_STATE_SWITCHING)
   2269         {
   2270             if (btsnd_hcic_set_conn_encrypt (p->hci_handle, TRUE))
   2271             {
   2272                 p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_ON;
   2273                 p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_ON;
   2274                 return;
   2275             }
   2276         }
   2277         else    /* Set the state and wait for change link key */
   2278         {
   2279             p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_ON;
   2280             return;
   2281         }
   2282     }
   2283 
   2284     /* Set the switch_role_state to IDLE since the reply received from HCI */
   2285     /* regardless of its result either success or failed. */
   2286     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_IN_PROGRESS)
   2287     {
   2288         p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
   2289         p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
   2290     }
   2291 
   2292     /* if role switch complete is needed, report it now */
   2293     btm_acl_report_role_change(hci_status, bd_addr);
   2294 
   2295 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   2296     /* if role change event is registered, report it now */
   2297     if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK))
   2298     {
   2299         evt.event       = BTM_BL_ROLE_CHG_EVT;
   2300         evt.new_role    = new_role;
   2301         evt.p_bda       = p_bda;
   2302         evt.hci_status  = hci_status;
   2303         (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
   2304     }
   2305 
   2306     BTM_TRACE_DEBUG3("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
   2307                      p_data->role, p_data->hci_status, p->switch_role_state);
   2308 #endif
   2309 
   2310 #if BTM_DISC_DURING_RS == TRUE
   2311     /* If a disconnect is pending, issue it now that role switch has completed */
   2312     if ((p_dev_rec = btm_find_dev (p_bda)) != NULL)
   2313     {
   2314         if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING)
   2315         {
   2316             BTM_TRACE_WARNING0("btm_acl_role_changed -> Issuing delayed HCI_Disconnect!!!");
   2317             btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER);
   2318         }
   2319         BTM_TRACE_ERROR2("tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
   2320                          (UINT32)p_dev_rec, p_dev_rec->rs_disc_pending);
   2321         p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
   2322     }
   2323 
   2324 #endif
   2325 
   2326 }
   2327 
   2328 #if (RFCOMM_INCLUDED==TRUE)
   2329 /*******************************************************************************
   2330 **
   2331 ** Function         BTM_AllocateSCN
   2332 **
   2333 ** Description      Look through the Server Channel Numbers for a free one.
   2334 **
   2335 ** Returns          Allocated SCN number or 0 if none.
   2336 **
   2337 *******************************************************************************/
   2338 
   2339 UINT8 BTM_AllocateSCN(void)
   2340 {
   2341     UINT8   x;
   2342     BTM_TRACE_DEBUG0 ("BTM_AllocateSCN");
   2343 
   2344     // stack reserves scn 1 for HFP, HSP we still do the correct way
   2345     for (x = 1; x < BTM_MAX_SCN; x++)
   2346     {
   2347         if (!btm_cb.btm_scn[x])
   2348         {
   2349             btm_cb.btm_scn[x] = TRUE;
   2350             return(x+1);
   2351         }
   2352     }
   2353 
   2354     return(0);     /* No free ports */
   2355 }
   2356 
   2357 /*******************************************************************************
   2358 **
   2359 ** Function         BTM_TryAllocateSCN
   2360 **
   2361 ** Description      Try to allocate a fixed server channel
   2362 **
   2363 ** Returns          Returns TRUE if server channel was available
   2364 **
   2365 *******************************************************************************/
   2366 
   2367 BOOLEAN BTM_TryAllocateSCN(UINT8 scn)
   2368 {
   2369     UINT8   x;
   2370 
   2371     /* Make sure we don't exceed max port range.
   2372      * Stack reserves scn 1 for HFP, HSP we still do the correct way.
   2373      */
   2374     if ( (scn>=BTM_MAX_SCN) || (scn == 1) )
   2375         return FALSE;
   2376 
   2377     /* check if this port is available */
   2378     if (!btm_cb.btm_scn[scn-1])
   2379     {
   2380         btm_cb.btm_scn[scn-1] = TRUE;
   2381         return TRUE;
   2382     }
   2383 
   2384     return (FALSE);     /* Port was busy */
   2385 }
   2386 
   2387 /*******************************************************************************
   2388 **
   2389 ** Function         BTM_FreeSCN
   2390 **
   2391 ** Description      Free the specified SCN.
   2392 **
   2393 ** Returns          TRUE or FALSE
   2394 **
   2395 *******************************************************************************/
   2396 BOOLEAN BTM_FreeSCN(UINT8 scn)
   2397 {
   2398     BTM_TRACE_DEBUG0 ("BTM_FreeSCN ");
   2399     if (scn <= BTM_MAX_SCN)
   2400     {
   2401         btm_cb.btm_scn[scn-1] = FALSE;
   2402         return(TRUE);
   2403     }
   2404     else
   2405         return(FALSE);      /* Illegal SCN passed in */
   2406 }
   2407 
   2408 #else
   2409 
   2410 /* Make dummy functions for the RPC to link against */
   2411 UINT8 BTM_AllocateSCN(void)
   2412 {
   2413     return(0);
   2414 }
   2415 
   2416 BOOLEAN BTM_FreeSCN(UINT8 scn)
   2417 {
   2418     return(FALSE);
   2419 }
   2420 
   2421 #endif
   2422 
   2423 
   2424 /*******************************************************************************
   2425 **
   2426 ** Function         btm_acl_timeout
   2427 **
   2428 ** Description      This function is called when a timer list entry expires.
   2429 **
   2430 ** Returns          void
   2431 **
   2432 *******************************************************************************/
   2433 void btm_acl_timeout (TIMER_LIST_ENT  *p_tle)
   2434 {
   2435     UINT32 timer_type = p_tle->param;
   2436 
   2437     BTM_TRACE_DEBUG0 ("btm_acl_timeout");
   2438     if (timer_type == TT_DEV_RLNKP)
   2439     {
   2440         tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_rlinkp_cmpl_cb;
   2441         tBTM_LNK_POLICY_RESULTS  lnkpol;
   2442 
   2443         lnkpol.status = BTM_ERR_PROCESSING;
   2444         lnkpol.settings = 0;
   2445 
   2446         btm_cb.devcb.p_rlinkp_cmpl_cb = NULL;
   2447 
   2448         if (p_cb)
   2449             (*p_cb)(&lnkpol);
   2450     }
   2451 }
   2452 
   2453 /*******************************************************************************
   2454 **
   2455 ** Function         btm_set_packet_types
   2456 **
   2457 ** Description      This function sets the packet types used for a specific
   2458 **                  ACL connection. It is called internally by btm_acl_created
   2459 **                  or by an application/profile by BTM_SetPacketTypes.
   2460 **
   2461 ** Returns          status of the operation
   2462 **
   2463 *******************************************************************************/
   2464 tBTM_STATUS btm_set_packet_types (tACL_CONN *p, UINT16 pkt_types)
   2465 {
   2466     UINT16 temp_pkt_types;
   2467     BTM_TRACE_DEBUG0 ("btm_set_packet_types");
   2468     /* Save in the ACL control blocks, types that we support */
   2469     temp_pkt_types = (pkt_types & BTM_ACL_SUPPORTED_PKTS_MASK &
   2470                       btm_cb.btm_acl_pkt_types_supported);
   2471 
   2472     /* OR in any exception packet types if at least 2.0 version of spec */
   2473     if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
   2474     {
   2475         temp_pkt_types |= ((pkt_types & BTM_ACL_EXCEPTION_PKTS_MASK) |
   2476                            (btm_cb.btm_acl_pkt_types_supported & BTM_ACL_EXCEPTION_PKTS_MASK));
   2477     }
   2478     else
   2479     {
   2480         temp_pkt_types &= (~BTM_ACL_EXCEPTION_PKTS_MASK);
   2481     }
   2482 
   2483     /* Exclude packet types not supported by the peer */
   2484     btm_acl_chk_peer_pkt_type_support (p, &temp_pkt_types);
   2485 
   2486     BTM_TRACE_DEBUG1 ("SetPacketType Mask -> 0x%04x", temp_pkt_types);
   2487 
   2488     if (!btsnd_hcic_change_conn_type (p->hci_handle, temp_pkt_types))
   2489     {
   2490         return(BTM_NO_RESOURCES);
   2491     }
   2492 
   2493     p->pkt_types_mask = temp_pkt_types;
   2494 
   2495     return(BTM_CMD_STARTED);
   2496 }
   2497 
   2498 /*******************************************************************************
   2499 **
   2500 ** Function         btm_get_max_packet_size
   2501 **
   2502 ** Returns          Returns maximum packet size that can be used for current
   2503 **                  connection, 0 if connection is not established
   2504 **
   2505 *******************************************************************************/
   2506 UINT16 btm_get_max_packet_size (BD_ADDR addr)
   2507 {
   2508     tACL_CONN   *p = btm_bda_to_acl(addr);
   2509     UINT16      pkt_types = 0;
   2510     UINT16      pkt_size = 0;
   2511     BTM_TRACE_DEBUG0 ("btm_get_max_packet_size");
   2512     if (p != NULL)
   2513     {
   2514         pkt_types = p->pkt_types_mask;
   2515     }
   2516     else
   2517     {
   2518         /* Special case for when info for the local device is requested */
   2519         if (memcmp (btm_cb.devcb.local_addr, addr, BD_ADDR_LEN) == 0)
   2520         {
   2521             pkt_types = btm_cb.btm_acl_pkt_types_supported;
   2522         }
   2523     }
   2524 
   2525     if (pkt_types)
   2526     {
   2527         if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH5))
   2528             pkt_size = HCI_EDR3_DH5_PACKET_SIZE;
   2529         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH5))
   2530             pkt_size = HCI_EDR2_DH5_PACKET_SIZE;
   2531         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH3))
   2532             pkt_size = HCI_EDR3_DH3_PACKET_SIZE;
   2533         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH5)
   2534             pkt_size = HCI_DH5_PACKET_SIZE;
   2535         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH3))
   2536             pkt_size = HCI_EDR2_DH3_PACKET_SIZE;
   2537         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM5)
   2538             pkt_size = HCI_DM5_PACKET_SIZE;
   2539         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH3)
   2540             pkt_size = HCI_DH3_PACKET_SIZE;
   2541         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM3)
   2542             pkt_size = HCI_DM3_PACKET_SIZE;
   2543         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH1))
   2544             pkt_size = HCI_EDR3_DH1_PACKET_SIZE;
   2545         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH1))
   2546             pkt_size = HCI_EDR2_DH1_PACKET_SIZE;
   2547         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH1)
   2548             pkt_size = HCI_DH1_PACKET_SIZE;
   2549         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM1)
   2550             pkt_size = HCI_DM1_PACKET_SIZE;
   2551     }
   2552 
   2553    return(pkt_size);
   2554 }
   2555 
   2556 /*******************************************************************************
   2557 **
   2558 ** Function         BTM_ReadRemoteVersion
   2559 **
   2560 ** Returns          If connected report peer device info
   2561 **
   2562 *******************************************************************************/
   2563 tBTM_STATUS BTM_ReadRemoteVersion (BD_ADDR addr, UINT8 *lmp_version,
   2564                                    UINT16 *manufacturer, UINT16 *lmp_sub_version)
   2565 {
   2566     tACL_CONN        *p = btm_bda_to_acl(addr);
   2567     BTM_TRACE_DEBUG0 ("BTM_ReadRemoteVersion");
   2568     if (p == NULL)
   2569         return(BTM_UNKNOWN_ADDR);
   2570 
   2571     if (lmp_version)
   2572         *lmp_version = p->lmp_version;
   2573 
   2574     if (manufacturer)
   2575         *manufacturer = p->manufacturer;
   2576 
   2577     if (lmp_sub_version)
   2578         *lmp_sub_version = p->lmp_subversion;
   2579 
   2580     return(BTM_SUCCESS);
   2581 }
   2582 
   2583 /*******************************************************************************
   2584 **
   2585 ** Function         BTM_ReadRemoteFeatures
   2586 **
   2587 ** Returns          pointer to the remote supported features mask (8 bytes)
   2588 **
   2589 *******************************************************************************/
   2590 UINT8 *BTM_ReadRemoteFeatures (BD_ADDR addr)
   2591 {
   2592     tACL_CONN        *p = btm_bda_to_acl(addr);
   2593     BTM_TRACE_DEBUG0 ("BTM_ReadRemoteFeatures");
   2594     if (p == NULL)
   2595     {
   2596         return(NULL);
   2597     }
   2598 
   2599     return(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]);
   2600 }
   2601 
   2602 /*******************************************************************************
   2603 **
   2604 ** Function         BTM_ReadRemoteExtendedFeatures
   2605 **
   2606 ** Returns          pointer to the remote extended features mask (8 bytes)
   2607 **                  or NULL if bad page
   2608 **
   2609 *******************************************************************************/
   2610 UINT8 *BTM_ReadRemoteExtendedFeatures (BD_ADDR addr, UINT8 page_number)
   2611 {
   2612     tACL_CONN        *p = btm_bda_to_acl(addr);
   2613     BTM_TRACE_DEBUG0 ("BTM_ReadRemoteExtendedFeatures");
   2614     if (p == NULL)
   2615     {
   2616         return(NULL);
   2617     }
   2618 
   2619     if (page_number > HCI_EXT_FEATURES_PAGE_MAX)
   2620     {
   2621         BTM_TRACE_ERROR1("Warning: BTM_ReadRemoteExtendedFeatures page %d unknown", page_number);
   2622         return NULL;
   2623     }
   2624 
   2625     return(p->peer_lmp_features[page_number]);
   2626 }
   2627 
   2628 /*******************************************************************************
   2629 **
   2630 ** Function         BTM_ReadNumberRemoteFeaturesPages
   2631 **
   2632 ** Returns          number of features pages read from the remote device.
   2633 **
   2634 *******************************************************************************/
   2635 UINT8 BTM_ReadNumberRemoteFeaturesPages (BD_ADDR addr)
   2636 {
   2637     tACL_CONN        *p = btm_bda_to_acl(addr);
   2638     BTM_TRACE_DEBUG0 ("BTM_ReadNumberRemoteFeaturesPages");
   2639     if (p == NULL)
   2640     {
   2641         return(0);
   2642     }
   2643 
   2644     return(p->num_read_pages);
   2645 }
   2646 
   2647 /*******************************************************************************
   2648 **
   2649 ** Function         BTM_ReadAllRemoteFeatures
   2650 **
   2651 ** Returns          pointer to all features of the remote (24 bytes).
   2652 **
   2653 *******************************************************************************/
   2654 UINT8 *BTM_ReadAllRemoteFeatures (BD_ADDR addr)
   2655 {
   2656     tACL_CONN        *p = btm_bda_to_acl(addr);
   2657     BTM_TRACE_DEBUG0 ("BTM_ReadAllRemoteFeatures");
   2658     if (p == NULL)
   2659     {
   2660         return(NULL);
   2661     }
   2662 
   2663     return(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]);
   2664 }
   2665 
   2666 /*******************************************************************************
   2667 **
   2668 ** Function         BTM_RegBusyLevelNotif
   2669 **
   2670 ** Description      This function is called to register a callback to receive
   2671 **                  busy level change events.
   2672 **
   2673 ** Returns          BTM_SUCCESS if successfully registered, otherwise error
   2674 **
   2675 *******************************************************************************/
   2676 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   2677 tBTM_STATUS BTM_RegBusyLevelNotif (tBTM_BL_CHANGE_CB *p_cb, UINT8 *p_level,
   2678                                    tBTM_BL_EVENT_MASK evt_mask)
   2679 {
   2680     BTM_TRACE_DEBUG0 ("BTM_RegBusyLevelNotif");
   2681     if (p_level)
   2682         *p_level = btm_cb.busy_level;
   2683 
   2684     btm_cb.bl_evt_mask = evt_mask;
   2685 
   2686     if (!p_cb)
   2687         btm_cb.p_bl_changed_cb = NULL;
   2688     else if (btm_cb.p_bl_changed_cb)
   2689         return(BTM_BUSY);
   2690     else
   2691         btm_cb.p_bl_changed_cb = p_cb;
   2692 
   2693     return(BTM_SUCCESS);
   2694 }
   2695 #else
   2696 /*******************************************************************************
   2697 **
   2698 ** Function         BTM_AclRegisterForChanges
   2699 **
   2700 ** Returns          This function is called to register a callback for when the
   2701 **                  ACL database changes, i.e. new entry or entry deleted.
   2702 **
   2703 *******************************************************************************/
   2704 tBTM_STATUS BTM_AclRegisterForChanges (tBTM_ACL_DB_CHANGE_CB *p_cb)
   2705 {
   2706     BTM_TRACE_DEBUG0 ("BTM_AclRegisterForChanges");
   2707     if (!p_cb)
   2708         btm_cb.p_acl_changed_cb = NULL;
   2709     else if (btm_cb.p_acl_changed_cb)
   2710         return(BTM_BUSY);
   2711     else
   2712         btm_cb.p_acl_changed_cb = p_cb;
   2713 
   2714     return(BTM_SUCCESS);
   2715 }
   2716 #endif
   2717 
   2718 /*******************************************************************************
   2719 **
   2720 ** Function         BTM_SetQoS
   2721 **
   2722 ** Description      This function is called to setup QoS
   2723 **
   2724 ** Returns          status of the operation
   2725 **
   2726 *******************************************************************************/
   2727 tBTM_STATUS BTM_SetQoS (BD_ADDR bd, FLOW_SPEC *p_flow, tBTM_CMPL_CB *p_cb)
   2728 {
   2729     tACL_CONN   *p = &btm_cb.acl_db[0];
   2730 
   2731     BTM_TRACE_API6 ("BTM_SetQoS: BdAddr: %02x%02x%02x%02x%02x%02x",
   2732                     bd[0], bd[1], bd[2],
   2733                     bd[3], bd[4], bd[5]);
   2734 
   2735     /* If someone already waiting on the version, do not allow another */
   2736     if (btm_cb.devcb.p_qossu_cmpl_cb)
   2737         return(BTM_BUSY);
   2738 
   2739     if ( (p = btm_bda_to_acl(bd)) != NULL)
   2740     {
   2741         btu_start_timer (&btm_cb.devcb.qossu_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT);
   2742         btm_cb.devcb.p_qossu_cmpl_cb = p_cb;
   2743 
   2744         if (!btsnd_hcic_qos_setup (p->hci_handle, p_flow->qos_flags, p_flow->service_type,
   2745                                    p_flow->token_rate, p_flow->peak_bandwidth,
   2746                                    p_flow->latency,p_flow->delay_variation))
   2747         {
   2748             btm_cb.devcb.p_qossu_cmpl_cb = NULL;
   2749             btu_stop_timer(&btm_cb.devcb.qossu_timer);
   2750             return(BTM_NO_RESOURCES);
   2751         }
   2752         else
   2753             return(BTM_CMD_STARTED);
   2754     }
   2755 
   2756     /* If here, no BD Addr found */
   2757     return(BTM_UNKNOWN_ADDR);
   2758 }
   2759 
   2760 /*******************************************************************************
   2761 **
   2762 ** Function         btm_qos_setup_complete
   2763 **
   2764 ** Description      This function is called when the command complete message
   2765 **                  is received from the HCI for the qos setup request.
   2766 **
   2767 ** Returns          void
   2768 **
   2769 *******************************************************************************/
   2770 void btm_qos_setup_complete (UINT8 status, UINT16 handle, FLOW_SPEC *p_flow)
   2771 {
   2772     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_qossu_cmpl_cb;
   2773     tBTM_QOS_SETUP_CMPL     qossu;
   2774     BTM_TRACE_DEBUG0 ("btm_qos_setup_complete");
   2775     btu_stop_timer (&btm_cb.devcb.qossu_timer);
   2776 
   2777     btm_cb.devcb.p_qossu_cmpl_cb = NULL;
   2778 
   2779     if (p_cb)
   2780     {
   2781         memset(&qossu, 0, sizeof(tBTM_QOS_SETUP_CMPL));
   2782         qossu.status = status;
   2783         qossu.handle = handle;
   2784         if (p_flow != NULL)
   2785         {
   2786             qossu.flow.qos_flags = p_flow->qos_flags;
   2787             qossu.flow.service_type = p_flow->service_type;
   2788             qossu.flow.token_rate = p_flow->token_rate;
   2789             qossu.flow.peak_bandwidth = p_flow->peak_bandwidth;
   2790             qossu.flow.latency = p_flow->latency;
   2791             qossu.flow.delay_variation = p_flow->delay_variation;
   2792         }
   2793         BTM_TRACE_DEBUG1 ("BTM: p_flow->delay_variation: 0x%02x",
   2794                           qossu.flow.delay_variation);
   2795         (*p_cb)(&qossu);
   2796     }
   2797 }
   2798 
   2799 
   2800 /*******************************************************************************
   2801 **
   2802 ** Function         BTM_ReadRSSI
   2803 **
   2804 ** Description      This function is called to read the link policy settings.
   2805 **                  The address of link policy results are returned in the callback.
   2806 **                  (tBTM_RSSI_RESULTS)
   2807 **
   2808 ** Returns          BTM_CMD_STARTED if successfully initiated or error code
   2809 **
   2810 *******************************************************************************/
   2811 tBTM_STATUS BTM_ReadRSSI (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
   2812 {
   2813     tACL_CONN   *p;
   2814 
   2815     BTM_TRACE_API6 ("BTM_ReadRSSI: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2816                     remote_bda[0], remote_bda[1], remote_bda[2],
   2817                     remote_bda[3], remote_bda[4], remote_bda[5]);
   2818 
   2819     /* If someone already waiting on the version, do not allow another */
   2820     if (btm_cb.devcb.p_rssi_cmpl_cb)
   2821         return(BTM_BUSY);
   2822 
   2823     p = btm_bda_to_acl(remote_bda);
   2824     if (p != (tACL_CONN *)NULL)
   2825     {
   2826         btu_start_timer (&btm_cb.devcb.rssi_timer, BTU_TTYPE_BTM_ACL,
   2827                          BTM_DEV_REPLY_TIMEOUT);
   2828 
   2829         btm_cb.devcb.p_rssi_cmpl_cb = p_cb;
   2830 
   2831         if (!btsnd_hcic_read_rssi (p->hci_handle))
   2832         {
   2833             btm_cb.devcb.p_rssi_cmpl_cb = NULL;
   2834             btu_stop_timer (&btm_cb.devcb.rssi_timer);
   2835             return(BTM_NO_RESOURCES);
   2836         }
   2837         else
   2838             return(BTM_CMD_STARTED);
   2839     }
   2840 
   2841     /* If here, no BD Addr found */
   2842     return(BTM_UNKNOWN_ADDR);
   2843 }
   2844 
   2845 /*******************************************************************************
   2846 **
   2847 ** Function         BTM_ReadLinkQuality
   2848 **
   2849 ** Description      This function is called to read the link qulaity.
   2850 **                  The value of the link quality is returned in the callback.
   2851 **                  (tBTM_LINK_QUALITY_RESULTS)
   2852 **
   2853 ** Returns          BTM_CMD_STARTED if successfully initiated or error code
   2854 **
   2855 *******************************************************************************/
   2856 tBTM_STATUS BTM_ReadLinkQuality (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
   2857 {
   2858     tACL_CONN   *p;
   2859 
   2860     BTM_TRACE_API6 ("BTM_ReadLinkQuality: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2861                     remote_bda[0], remote_bda[1], remote_bda[2],
   2862                     remote_bda[3], remote_bda[4], remote_bda[5]);
   2863 
   2864     /* If someone already waiting on the version, do not allow another */
   2865     if (btm_cb.devcb.p_lnk_qual_cmpl_cb)
   2866         return(BTM_BUSY);
   2867 
   2868     p = btm_bda_to_acl(remote_bda);
   2869     if (p != (tACL_CONN *)NULL)
   2870     {
   2871         btu_start_timer (&btm_cb.devcb.lnk_quality_timer, BTU_TTYPE_BTM_ACL,
   2872                          BTM_DEV_REPLY_TIMEOUT);
   2873         btm_cb.devcb.p_lnk_qual_cmpl_cb = p_cb;
   2874 
   2875         if (!btsnd_hcic_get_link_quality (p->hci_handle))
   2876         {
   2877             btu_stop_timer (&btm_cb.devcb.lnk_quality_timer);
   2878             btm_cb.devcb.p_lnk_qual_cmpl_cb = NULL;
   2879             return(BTM_NO_RESOURCES);
   2880         }
   2881         else
   2882             return(BTM_CMD_STARTED);
   2883     }
   2884 
   2885     /* If here, no BD Addr found */
   2886     return(BTM_UNKNOWN_ADDR);
   2887 }
   2888 
   2889 /*******************************************************************************
   2890 **
   2891 ** Function         BTM_ReadTxPower
   2892 **
   2893 ** Description      This function is called to read the current
   2894 **                  TX power of the connection. The tx power level results
   2895 **                  are returned in the callback.
   2896 **                  (tBTM_RSSI_RESULTS)
   2897 **
   2898 ** Returns          BTM_CMD_STARTED if successfully initiated or error code
   2899 **
   2900 *******************************************************************************/
   2901 tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
   2902 {
   2903     tACL_CONN   *p;
   2904     BOOLEAN     ret;
   2905 #define BTM_READ_RSSI_TYPE_CUR  0x00
   2906 #define BTM_READ_RSSI_TYPE_MAX  0X01
   2907 
   2908     BTM_TRACE_API6 ("BTM_ReadTxPower: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2909                     remote_bda[0], remote_bda[1], remote_bda[2],
   2910                     remote_bda[3], remote_bda[4], remote_bda[5]);
   2911 
   2912     /* If someone already waiting on the version, do not allow another */
   2913     if (btm_cb.devcb.p_tx_power_cmpl_cb)
   2914         return(BTM_BUSY);
   2915 
   2916     p = btm_bda_to_acl(remote_bda);
   2917     if (p != (tACL_CONN *)NULL)
   2918     {
   2919         btu_start_timer (&btm_cb.devcb.tx_power_timer, BTU_TTYPE_BTM_ACL,
   2920                          BTM_DEV_REPLY_TIMEOUT);
   2921 
   2922         btm_cb.devcb.p_tx_power_cmpl_cb = p_cb;
   2923 
   2924 #if BLE_INCLUDED == TRUE
   2925         if (p->is_le_link)
   2926         {
   2927             memcpy(btm_cb.devcb.read_tx_pwr_addr, remote_bda, BD_ADDR_LEN);
   2928             ret = btsnd_hcic_ble_read_adv_chnl_tx_power();
   2929         }
   2930         else
   2931 #endif
   2932         {
   2933             ret = btsnd_hcic_read_tx_power (p->hci_handle, BTM_READ_RSSI_TYPE_CUR);
   2934         }
   2935         if (!ret)
   2936         {
   2937             btm_cb.devcb.p_tx_power_cmpl_cb = NULL;
   2938             btu_stop_timer (&btm_cb.devcb.tx_power_timer);
   2939             return(BTM_NO_RESOURCES);
   2940         }
   2941         else
   2942             return(BTM_CMD_STARTED);
   2943     }
   2944 
   2945     /* If here, no BD Addr found */
   2946     return (BTM_UNKNOWN_ADDR);
   2947 }
   2948 /*******************************************************************************
   2949 **
   2950 ** Function         btm_read_tx_power_complete
   2951 **
   2952 ** Description      This function is called when the command complete message
   2953 **                  is received from the HCI for the read tx power request.
   2954 **
   2955 ** Returns          void
   2956 **
   2957 *******************************************************************************/
   2958 void btm_read_tx_power_complete (UINT8 *p, BOOLEAN is_ble)
   2959 {
   2960     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_tx_power_cmpl_cb;
   2961     tBTM_TX_POWER_RESULTS   results;
   2962     UINT16                   handle;
   2963     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
   2964     UINT16                   index;
   2965     BTM_TRACE_DEBUG0 ("btm_read_tx_power_complete");
   2966     btu_stop_timer (&btm_cb.devcb.tx_power_timer);
   2967 
   2968     /* If there was a callback registered for read rssi, call it */
   2969     btm_cb.devcb.p_tx_power_cmpl_cb = NULL;
   2970 
   2971     if (p_cb)
   2972     {
   2973         STREAM_TO_UINT8  (results.hci_status, p);
   2974 
   2975         if (results.hci_status == HCI_SUCCESS)
   2976         {
   2977             results.status = BTM_SUCCESS;
   2978 
   2979             if (!is_ble)
   2980             {
   2981                 STREAM_TO_UINT16 (handle, p);
   2982                 STREAM_TO_UINT8 (results.tx_power, p);
   2983 
   2984                 /* Search through the list of active channels for the correct BD Addr */
   2985                 for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++)
   2986                 {
   2987                     if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle))
   2988                     {
   2989                         memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN);
   2990                         break;
   2991                     }
   2992                 }
   2993             }
   2994 #if BLE_INCLUDED == TRUE
   2995             else
   2996             {
   2997                 STREAM_TO_UINT8 (results.tx_power, p);
   2998                 memcpy(results.rem_bda, btm_cb.devcb.read_tx_pwr_addr, BD_ADDR_LEN);
   2999             }
   3000 #endif
   3001             BTM_TRACE_DEBUG2 ("BTM TX power Complete: tx_power %d, hci status 0x%02x",
   3002                                   results.tx_power, results.hci_status);
   3003         }
   3004         else
   3005             results.status = BTM_ERR_PROCESSING;
   3006 
   3007         (*p_cb)(&results);
   3008     }
   3009 }
   3010 
   3011 /*******************************************************************************
   3012 **
   3013 ** Function         btm_read_rssi_complete
   3014 **
   3015 ** Description      This function is called when the command complete message
   3016 **                  is received from the HCI for the read rssi request.
   3017 **
   3018 ** Returns          void
   3019 **
   3020 *******************************************************************************/
   3021 void btm_read_rssi_complete (UINT8 *p)
   3022 {
   3023     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_rssi_cmpl_cb;
   3024     tBTM_RSSI_RESULTS        results;
   3025     UINT16                   handle;
   3026     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
   3027     UINT16                   index;
   3028     BTM_TRACE_DEBUG0 ("btm_read_rssi_complete");
   3029     btu_stop_timer (&btm_cb.devcb.rssi_timer);
   3030 
   3031     /* If there was a callback registered for read rssi, call it */
   3032     btm_cb.devcb.p_rssi_cmpl_cb = NULL;
   3033 
   3034     if (p_cb)
   3035     {
   3036         STREAM_TO_UINT8  (results.hci_status, p);
   3037 
   3038         if (results.hci_status == HCI_SUCCESS)
   3039         {
   3040             results.status = BTM_SUCCESS;
   3041 
   3042             STREAM_TO_UINT16 (handle, p);
   3043 
   3044             STREAM_TO_UINT8 (results.rssi, p);
   3045             BTM_TRACE_DEBUG2 ("BTM RSSI Complete: rssi %d, hci status 0x%02x",
   3046                               results.rssi, results.hci_status);
   3047 
   3048             /* Search through the list of active channels for the correct BD Addr */
   3049             for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++)
   3050             {
   3051                 if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle))
   3052                 {
   3053                     memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN);
   3054                     break;
   3055                 }
   3056             }
   3057         }
   3058         else
   3059             results.status = BTM_ERR_PROCESSING;
   3060 
   3061         (*p_cb)(&results);
   3062     }
   3063 }
   3064 
   3065 /*******************************************************************************
   3066 **
   3067 ** Function         btm_read_link_quality_complete
   3068 **
   3069 ** Description      This function is called when the command complete message
   3070 **                  is received from the HCI for the read link quality.
   3071 **
   3072 ** Returns          void
   3073 **
   3074 *******************************************************************************/
   3075 void btm_read_link_quality_complete (UINT8 *p)
   3076 {
   3077     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_lnk_qual_cmpl_cb;
   3078     tBTM_LINK_QUALITY_RESULTS results;
   3079     UINT16                   handle;
   3080     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
   3081     UINT16                   index;
   3082     BTM_TRACE_DEBUG0 ("btm_read_link_quality_complete");
   3083     btu_stop_timer (&btm_cb.devcb.lnk_quality_timer);
   3084 
   3085     /* If there was a callback registered for read rssi, call it */
   3086     btm_cb.devcb.p_lnk_qual_cmpl_cb = NULL;
   3087 
   3088     if (p_cb)
   3089     {
   3090         STREAM_TO_UINT8  (results.hci_status, p);
   3091 
   3092         if (results.hci_status == HCI_SUCCESS)
   3093         {
   3094             results.status = BTM_SUCCESS;
   3095 
   3096             STREAM_TO_UINT16 (handle, p);
   3097 
   3098             STREAM_TO_UINT8 (results.link_quality, p);
   3099             BTM_TRACE_DEBUG2 ("BTM Link Quality Complete: Link Quality %d, hci status 0x%02x",
   3100                               results.link_quality, results.hci_status);
   3101 
   3102             /* Search through the list of active channels for the correct BD Addr */
   3103             for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++)
   3104             {
   3105                 if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle))
   3106                 {
   3107                     memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN);
   3108                     break;
   3109                 }
   3110             }
   3111         }
   3112         else
   3113             results.status = BTM_ERR_PROCESSING;
   3114 
   3115         (*p_cb)(&results);
   3116     }
   3117 }
   3118 
   3119 /*******************************************************************************
   3120 **
   3121 ** Function         btm_remove_acl
   3122 **
   3123 ** Description      This function is called to disconnect an ACL connection
   3124 **
   3125 ** Returns          BTM_SUCCESS if successfully initiated, otherwise BTM_NO_RESOURCES.
   3126 **
   3127 *******************************************************************************/
   3128 tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr)
   3129 {
   3130     UINT16  hci_handle = BTM_GetHCIConnHandle(bd_addr);
   3131     tBTM_STATUS status = BTM_SUCCESS;
   3132 
   3133     BTM_TRACE_DEBUG0 ("btm_remove_acl");
   3134 #if BTM_DISC_DURING_RS == TRUE
   3135     tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
   3136 
   3137     /* Role Switch is pending, postpone until completed */
   3138     if (p_dev_rec && (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING))
   3139     {
   3140         p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
   3141     }
   3142     else    /* otherwise can disconnect right away */
   3143 #endif
   3144     {
   3145         if (hci_handle != 0xFFFF)
   3146         {
   3147             if (!btsnd_hcic_disconnect (hci_handle, HCI_ERR_PEER_USER))
   3148                 status = BTM_NO_RESOURCES;
   3149         }
   3150         else
   3151             status = BTM_UNKNOWN_ADDR;
   3152     }
   3153 
   3154     return status;
   3155 }
   3156 
   3157 
   3158 /*******************************************************************************
   3159 **
   3160 ** Function         BTM_SetTraceLevel
   3161 **
   3162 ** Description      This function sets the trace level for BTM.  If called with
   3163 **                  a value of 0xFF, it simply returns the current trace level.
   3164 **
   3165 ** Returns          The new or current trace level
   3166 **
   3167 *******************************************************************************/
   3168 UINT8 BTM_SetTraceLevel (UINT8 new_level)
   3169 {
   3170     BTM_TRACE_DEBUG0 ("BTM_SetTraceLevel");
   3171     if (new_level != 0xFF)
   3172         btm_cb.trace_level = new_level;
   3173 
   3174     return(btm_cb.trace_level);
   3175 }
   3176 
   3177 /*******************************************************************************
   3178 **
   3179 ** Function         btm_cont_rswitch_or_chglinkkey
   3180 **
   3181 ** Description      This function is called to continue processing an active
   3182 **                  role switch or change of link key procedure.  It first
   3183 **                  disables encryption if enabled and EPR is not supported
   3184 **
   3185 ** Returns          void
   3186 **
   3187 *******************************************************************************/
   3188 void btm_cont_rswitch_or_chglinkkey (tACL_CONN *p, tBTM_SEC_DEV_REC *p_dev_rec,
   3189                                      UINT8 hci_status)
   3190 {
   3191     BOOLEAN sw_ok = TRUE;
   3192     BOOLEAN chlk_ok = TRUE;
   3193     BTM_TRACE_DEBUG0 ("btm_cont_rswitch_or_chglinkkey ");
   3194     /* Check to see if encryption needs to be turned off if pending
   3195        change of link key or role switch */
   3196     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE ||
   3197         p->change_key_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   3198     {
   3199         /* Must turn off Encryption first if necessary */
   3200         /* Some devices do not support switch or change of link key while encryption is on */
   3201         if (p_dev_rec != NULL && ((p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) != 0)
   3202             && !BTM_EPR_AVAILABLE(p))
   3203         {
   3204             if (btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE))
   3205             {
   3206                 p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF;
   3207                 if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   3208                     p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF;
   3209 
   3210                 if (p->change_key_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   3211                     p->change_key_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF;
   3212             }
   3213             else
   3214             {
   3215                 /* Error occurred; set states back to Idle */
   3216                 if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   3217                     sw_ok = FALSE;
   3218 
   3219                 if (p->change_key_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   3220                     chlk_ok = FALSE;
   3221             }
   3222         }
   3223         else    /* Encryption not used or EPR supported, continue with switch
   3224                    and/or change of link key */
   3225         {
   3226             if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   3227             {
   3228                 p->switch_role_state = BTM_ACL_SWKEY_STATE_IN_PROGRESS;
   3229 #if BTM_DISC_DURING_RS == TRUE
   3230                 if (p_dev_rec)
   3231                     p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING;
   3232 #endif
   3233                 sw_ok = btsnd_hcic_switch_role (p->remote_addr, (UINT8)!p->link_role);
   3234             }
   3235 
   3236             if (p->change_key_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   3237             {
   3238                 p->switch_role_state = BTM_ACL_SWKEY_STATE_IN_PROGRESS;
   3239                 chlk_ok = btsnd_hcic_change_link_key (p->hci_handle);
   3240             }
   3241         }
   3242 
   3243         if (!sw_ok)
   3244         {
   3245             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
   3246             btm_acl_report_role_change(hci_status, p->remote_addr);
   3247         }
   3248 
   3249         if (!chlk_ok)
   3250         {
   3251             p->change_key_state = BTM_ACL_SWKEY_STATE_IDLE;
   3252             if (btm_cb.devcb.p_chg_link_key_cb)
   3253             {
   3254                 btm_cb.devcb.chg_link_key_ref_data.hci_status = hci_status;
   3255                 (*btm_cb.devcb.p_chg_link_key_cb)(&btm_cb.devcb.chg_link_key_ref_data);
   3256                 btm_cb.devcb.p_chg_link_key_cb = NULL;
   3257             }
   3258         }
   3259     }
   3260 }
   3261 
   3262 /*******************************************************************************
   3263 **
   3264 ** Function         btm_acl_resubmit_page
   3265 **
   3266 ** Description      send pending page request
   3267 **
   3268 *******************************************************************************/
   3269 void btm_acl_resubmit_page (void)
   3270 {
   3271     tBTM_SEC_DEV_REC *p_dev_rec;
   3272     BT_HDR  *p_buf;
   3273     UINT8   *pp;
   3274     BD_ADDR bda;
   3275     BTM_TRACE_DEBUG0 ("btm_acl_resubmit_page");
   3276     /* If there were other page request schedule can start the next one */
   3277     if ((p_buf = (BT_HDR *)GKI_dequeue (&btm_cb.page_queue)) != NULL)
   3278     {
   3279         /* skip 3 (2 bytes opcode and 1 byte len) to get to the bd_addr
   3280          * for both create_conn and rmt_name */
   3281         pp = (UINT8 *)(p_buf + 1) + p_buf->offset + 3;
   3282 
   3283         STREAM_TO_BDADDR (bda, pp);
   3284 
   3285         p_dev_rec = btm_find_or_alloc_dev (bda);
   3286 
   3287         memcpy (btm_cb.connecting_bda, p_dev_rec->bd_addr,   BD_ADDR_LEN);
   3288         memcpy (btm_cb.connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
   3289 
   3290         btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p_buf);
   3291     }
   3292     else
   3293         btm_cb.paging = FALSE;
   3294 }
   3295 
   3296 /*******************************************************************************
   3297 **
   3298 ** Function         btm_acl_reset_paging
   3299 **
   3300 ** Description      set paging to FALSE and free the page queue - called at hci_reset
   3301 **
   3302 *******************************************************************************/
   3303 void  btm_acl_reset_paging (void)
   3304 {
   3305     BT_HDR *p;
   3306     BTM_TRACE_DEBUG0 ("btm_acl_reset_paging");
   3307     /* If we sent reset we are definitely not paging any more */
   3308     while ((p = (BT_HDR *)GKI_dequeue(&btm_cb.page_queue)) != NULL)
   3309         GKI_freebuf (p);
   3310 
   3311     btm_cb.paging = FALSE;
   3312 }
   3313 
   3314 /*******************************************************************************
   3315 **
   3316 ** Function         btm_acl_set_discing
   3317 **
   3318 ** Description      set discing to the given value
   3319 **
   3320 *******************************************************************************/
   3321 void  btm_acl_set_discing (BOOLEAN discing)
   3322 {
   3323     BTM_TRACE_DEBUG0 ("btm_acl_set_discing");
   3324     btm_cb.discing = discing;
   3325 }
   3326 
   3327 /*******************************************************************************
   3328 **
   3329 ** Function         btm_acl_paging
   3330 **
   3331 ** Description      send a paging command or queue it in btm_cb
   3332 **
   3333 *******************************************************************************/
   3334 void  btm_acl_paging (BT_HDR *p, BD_ADDR bda)
   3335 {
   3336     tBTM_SEC_DEV_REC *p_dev_rec;
   3337 
   3338     BTM_TRACE_DEBUG4 ("btm_acl_paging discing:%d, paging:%d BDA: %06x%06x",
   3339                       btm_cb.discing, btm_cb.paging,
   3340                       (bda[0]<<16) + (bda[1]<<8) + bda[2], (bda[3]<<16) + (bda[4] << 8) + bda[5]);
   3341     if (btm_cb.discing)
   3342     {
   3343         btm_cb.paging = TRUE;
   3344         GKI_enqueue (&btm_cb.page_queue, p);
   3345     }
   3346     else
   3347     {
   3348         if (!BTM_ACL_IS_CONNECTED (bda))
   3349         {
   3350             BTM_TRACE_DEBUG2 ("connecting_bda: %06x%06x",
   3351                               (btm_cb.connecting_bda[0]<<16) + (btm_cb.connecting_bda[1]<<8) +
   3352                                btm_cb.connecting_bda[2],
   3353                               (btm_cb.connecting_bda[3]<<16) + (btm_cb.connecting_bda[4] << 8) +
   3354                                btm_cb.connecting_bda[5]);
   3355             if (btm_cb.paging &&
   3356                 memcmp (bda, btm_cb.connecting_bda, BD_ADDR_LEN) != 0)
   3357             {
   3358                 GKI_enqueue (&btm_cb.page_queue, p);
   3359             }
   3360             else
   3361             {
   3362                 p_dev_rec = btm_find_or_alloc_dev (bda);
   3363                 memcpy (btm_cb.connecting_bda, p_dev_rec->bd_addr,   BD_ADDR_LEN);
   3364                 memcpy (btm_cb.connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
   3365 
   3366                 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
   3367             }
   3368 
   3369             btm_cb.paging = TRUE;
   3370         }
   3371         else /* ACL is already up */
   3372         {
   3373             btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
   3374         }
   3375     }
   3376 }
   3377 
   3378 /*******************************************************************************
   3379 **
   3380 ** Function         btm_acl_notif_conn_collision
   3381 **
   3382 ** Description      Send connection collision event to upper layer if registered
   3383 **
   3384 ** Returns          TRUE if sent out to upper layer,
   3385 **                  FALSE if BTM_BUSY_LEVEL_CHANGE_INCLUDED == FALSE, or no one
   3386 **                  needs the notification.
   3387 **
   3388 **          Note: Function only used if BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE
   3389 **
   3390 *******************************************************************************/
   3391 BOOLEAN  btm_acl_notif_conn_collision (BD_ADDR bda)
   3392 {
   3393 #if (BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   3394     tBTM_BL_EVENT_DATA  evt_data;
   3395 
   3396     /* Report possible collision to the upper layer. */
   3397     if (btm_cb.p_bl_changed_cb)
   3398     {
   3399         BTM_TRACE_DEBUG6 ("btm_acl_notif_conn_collision: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   3400                           bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
   3401 
   3402         evt_data.event = BTM_BL_COLLISION_EVT;
   3403         evt_data.conn.p_bda = bda;
   3404         (*btm_cb.p_bl_changed_cb)(&evt_data);
   3405         return TRUE;
   3406     }
   3407     else
   3408         return FALSE;
   3409 #else
   3410     return FALSE;
   3411 #endif
   3412 }
   3413 
   3414 
   3415 /*******************************************************************************
   3416 **
   3417 ** Function         btm_acl_chk_peer_pkt_type_support
   3418 **
   3419 ** Description      Check if peer supports requested packets
   3420 **
   3421 *******************************************************************************/
   3422 void btm_acl_chk_peer_pkt_type_support (tACL_CONN *p, UINT16 *p_pkt_type)
   3423 {
   3424     /* 3 and 5 slot packets? */
   3425     if (!HCI_3_SLOT_PACKETS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   3426         *p_pkt_type &= ~(BTM_ACL_PKT_TYPES_MASK_DH3 +BTM_ACL_PKT_TYPES_MASK_DM3);
   3427 
   3428     if (!HCI_5_SLOT_PACKETS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   3429         *p_pkt_type &= ~(BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5);
   3430 
   3431     /* If HCI version > 2.0, then also check EDR packet types */
   3432     if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
   3433     {
   3434         /* 2 and 3 MPS support? */
   3435         if (!HCI_EDR_ACL_2MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   3436             /* Not supported. Add 'not_supported' mask for all 2MPS packet types */
   3437             *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 +
   3438                                 BTM_ACL_PKT_TYPES_MASK_NO_2_DH5);
   3439 
   3440         if (!HCI_EDR_ACL_3MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   3441             /* Not supported. Add 'not_supported' mask for all 3MPS packet types */
   3442             *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 +
   3443                                 BTM_ACL_PKT_TYPES_MASK_NO_3_DH5);
   3444 
   3445         /* EDR 3 and 5 slot support? */
   3446         if (HCI_EDR_ACL_2MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])
   3447          || HCI_EDR_ACL_3MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   3448         {
   3449             if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   3450                 /* Not supported. Add 'not_supported' mask for all 3-slot EDR packet types */
   3451                 *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3);
   3452 
   3453             if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   3454                 /* Not supported. Add 'not_supported' mask for all 5-slot EDR packet types */
   3455                 *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH5 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH5);
   3456         }
   3457     }
   3458 }
   3459