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 **  Name:          btm_acl.c
     22 **
     23 **  Description:   This file contains functions that handle ACL connections.
     24 **                 This includes operations such as hold and sniff modes,
     25 **                 supported packet types.
     26 **
     27 **                 This module contains both internal and external (API)
     28 **                 functions. External (API) functions are distinguishable
     29 **                 by their names beginning with uppercase BTM.
     30 **
     31 **
     32 ******************************************************************************/
     33 
     34 #include <stdlib.h>
     35 #include <string.h>
     36 #include <stdio.h>
     37 #include <stddef.h>
     38 
     39 #include "bt_types.h"
     40 #include "bt_target.h"
     41 #include "device/include/controller.h"
     42 #include "bt_common.h"
     43 #include "hcimsgs.h"
     44 #include "btu.h"
     45 #include "btm_api.h"
     46 #include "btm_int.h"
     47 #include "l2c_int.h"
     48 #include "hcidefs.h"
     49 #include "bt_utils.h"
     50 
     51 
     52 extern fixed_queue_t *btu_general_alarm_queue;
     53 
     54 static void btm_read_remote_features (UINT16 handle);
     55 static void btm_read_remote_ext_features (UINT16 handle, UINT8 page_number);
     56 static void btm_process_remote_ext_features (tACL_CONN *p_acl_cb, UINT8 num_read_pages);
     57 
     58 /* 3 seconds timeout waiting for responses */
     59 #define BTM_DEV_REPLY_TIMEOUT_MS (3 * 1000)
     60 
     61 /*******************************************************************************
     62 **
     63 ** Function         btm_acl_init
     64 **
     65 ** Description      This function is called at BTM startup to initialize
     66 **
     67 ** Returns          void
     68 **
     69 *******************************************************************************/
     70 void btm_acl_init (void)
     71 {
     72     BTM_TRACE_DEBUG ("btm_acl_init");
     73 #if 0  /* cleared in btm_init; put back in if called from anywhere else! */
     74     memset (&btm_cb.acl_db, 0, sizeof (btm_cb.acl_db));
     75     memset (btm_cb.btm_scn, 0, BTM_MAX_SCN);          /* Initialize the SCN usage to FALSE */
     76     btm_cb.btm_def_link_policy     = 0;
     77     btm_cb.p_bl_changed_cb         = NULL;
     78 #endif
     79 
     80     /* Initialize nonzero defaults */
     81     btm_cb.btm_def_link_super_tout = HCI_DEFAULT_INACT_TOUT;
     82     btm_cb.acl_disc_reason         = 0xff ;
     83 }
     84 
     85 /*******************************************************************************
     86 **
     87 ** Function         btm_bda_to_acl
     88 **
     89 ** Description      This function returns the FIRST acl_db entry for the passed BDA.
     90 **
     91 ** Parameters      bda : BD address of the remote device
     92 **                 transport : Physical transport used for ACL connection (BR/EDR or LE)
     93 **
     94 ** Returns          Returns pointer to the ACL DB for the requested BDA if found.
     95 **                  NULL if not found.
     96 **
     97 *******************************************************************************/
     98 tACL_CONN *btm_bda_to_acl (BD_ADDR bda, tBT_TRANSPORT transport)
     99 {
    100     tACL_CONN   *p = &btm_cb.acl_db[0];
    101     UINT16       xx;
    102     if (bda)
    103     {
    104         for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
    105         {
    106             if ((p->in_use) && (!memcmp (p->remote_addr, bda, BD_ADDR_LEN))
    107 #if BLE_INCLUDED == TRUE
    108                 && p->transport == transport
    109 #endif
    110                 )
    111             {
    112                 BTM_TRACE_DEBUG ("btm_bda_to_acl found");
    113                 return(p);
    114             }
    115         }
    116     }
    117 
    118     /* If here, no BD Addr found */
    119     return((tACL_CONN *)NULL);
    120 }
    121 
    122 /*******************************************************************************
    123 **
    124 ** Function         btm_handle_to_acl_index
    125 **
    126 ** Description      This function returns the FIRST acl_db entry for the passed hci_handle.
    127 **
    128 ** Returns          index to the acl_db or MAX_L2CAP_LINKS.
    129 **
    130 *******************************************************************************/
    131 UINT8 btm_handle_to_acl_index (UINT16 hci_handle)
    132 {
    133     tACL_CONN   *p = &btm_cb.acl_db[0];
    134     UINT8       xx;
    135     BTM_TRACE_DEBUG ("btm_handle_to_acl_index");
    136     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
    137     {
    138         if ((p->in_use) && (p->hci_handle == hci_handle))
    139         {
    140             break;
    141         }
    142     }
    143 
    144     /* If here, no BD Addr found */
    145     return(xx);
    146 }
    147 
    148 #if BLE_PRIVACY_SPT == TRUE
    149 /*******************************************************************************
    150 **
    151 ** Function         btm_ble_get_acl_remote_addr
    152 **
    153 ** Description      This function reads the active remote address used for the
    154 **                  connection.
    155 **
    156 ** Returns          success return TRUE, otherwise FALSE.
    157 **
    158 *******************************************************************************/
    159 BOOLEAN btm_ble_get_acl_remote_addr(tBTM_SEC_DEV_REC *p_dev_rec, BD_ADDR conn_addr,
    160                                     tBLE_ADDR_TYPE *p_addr_type)
    161 {
    162 #if BLE_INCLUDED == TRUE
    163     BOOLEAN         st = TRUE;
    164 
    165     if (p_dev_rec == NULL)
    166     {
    167         BTM_TRACE_ERROR("btm_ble_get_acl_remote_addr can not find device with matching address");
    168         return FALSE;
    169     }
    170 
    171     switch (p_dev_rec->ble.active_addr_type)
    172     {
    173     case BTM_BLE_ADDR_PSEUDO:
    174         memcpy(conn_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
    175         * p_addr_type = p_dev_rec->ble.ble_addr_type;
    176         break;
    177 
    178     case BTM_BLE_ADDR_RRA:
    179         memcpy(conn_addr, p_dev_rec->ble.cur_rand_addr, BD_ADDR_LEN);
    180         * p_addr_type = BLE_ADDR_RANDOM;
    181         break;
    182 
    183     case BTM_BLE_ADDR_STATIC:
    184         memcpy(conn_addr, p_dev_rec->ble.static_addr, BD_ADDR_LEN);
    185         * p_addr_type = p_dev_rec->ble.static_addr_type;
    186         break;
    187 
    188     default:
    189         BTM_TRACE_ERROR("Unknown active address: %d", p_dev_rec->ble.active_addr_type);
    190         st = FALSE;
    191         break;
    192     }
    193 
    194     return st;
    195 #else
    196     UNUSED(p_dev_rec);
    197     UNUSED(conn_addr);
    198     UNUSED(p_addr_type);
    199     return FALSE;
    200 #endif
    201 }
    202 #endif
    203 /*******************************************************************************
    204 **
    205 ** Function         btm_acl_created
    206 **
    207 ** Description      This function is called by L2CAP when an ACL connection
    208 **                  is created.
    209 **
    210 ** Returns          void
    211 **
    212 *******************************************************************************/
    213 void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
    214                       UINT16 hci_handle, UINT8 link_role, tBT_TRANSPORT transport)
    215 {
    216     tBTM_SEC_DEV_REC *p_dev_rec = NULL;
    217     tACL_CONN        *p;
    218     UINT8             xx;
    219 
    220     BTM_TRACE_DEBUG ("btm_acl_created hci_handle=%d link_role=%d  transport=%d",
    221                       hci_handle,link_role, transport);
    222     /* Ensure we don't have duplicates */
    223     p = btm_bda_to_acl(bda, transport);
    224     if (p != (tACL_CONN *)NULL)
    225     {
    226         p->hci_handle = hci_handle;
    227         p->link_role  = link_role;
    228 #if BLE_INCLUDED == TRUE
    229         p->transport = transport;
    230 #endif
    231         BTM_TRACE_DEBUG ("Duplicate btm_acl_created: RemBdAddr: %02x%02x%02x%02x%02x%02x",
    232                           bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
    233         BTM_SetLinkPolicy(p->remote_addr, &btm_cb.btm_def_link_policy);
    234         return;
    235     }
    236 
    237     /* Allocate acl_db entry */
    238     for (xx = 0, p = &btm_cb.acl_db[0]; xx < MAX_L2CAP_LINKS; xx++, p++)
    239     {
    240         if (!p->in_use)
    241         {
    242             p->in_use            = TRUE;
    243             p->hci_handle        = hci_handle;
    244             p->link_role         = link_role;
    245             p->link_up_issued    = FALSE;
    246             memcpy (p->remote_addr, bda, BD_ADDR_LEN);
    247 
    248 #if BLE_INCLUDED == TRUE
    249             p->transport = transport;
    250 #if BLE_PRIVACY_SPT == TRUE
    251             if (transport == BT_TRANSPORT_LE)
    252                 btm_ble_refresh_local_resolvable_private_addr(bda,
    253                                                     btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr);
    254 #else
    255             p->conn_addr_type = BLE_ADDR_PUBLIC;
    256             memcpy(p->conn_addr, &controller_get_interface()->get_address()->address, BD_ADDR_LEN);
    257 
    258 #endif
    259 #endif
    260             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
    261 
    262             btm_pm_sm_alloc(xx);
    263 
    264 
    265             if (dc)
    266                 memcpy (p->remote_dc, dc, DEV_CLASS_LEN);
    267 
    268             if (bdn)
    269                 memcpy (p->remote_name, bdn, BTM_MAX_REM_BD_NAME_LEN);
    270 
    271             /* if BR/EDR do something more */
    272             if (transport == BT_TRANSPORT_BR_EDR)
    273             {
    274                 btsnd_hcic_read_rmt_clk_offset (p->hci_handle);
    275                 btsnd_hcic_rmt_ver_req (p->hci_handle);
    276             }
    277             p_dev_rec = btm_find_dev_by_handle (hci_handle);
    278 
    279 #if (BLE_INCLUDED == TRUE)
    280             if (p_dev_rec )
    281             {
    282                 BTM_TRACE_DEBUG ("device_type=0x%x", p_dev_rec->device_type);
    283             }
    284 #endif
    285 
    286             if (p_dev_rec && !(transport == BT_TRANSPORT_LE))
    287             {
    288                 /* If remote features already known, copy them and continue connection setup */
    289                 if ((p_dev_rec->num_read_pages) &&
    290                     (p_dev_rec->num_read_pages <= (HCI_EXT_FEATURES_PAGE_MAX + 1)))
    291                 {
    292                     memcpy (p->peer_lmp_features, p_dev_rec->features,
    293                         (HCI_FEATURE_BYTES_PER_PAGE * p_dev_rec->num_read_pages));
    294                     p->num_read_pages = p_dev_rec->num_read_pages;
    295 
    296                     const UINT8 req_pend = (p_dev_rec->sm4 & BTM_SM4_REQ_PEND);
    297 
    298                     /* Store the Peer Security Capabilites (in SM4 and rmt_sec_caps) */
    299                     btm_sec_set_peer_sec_caps(p, p_dev_rec);
    300 
    301                     BTM_TRACE_API("%s: pend:%d", __FUNCTION__, req_pend);
    302                     if (req_pend)
    303                     {
    304                         /* Request for remaining Security Features (if any) */
    305                         l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
    306                     }
    307                     btm_establish_continue (p);
    308                     return;
    309                 }
    310             }
    311 
    312 #if (BLE_INCLUDED == TRUE)
    313             /* If here, features are not known yet */
    314             if (p_dev_rec && transport == BT_TRANSPORT_LE)
    315             {
    316 #if BLE_PRIVACY_SPT == TRUE
    317                 btm_ble_get_acl_remote_addr (p_dev_rec, p->active_remote_addr,
    318                     &p->active_remote_addr_type);
    319 #endif
    320 
    321                 if (HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(controller_get_interface()->get_features_ble()->as_array)
    322                     || link_role == HCI_ROLE_MASTER)
    323                 {
    324                     btsnd_hcic_ble_read_remote_feat(p->hci_handle);
    325                 }
    326                 else
    327                 {
    328                     btm_establish_continue(p);
    329                 }
    330             }
    331             else
    332 #endif
    333             {
    334                 btm_read_remote_features (p->hci_handle);
    335             }
    336 
    337             /* read page 1 - on rmt feature event for buffer reasons */
    338             return;
    339         }
    340     }
    341 }
    342 
    343 
    344 /*******************************************************************************
    345 **
    346 ** Function         btm_acl_report_role_change
    347 **
    348 ** Description      This function is called when the local device is deemed
    349 **                  to be down. It notifies L2CAP of the failure.
    350 **
    351 ** Returns          void
    352 **
    353 *******************************************************************************/
    354 void btm_acl_report_role_change (UINT8 hci_status, BD_ADDR bda)
    355 {
    356     tBTM_ROLE_SWITCH_CMPL   ref_data;
    357     BTM_TRACE_DEBUG ("btm_acl_report_role_change");
    358     if (btm_cb.devcb.p_switch_role_cb
    359         && (bda && (0 == memcmp(btm_cb.devcb.switch_role_ref_data.remote_bd_addr, bda, BD_ADDR_LEN))))
    360     {
    361         memcpy (&ref_data, &btm_cb.devcb.switch_role_ref_data, sizeof(tBTM_ROLE_SWITCH_CMPL));
    362         ref_data.hci_status = hci_status;
    363         (*btm_cb.devcb.p_switch_role_cb)(&ref_data);
    364         memset (&btm_cb.devcb.switch_role_ref_data, 0, sizeof(tBTM_ROLE_SWITCH_CMPL));
    365         btm_cb.devcb.p_switch_role_cb = NULL;
    366     }
    367 }
    368 
    369 /*******************************************************************************
    370 **
    371 ** Function         btm_acl_removed
    372 **
    373 ** Description      This function is called by L2CAP when an ACL connection
    374 **                  is removed. Since only L2CAP creates ACL links, we use
    375 **                  the L2CAP link index as our index into the control blocks.
    376 **
    377 ** Returns          void
    378 **
    379 *******************************************************************************/
    380 void btm_acl_removed (BD_ADDR bda, tBT_TRANSPORT transport)
    381 {
    382     tACL_CONN   *p;
    383     tBTM_BL_EVENT_DATA  evt_data;
    384 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
    385     tBTM_SEC_DEV_REC *p_dev_rec=NULL;
    386 #endif
    387     BTM_TRACE_DEBUG ("btm_acl_removed");
    388     p = btm_bda_to_acl(bda, transport);
    389     if (p != (tACL_CONN *)NULL)
    390     {
    391         p->in_use = FALSE;
    392 
    393         /* if the disconnected channel has a pending role switch, clear it now */
    394         btm_acl_report_role_change(HCI_ERR_NO_CONNECTION, bda);
    395 
    396         /* Only notify if link up has had a chance to be issued */
    397         if (p->link_up_issued)
    398         {
    399             p->link_up_issued = FALSE;
    400 
    401             /* If anyone cares, tell him database changed */
    402             if (btm_cb.p_bl_changed_cb)
    403             {
    404                 evt_data.event = BTM_BL_DISCN_EVT;
    405                 evt_data.discn.p_bda = bda;
    406 #if BLE_INCLUDED == TRUE
    407                 evt_data.discn.handle = p->hci_handle;
    408                 evt_data.discn.transport = p->transport;
    409 #endif
    410                 (*btm_cb.p_bl_changed_cb)(&evt_data);
    411             }
    412 
    413             btm_acl_update_busy_level (BTM_BLI_ACL_DOWN_EVT);
    414         }
    415 
    416 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
    417 
    418         BTM_TRACE_DEBUG ("acl hci_handle=%d transport=%d connectable_mode=0x%0x link_role=%d",
    419                           p->hci_handle,
    420                           p->transport,
    421                           btm_cb.ble_ctr_cb.inq_var.connectable_mode,
    422                           p->link_role);
    423 
    424         p_dev_rec = btm_find_dev(bda);
    425         if ( p_dev_rec)
    426         {
    427             BTM_TRACE_DEBUG("before update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
    428             if (p->transport == BT_TRANSPORT_LE)
    429             {
    430                 BTM_TRACE_DEBUG("LE link down");
    431                 p_dev_rec->sec_flags &= ~(BTM_SEC_LE_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
    432                 if ( (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) == 0)
    433                 {
    434                     BTM_TRACE_DEBUG("Not Bonded");
    435                     p_dev_rec->sec_flags &= ~(BTM_SEC_LE_LINK_KEY_AUTHED | BTM_SEC_LE_AUTHENTICATED);
    436                 }
    437                 else
    438                 {
    439                     BTM_TRACE_DEBUG("Bonded");
    440                 }
    441             }
    442             else
    443             {
    444                 BTM_TRACE_DEBUG("Bletooth link down");
    445                 p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED
    446                                         | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
    447             }
    448             BTM_TRACE_DEBUG("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
    449         }
    450         else
    451         {
    452             BTM_TRACE_ERROR("Device not found");
    453 
    454         }
    455 #endif
    456 
    457         /* Clear the ACL connection data */
    458         memset(p, 0, sizeof(tACL_CONN));
    459     }
    460 }
    461 
    462 
    463 /*******************************************************************************
    464 **
    465 ** Function         btm_acl_device_down
    466 **
    467 ** Description      This function is called when the local device is deemed
    468 **                  to be down. It notifies L2CAP of the failure.
    469 **
    470 ** Returns          void
    471 **
    472 *******************************************************************************/
    473 void btm_acl_device_down (void)
    474 {
    475     tACL_CONN   *p = &btm_cb.acl_db[0];
    476     UINT16      xx;
    477     BTM_TRACE_DEBUG ("btm_acl_device_down");
    478     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
    479     {
    480         if (p->in_use)
    481         {
    482             BTM_TRACE_DEBUG ("hci_handle=%d HCI_ERR_HW_FAILURE ",p->hci_handle );
    483             l2c_link_hci_disc_comp (p->hci_handle, HCI_ERR_HW_FAILURE);
    484         }
    485     }
    486 }
    487 
    488 /*******************************************************************************
    489 **
    490 ** Function         btm_acl_update_busy_level
    491 **
    492 ** Description      This function is called to update the busy level of the system
    493 **                  .
    494 **
    495 ** Returns          void
    496 **
    497 *******************************************************************************/
    498 void btm_acl_update_busy_level (tBTM_BLI_EVENT event)
    499 {
    500     tBTM_BL_UPDATE_DATA  evt;
    501     UINT8 busy_level;
    502     BTM_TRACE_DEBUG ("btm_acl_update_busy_level");
    503     BOOLEAN old_inquiry_state = btm_cb.is_inquiry;
    504     switch (event)
    505     {
    506         case BTM_BLI_ACL_UP_EVT:
    507             BTM_TRACE_DEBUG ("BTM_BLI_ACL_UP_EVT");
    508             break;
    509         case BTM_BLI_ACL_DOWN_EVT:
    510             BTM_TRACE_DEBUG ("BTM_BLI_ACL_DOWN_EVT");
    511             break;
    512         case BTM_BLI_PAGE_EVT:
    513             BTM_TRACE_DEBUG ("BTM_BLI_PAGE_EVT");
    514             btm_cb.is_paging = TRUE;
    515             evt.busy_level_flags= BTM_BL_PAGING_STARTED;
    516             break;
    517         case BTM_BLI_PAGE_DONE_EVT:
    518             BTM_TRACE_DEBUG ("BTM_BLI_PAGE_DONE_EVT");
    519             btm_cb.is_paging = FALSE;
    520             evt.busy_level_flags = BTM_BL_PAGING_COMPLETE;
    521             break;
    522         case BTM_BLI_INQ_EVT:
    523             BTM_TRACE_DEBUG ("BTM_BLI_INQ_EVT");
    524             btm_cb.is_inquiry = TRUE;
    525             evt.busy_level_flags = BTM_BL_INQUIRY_STARTED;
    526             break;
    527         case BTM_BLI_INQ_CANCEL_EVT:
    528             BTM_TRACE_DEBUG ("BTM_BLI_INQ_CANCEL_EVT");
    529             btm_cb.is_inquiry = FALSE;
    530             evt.busy_level_flags = BTM_BL_INQUIRY_CANCELLED;
    531             break;
    532         case BTM_BLI_INQ_DONE_EVT:
    533             BTM_TRACE_DEBUG ("BTM_BLI_INQ_DONE_EVT");
    534             btm_cb.is_inquiry = FALSE;
    535             evt.busy_level_flags = BTM_BL_INQUIRY_COMPLETE;
    536             break;
    537     }
    538 
    539     if (btm_cb.is_paging || btm_cb.is_inquiry)
    540         busy_level = 10;
    541     else
    542         busy_level = BTM_GetNumAclLinks();
    543 
    544     if ((busy_level != btm_cb.busy_level) ||(old_inquiry_state != btm_cb.is_inquiry))
    545     {
    546         evt.event         = BTM_BL_UPDATE_EVT;
    547         evt.busy_level    = busy_level;
    548         btm_cb.busy_level = busy_level;
    549         if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_UPDATE_MASK))
    550         {
    551             (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
    552         }
    553     }
    554 }
    555 
    556 /*******************************************************************************
    557 **
    558 ** Function         BTM_GetRole
    559 **
    560 ** Description      This function is called to get the role of the local device
    561 **                  for the ACL connection with the specified remote device
    562 **
    563 ** Returns          BTM_SUCCESS if connection exists.
    564 **                  BTM_UNKNOWN_ADDR if no active link with bd addr specified
    565 **
    566 *******************************************************************************/
    567 tBTM_STATUS BTM_GetRole (BD_ADDR remote_bd_addr, UINT8 *p_role)
    568 {
    569     tACL_CONN   *p;
    570     BTM_TRACE_DEBUG ("BTM_GetRole");
    571     if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
    572     {
    573         *p_role = BTM_ROLE_UNDEFINED;
    574         return(BTM_UNKNOWN_ADDR);
    575     }
    576 
    577     /* Get the current role */
    578     *p_role = p->link_role;
    579     return(BTM_SUCCESS);
    580 }
    581 
    582 
    583 /*******************************************************************************
    584 **
    585 ** Function         BTM_SwitchRole
    586 **
    587 ** Description      This function is called to switch role between master and
    588 **                  slave.  If role is already set it will do nothing.  If the
    589 **                  command was initiated, the callback function is called upon
    590 **                  completion.
    591 **
    592 ** Returns          BTM_SUCCESS if already in specified role.
    593 **                  BTM_CMD_STARTED if command issued to controller.
    594 **                  BTM_NO_RESOURCES if couldn't allocate memory to issue command
    595 **                  BTM_UNKNOWN_ADDR if no active link with bd addr specified
    596 **                  BTM_MODE_UNSUPPORTED if local device does not support role switching
    597 **                  BTM_BUSY if the previous command is not completed
    598 **
    599 *******************************************************************************/
    600 tBTM_STATUS BTM_SwitchRole (BD_ADDR remote_bd_addr, UINT8 new_role, tBTM_CMPL_CB *p_cb)
    601 {
    602     tACL_CONN   *p;
    603     tBTM_SEC_DEV_REC  *p_dev_rec = NULL;
    604 #if BTM_SCO_INCLUDED == TRUE
    605     BOOLEAN    is_sco_active;
    606 #endif
    607     tBTM_STATUS  status;
    608     tBTM_PM_MODE pwr_mode;
    609     tBTM_PM_PWR_MD settings;
    610 #if (BT_USE_TRACES == TRUE)
    611     BD_ADDR_PTR  p_bda;
    612 #endif
    613     BTM_TRACE_API ("BTM_SwitchRole BDA: %02x-%02x-%02x-%02x-%02x-%02x",
    614                     remote_bd_addr[0], remote_bd_addr[1], remote_bd_addr[2],
    615                     remote_bd_addr[3], remote_bd_addr[4], remote_bd_addr[5]);
    616 
    617     /* Make sure the local device supports switching */
    618     if (!controller_get_interface()->supports_master_slave_role_switch())
    619         return(BTM_MODE_UNSUPPORTED);
    620 
    621     if (btm_cb.devcb.p_switch_role_cb && p_cb)
    622     {
    623 #if (BT_USE_TRACES == TRUE)
    624         p_bda = btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
    625         BTM_TRACE_DEBUG ("Role switch on other device is in progress 0x%02x%02x%02x%02x%02x%02x",
    626                           p_bda[0], p_bda[1], p_bda[2],
    627                           p_bda[3], p_bda[4], p_bda[5]);
    628 #endif
    629         return(BTM_BUSY);
    630     }
    631 
    632     if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
    633         return(BTM_UNKNOWN_ADDR);
    634 
    635     /* Finished if already in desired role */
    636     if (p->link_role == new_role)
    637         return(BTM_SUCCESS);
    638 
    639 #if BTM_SCO_INCLUDED == TRUE
    640     /* Check if there is any SCO Active on this BD Address */
    641     is_sco_active = btm_is_sco_active_by_bdaddr(remote_bd_addr);
    642 
    643     if (is_sco_active == TRUE)
    644         return(BTM_NO_RESOURCES);
    645 #endif
    646 
    647     /* Ignore role switch request if the previous request was not completed */
    648     if (p->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE)
    649     {
    650         BTM_TRACE_DEBUG ("BTM_SwitchRole busy: %d",
    651                           p->switch_role_state);
    652         return(BTM_BUSY);
    653     }
    654 
    655     if ((status = BTM_ReadPowerMode(p->remote_addr, &pwr_mode)) != BTM_SUCCESS)
    656         return(status);
    657 
    658     /* Wake up the link if in sniff or park before attempting switch */
    659     if (pwr_mode == BTM_PM_MD_PARK || pwr_mode == BTM_PM_MD_SNIFF)
    660     {
    661         memset( (void*)&settings, 0, sizeof(settings));
    662         settings.mode = BTM_PM_MD_ACTIVE;
    663         status = BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p->remote_addr, &settings);
    664         if (status != BTM_CMD_STARTED)
    665             return(BTM_WRONG_MODE);
    666 
    667         p->switch_role_state = BTM_ACL_SWKEY_STATE_MODE_CHANGE;
    668     }
    669     /* some devices do not support switch while encryption is on */
    670     else
    671     {
    672         p_dev_rec = btm_find_dev (remote_bd_addr);
    673         if ((p_dev_rec != NULL)
    674             && ((p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) != 0)
    675             && !BTM_EPR_AVAILABLE(p))
    676         {
    677             /* bypass turning off encryption if change link key is already doing it */
    678             if (p->encrypt_state != BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF)
    679             {
    680                 if (!btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE))
    681                     return(BTM_NO_RESOURCES);
    682                 else
    683                     p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF;
    684             }
    685 
    686             p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF;
    687         }
    688         else
    689         {
    690             if (!btsnd_hcic_switch_role (remote_bd_addr, new_role))
    691                 return(BTM_NO_RESOURCES);
    692 
    693             p->switch_role_state = BTM_ACL_SWKEY_STATE_IN_PROGRESS;
    694 
    695 #if BTM_DISC_DURING_RS == TRUE
    696             if (p_dev_rec)
    697                 p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING;
    698 #endif
    699         }
    700     }
    701 
    702     /* Initialize return structure in case request fails */
    703     if (p_cb)
    704     {
    705         memcpy (btm_cb.devcb.switch_role_ref_data.remote_bd_addr, remote_bd_addr,
    706                 BD_ADDR_LEN);
    707         btm_cb.devcb.switch_role_ref_data.role = new_role;
    708         /* initialized to an error code */
    709         btm_cb.devcb.switch_role_ref_data.hci_status = HCI_ERR_UNSUPPORTED_VALUE;
    710         btm_cb.devcb.p_switch_role_cb = p_cb;
    711     }
    712     return(BTM_CMD_STARTED);
    713 }
    714 
    715 /*******************************************************************************
    716 **
    717 ** Function         btm_acl_encrypt_change
    718 **
    719 ** Description      This function is when encryption of the connection is
    720 **                  completed by the LM.  Checks to see if a role switch or
    721 **                  change of link key was active and initiates or continues
    722 **                  process if needed.
    723 **
    724 ** Returns          void
    725 **
    726 *******************************************************************************/
    727 void btm_acl_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable)
    728 {
    729     tACL_CONN *p;
    730     UINT8     xx;
    731     tBTM_SEC_DEV_REC  *p_dev_rec;
    732     tBTM_BL_ROLE_CHG_DATA   evt;
    733 
    734     BTM_TRACE_DEBUG ("btm_acl_encrypt_change handle=%d status=%d encr_enabl=%d",
    735                       handle, status, encr_enable);
    736     xx = btm_handle_to_acl_index(handle);
    737     /* don't assume that we can never get a bad hci_handle */
    738     if (xx < MAX_L2CAP_LINKS)
    739         p = &btm_cb.acl_db[xx];
    740     else
    741         return;
    742 
    743     /* Process Role Switch if active */
    744     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF)
    745     {
    746         /* if encryption turn off failed we still will try to switch role */
    747         if (encr_enable)
    748         {
    749             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
    750             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
    751         }
    752         else
    753         {
    754             p->switch_role_state = BTM_ACL_SWKEY_STATE_SWITCHING;
    755             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_TEMP_FUNC;
    756         }
    757 
    758         if (!btsnd_hcic_switch_role (p->remote_addr, (UINT8)!p->link_role))
    759         {
    760             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
    761             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
    762             btm_acl_report_role_change(btm_cb.devcb.switch_role_ref_data.hci_status, p->remote_addr);
    763         }
    764 #if BTM_DISC_DURING_RS == TRUE
    765         else
    766         {
    767             if ((p_dev_rec = btm_find_dev (p->remote_addr)) != NULL)
    768                 p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING;
    769         }
    770 #endif
    771 
    772     }
    773     /* Finished enabling Encryption after role switch */
    774     else if (p->switch_role_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_ON)
    775     {
    776         p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
    777         p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
    778         btm_acl_report_role_change(btm_cb.devcb.switch_role_ref_data.hci_status, p->remote_addr);
    779 
    780         /* if role change event is registered, report it now */
    781         if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK))
    782         {
    783             evt.event       = BTM_BL_ROLE_CHG_EVT;
    784             evt.new_role    = btm_cb.devcb.switch_role_ref_data.role;
    785             evt.p_bda       = btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
    786             evt.hci_status  = btm_cb.devcb.switch_role_ref_data.hci_status;
    787             (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
    788 
    789             BTM_TRACE_DEBUG("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
    790                              evt.new_role, evt.hci_status, p->switch_role_state);
    791         }
    792 
    793 #if BTM_DISC_DURING_RS == TRUE
    794         /* If a disconnect is pending, issue it now that role switch has completed */
    795         if ((p_dev_rec = btm_find_dev (p->remote_addr)) != NULL)
    796         {
    797             if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING)
    798             {
    799                 BTM_TRACE_WARNING("btm_acl_encrypt_change -> Issuing delayed HCI_Disconnect!!!");
    800                 btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER);
    801             }
    802             BTM_TRACE_ERROR("btm_acl_encrypt_change: tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
    803                             PTR_TO_UINT(p_dev_rec), p_dev_rec->rs_disc_pending);
    804             p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
    805         }
    806 #endif
    807     }
    808 }
    809 /*******************************************************************************
    810 **
    811 ** Function         BTM_SetLinkPolicy
    812 **
    813 ** Description      Create and send HCI "Write Policy Set" command
    814 **
    815 ** Returns          status of the operation
    816 **
    817 *******************************************************************************/
    818 tBTM_STATUS BTM_SetLinkPolicy (BD_ADDR remote_bda, UINT16 *settings)
    819 {
    820     tACL_CONN   *p;
    821     UINT8       *localFeatures = BTM_ReadLocalFeatures();
    822     BTM_TRACE_DEBUG ("BTM_SetLinkPolicy");
    823 /*    BTM_TRACE_API ("BTM_SetLinkPolicy: requested settings: 0x%04x", *settings ); */
    824 
    825     /* First, check if hold mode is supported */
    826     if (*settings != HCI_DISABLE_ALL_LM_MODES)
    827     {
    828         if ( (*settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)) )
    829         {
    830             *settings &= (~HCI_ENABLE_MASTER_SLAVE_SWITCH);
    831             BTM_TRACE_API ("BTM_SetLinkPolicy switch not supported (settings: 0x%04x)", *settings );
    832         }
    833         if ( (*settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)) )
    834         {
    835             *settings &= (~HCI_ENABLE_HOLD_MODE);
    836             BTM_TRACE_API ("BTM_SetLinkPolicy hold not supported (settings: 0x%04x)", *settings );
    837         }
    838         if ( (*settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)) )
    839         {
    840             *settings &= (~HCI_ENABLE_SNIFF_MODE);
    841             BTM_TRACE_API ("BTM_SetLinkPolicy sniff not supported (settings: 0x%04x)", *settings );
    842         }
    843         if ( (*settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)) )
    844         {
    845             *settings &= (~HCI_ENABLE_PARK_MODE);
    846             BTM_TRACE_API ("BTM_SetLinkPolicy park not supported (settings: 0x%04x)", *settings );
    847         }
    848     }
    849 
    850     if ((p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL)
    851         return(btsnd_hcic_write_policy_set (p->hci_handle, *settings) ? BTM_CMD_STARTED : BTM_NO_RESOURCES);
    852 
    853     /* If here, no BD Addr found */
    854     return(BTM_UNKNOWN_ADDR);
    855 }
    856 
    857 /*******************************************************************************
    858 **
    859 ** Function         BTM_SetDefaultLinkPolicy
    860 **
    861 ** Description      Set the default value for HCI "Write Policy Set" command
    862 **                  to use when an ACL link is created.
    863 **
    864 ** Returns          void
    865 **
    866 *******************************************************************************/
    867 void BTM_SetDefaultLinkPolicy (UINT16 settings)
    868 {
    869     UINT8 *localFeatures = BTM_ReadLocalFeatures();
    870 
    871     BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy setting:0x%04x", settings);
    872 
    873     if((settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)))
    874     {
    875         settings &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
    876         BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy switch not supported (settings: 0x%04x)", settings);
    877     }
    878     if ((settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)))
    879     {
    880         settings &= ~HCI_ENABLE_HOLD_MODE;
    881         BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy hold not supported (settings: 0x%04x)", settings);
    882     }
    883     if ((settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)))
    884     {
    885         settings &= ~HCI_ENABLE_SNIFF_MODE;
    886         BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy sniff not supported (settings: 0x%04x)", settings);
    887     }
    888     if ((settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)))
    889     {
    890         settings &= ~HCI_ENABLE_PARK_MODE;
    891         BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy park not supported (settings: 0x%04x)", settings);
    892     }
    893     BTM_TRACE_DEBUG("Set DefaultLinkPolicy:0x%04x", settings);
    894 
    895     btm_cb.btm_def_link_policy = settings;
    896 
    897     /* Set the default Link Policy of the controller */
    898     btsnd_hcic_write_def_policy_set(settings);
    899 }
    900 
    901 /*******************************************************************************
    902 **
    903 ** Function         btm_read_remote_version_complete
    904 **
    905 ** Description      This function is called when the command complete message
    906 **                  is received from the HCI for the remote version info.
    907 **
    908 ** Returns          void
    909 **
    910 *******************************************************************************/
    911 void btm_read_remote_version_complete (UINT8 *p)
    912 {
    913     tACL_CONN        *p_acl_cb = &btm_cb.acl_db[0];
    914     UINT8             status;
    915     UINT16            handle;
    916     int               xx;
    917     BTM_TRACE_DEBUG ("btm_read_remote_version_complete");
    918 
    919     STREAM_TO_UINT8  (status, p);
    920     STREAM_TO_UINT16 (handle, p);
    921 
    922     /* Look up the connection by handle and copy features */
    923     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
    924     {
    925         if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
    926         {
    927             if (status == HCI_SUCCESS)
    928             {
    929                 STREAM_TO_UINT8  (p_acl_cb->lmp_version, p);
    930                 STREAM_TO_UINT16 (p_acl_cb->manufacturer, p);
    931                 STREAM_TO_UINT16 (p_acl_cb->lmp_subversion, p);
    932             }
    933 
    934 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
    935             if (p_acl_cb->transport == BT_TRANSPORT_LE)
    936                 l2cble_notify_le_connection (p_acl_cb->remote_addr);
    937 #endif  // (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
    938             break;
    939         }
    940     }
    941 }
    942 
    943 
    944 /*******************************************************************************
    945 **
    946 ** Function         btm_process_remote_ext_features
    947 **
    948 ** Description      Local function called to process all extended features pages
    949 **                  read from a remote device.
    950 **
    951 ** Returns          void
    952 **
    953 *******************************************************************************/
    954 void btm_process_remote_ext_features (tACL_CONN *p_acl_cb, UINT8 num_read_pages)
    955 {
    956     UINT16              handle = p_acl_cb->hci_handle;
    957     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev_by_handle (handle);
    958     UINT8               page_idx;
    959 
    960     BTM_TRACE_DEBUG ("btm_process_remote_ext_features");
    961 
    962     /* Make sure we have the record to save remote features information */
    963     if (p_dev_rec == NULL)
    964     {
    965         /* Get a new device; might be doing dedicated bonding */
    966         p_dev_rec = btm_find_or_alloc_dev (p_acl_cb->remote_addr);
    967     }
    968 
    969     p_acl_cb->num_read_pages = num_read_pages;
    970     p_dev_rec->num_read_pages = num_read_pages;
    971 
    972     /* Move the pages to placeholder */
    973     for (page_idx = 0; page_idx < num_read_pages; page_idx++)
    974     {
    975         if (page_idx > HCI_EXT_FEATURES_PAGE_MAX)
    976         {
    977             BTM_TRACE_ERROR("%s: page=%d unexpected", __FUNCTION__, page_idx);
    978             break;
    979         }
    980         memcpy (p_dev_rec->features[page_idx], p_acl_cb->peer_lmp_features[page_idx],
    981                 HCI_FEATURE_BYTES_PER_PAGE);
    982     }
    983 
    984     const UINT8 req_pend = (p_dev_rec->sm4 & BTM_SM4_REQ_PEND);
    985 
    986     /* Store the Peer Security Capabilites (in SM4 and rmt_sec_caps) */
    987     btm_sec_set_peer_sec_caps(p_acl_cb, p_dev_rec);
    988 
    989     BTM_TRACE_API("%s: pend:%d", __FUNCTION__, req_pend);
    990     if (req_pend)
    991     {
    992         /* Request for remaining Security Features (if any) */
    993         l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
    994     }
    995 }
    996 
    997 
    998 /*******************************************************************************
    999 **
   1000 ** Function         btm_read_remote_features
   1001 **
   1002 ** Description      Local function called to send a read remote supported features/
   1003 **                  remote extended features page[0].
   1004 **
   1005 ** Returns          void
   1006 **
   1007 *******************************************************************************/
   1008 void btm_read_remote_features (UINT16 handle)
   1009 {
   1010     UINT8       acl_idx;
   1011     tACL_CONN   *p_acl_cb;
   1012 
   1013     BTM_TRACE_DEBUG("btm_read_remote_features() handle: %d", handle);
   1014 
   1015     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
   1016     {
   1017         BTM_TRACE_ERROR("btm_read_remote_features handle=%d invalid", handle);
   1018         return;
   1019     }
   1020 
   1021     p_acl_cb = &btm_cb.acl_db[acl_idx];
   1022     p_acl_cb->num_read_pages = 0;
   1023     memset (p_acl_cb->peer_lmp_features, 0, sizeof(p_acl_cb->peer_lmp_features));
   1024 
   1025     /* first send read remote supported features HCI command */
   1026     /* because we don't know whether the remote support extended feature command */
   1027     btsnd_hcic_rmt_features_req (handle);
   1028 }
   1029 
   1030 
   1031 /*******************************************************************************
   1032 **
   1033 ** Function         btm_read_remote_ext_features
   1034 **
   1035 ** Description      Local function called to send a read remote extended features
   1036 **
   1037 ** Returns          void
   1038 **
   1039 *******************************************************************************/
   1040 void btm_read_remote_ext_features (UINT16 handle, UINT8 page_number)
   1041 {
   1042     BTM_TRACE_DEBUG("btm_read_remote_ext_features() handle: %d page: %d", handle, page_number);
   1043 
   1044     btsnd_hcic_rmt_ext_features(handle, page_number);
   1045 }
   1046 
   1047 
   1048 /*******************************************************************************
   1049 **
   1050 ** Function         btm_read_remote_features_complete
   1051 **
   1052 ** Description      This function is called when the remote supported features
   1053 **                  complete event is received from the HCI.
   1054 **
   1055 ** Returns          void
   1056 **
   1057 *******************************************************************************/
   1058 void btm_read_remote_features_complete (UINT8 *p)
   1059 {
   1060     tACL_CONN        *p_acl_cb;
   1061     UINT8             status;
   1062     UINT16            handle;
   1063     UINT8            acl_idx;
   1064 
   1065     BTM_TRACE_DEBUG ("btm_read_remote_features_complete");
   1066     STREAM_TO_UINT8  (status, p);
   1067 
   1068     if (status != HCI_SUCCESS)
   1069     {
   1070         BTM_TRACE_ERROR ("btm_read_remote_features_complete failed (status 0x%02x)", status);
   1071         return;
   1072     }
   1073 
   1074         STREAM_TO_UINT16 (handle, p);
   1075 
   1076     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
   1077         {
   1078         BTM_TRACE_ERROR("btm_read_remote_features_complete handle=%d invalid", handle);
   1079         return;
   1080                 }
   1081 
   1082     p_acl_cb = &btm_cb.acl_db[acl_idx];
   1083 
   1084     /* Copy the received features page */
   1085     STREAM_TO_ARRAY(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0], p,
   1086                     HCI_FEATURE_BYTES_PER_PAGE);
   1087 
   1088     if ((HCI_LMP_EXTENDED_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) &&
   1089         (controller_get_interface()->supports_reading_remote_extended_features()))
   1090     {
   1091         /* if the remote controller has extended features and local controller supports
   1092         ** HCI_Read_Remote_Extended_Features command then start reading these feature starting
   1093         ** with extended features page 1 */
   1094         BTM_TRACE_DEBUG ("Start reading remote extended features");
   1095         btm_read_remote_ext_features(handle, HCI_EXT_FEATURES_PAGE_1);
   1096         return;
   1097     }
   1098 
   1099     /* Remote controller has no extended features. Process remote controller supported features
   1100        (features page HCI_EXT_FEATURES_PAGE_0). */
   1101     btm_process_remote_ext_features (p_acl_cb, 1);
   1102 
   1103     /* Continue with HCI connection establishment */
   1104     btm_establish_continue (p_acl_cb);
   1105 }
   1106 
   1107 /*******************************************************************************
   1108 **
   1109 ** Function         btm_read_remote_ext_features_complete
   1110 **
   1111 ** Description      This function is called when the remote extended features
   1112 **                  complete event is received from the HCI.
   1113 **
   1114 ** Returns          void
   1115 **
   1116 *******************************************************************************/
   1117 void btm_read_remote_ext_features_complete (UINT8 *p)
   1118 {
   1119     tACL_CONN   *p_acl_cb;
   1120     UINT8       page_num, max_page;
   1121     UINT16      handle;
   1122     UINT8       acl_idx;
   1123 
   1124     BTM_TRACE_DEBUG ("btm_read_remote_ext_features_complete");
   1125 
   1126     ++p;
   1127     STREAM_TO_UINT16 (handle, p);
   1128     STREAM_TO_UINT8  (page_num, p);
   1129     STREAM_TO_UINT8  (max_page, p);
   1130 
   1131     /* Validate parameters */
   1132     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
   1133     {
   1134         BTM_TRACE_ERROR("btm_read_remote_ext_features_complete handle=%d invalid", handle);
   1135         return;
   1136     }
   1137 
   1138     if (max_page > HCI_EXT_FEATURES_PAGE_MAX)
   1139     {
   1140         BTM_TRACE_ERROR("btm_read_remote_ext_features_complete page=%d unknown", max_page);
   1141         return;
   1142     }
   1143 
   1144     p_acl_cb = &btm_cb.acl_db[acl_idx];
   1145 
   1146     /* Copy the received features page */
   1147     STREAM_TO_ARRAY(p_acl_cb->peer_lmp_features[page_num], p, HCI_FEATURE_BYTES_PER_PAGE);
   1148 
   1149     /* If there is the next remote features page and
   1150      * we have space to keep this page data - read this page */
   1151     if ((page_num < max_page) && (page_num < HCI_EXT_FEATURES_PAGE_MAX))
   1152     {
   1153         page_num++;
   1154         BTM_TRACE_DEBUG("BTM reads next remote extended features page (%d)", page_num);
   1155         btm_read_remote_ext_features (handle, page_num);
   1156         return;
   1157     }
   1158 
   1159     /* Reading of remote feature pages is complete */
   1160     BTM_TRACE_DEBUG("BTM reached last remote extended features page (%d)", page_num);
   1161 
   1162     /* Process the pages */
   1163     btm_process_remote_ext_features (p_acl_cb, (UINT8) (page_num + 1));
   1164 
   1165     /* Continue with HCI connection establishment */
   1166     btm_establish_continue (p_acl_cb);
   1167 }
   1168 
   1169 /*******************************************************************************
   1170 **
   1171 ** Function         btm_read_remote_ext_features_failed
   1172 **
   1173 ** Description      This function is called when the remote extended features
   1174 **                  complete event returns a failed status.
   1175 **
   1176 ** Returns          void
   1177 **
   1178 *******************************************************************************/
   1179 void btm_read_remote_ext_features_failed (UINT8 status, UINT16 handle)
   1180 {
   1181     tACL_CONN   *p_acl_cb;
   1182     UINT8       acl_idx;
   1183 
   1184     BTM_TRACE_WARNING ("btm_read_remote_ext_features_failed (status 0x%02x) for handle %d",
   1185                          status, handle);
   1186 
   1187     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
   1188     {
   1189         BTM_TRACE_ERROR("btm_read_remote_ext_features_failed handle=%d invalid", handle);
   1190         return;
   1191     }
   1192 
   1193     p_acl_cb = &btm_cb.acl_db[acl_idx];
   1194 
   1195     /* Process supported features only */
   1196     btm_process_remote_ext_features (p_acl_cb, 1);
   1197 
   1198     /* Continue HCI connection establishment */
   1199     btm_establish_continue (p_acl_cb);
   1200 }
   1201 
   1202 /*******************************************************************************
   1203 **
   1204 ** Function         btm_establish_continue
   1205 **
   1206 ** Description      This function is called when the command complete message
   1207 **                  is received from the HCI for the read local link policy request.
   1208 **
   1209 ** Returns          void
   1210 **
   1211 *******************************************************************************/
   1212 void btm_establish_continue (tACL_CONN *p_acl_cb)
   1213 {
   1214         tBTM_BL_EVENT_DATA  evt_data;
   1215         BTM_TRACE_DEBUG ("btm_establish_continue");
   1216 #if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
   1217 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
   1218         if (p_acl_cb->transport == BT_TRANSPORT_BR_EDR)
   1219 #endif
   1220         {
   1221             /* For now there are a some devices that do not like sending */
   1222             /* commands events and data at the same time. */
   1223             /* Set the packet types to the default allowed by the device */
   1224             btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
   1225 
   1226             if (btm_cb.btm_def_link_policy)
   1227                 BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
   1228         }
   1229 #endif
   1230         p_acl_cb->link_up_issued = TRUE;
   1231 
   1232         /* If anyone cares, tell him database changed */
   1233         if (btm_cb.p_bl_changed_cb)
   1234         {
   1235             evt_data.event = BTM_BL_CONN_EVT;
   1236             evt_data.conn.p_bda = p_acl_cb->remote_addr;
   1237             evt_data.conn.p_bdn = p_acl_cb->remote_name;
   1238             evt_data.conn.p_dc  = p_acl_cb->remote_dc;
   1239             evt_data.conn.p_features = p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0];
   1240 #if BLE_INCLUDED == TRUE
   1241             evt_data.conn.handle = p_acl_cb->hci_handle;
   1242             evt_data.conn.transport = p_acl_cb->transport;
   1243 #endif
   1244 
   1245             (*btm_cb.p_bl_changed_cb)(&evt_data);
   1246         }
   1247         btm_acl_update_busy_level (BTM_BLI_ACL_UP_EVT);
   1248 }
   1249 
   1250 
   1251 /*******************************************************************************
   1252 **
   1253 ** Function         BTM_SetDefaultLinkSuperTout
   1254 **
   1255 ** Description      Set the default value for HCI "Write Link Supervision Timeout"
   1256 **                  command to use when an ACL link is created.
   1257 **
   1258 ** Returns          void
   1259 **
   1260 *******************************************************************************/
   1261 void BTM_SetDefaultLinkSuperTout (UINT16 timeout)
   1262 {
   1263     BTM_TRACE_DEBUG ("BTM_SetDefaultLinkSuperTout");
   1264     btm_cb.btm_def_link_super_tout = timeout;
   1265 }
   1266 
   1267 /*******************************************************************************
   1268 **
   1269 ** Function         BTM_GetLinkSuperTout
   1270 **
   1271 ** Description      Read the link supervision timeout value of the connection
   1272 **
   1273 ** Returns          status of the operation
   1274 **
   1275 *******************************************************************************/
   1276 tBTM_STATUS BTM_GetLinkSuperTout (BD_ADDR remote_bda, UINT16 *p_timeout)
   1277 {
   1278     tACL_CONN   *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
   1279 
   1280     BTM_TRACE_DEBUG ("BTM_GetLinkSuperTout");
   1281     if (p != (tACL_CONN *)NULL)
   1282     {
   1283         *p_timeout = p->link_super_tout;
   1284         return(BTM_SUCCESS);
   1285     }
   1286     /* If here, no BD Addr found */
   1287     return(BTM_UNKNOWN_ADDR);
   1288 }
   1289 
   1290 
   1291 /*******************************************************************************
   1292 **
   1293 ** Function         BTM_SetLinkSuperTout
   1294 **
   1295 ** Description      Create and send HCI "Write Link Supervision Timeout" command
   1296 **
   1297 ** Returns          status of the operation
   1298 **
   1299 *******************************************************************************/
   1300 tBTM_STATUS BTM_SetLinkSuperTout (BD_ADDR remote_bda, UINT16 timeout)
   1301 {
   1302     tACL_CONN   *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
   1303 
   1304     BTM_TRACE_DEBUG ("BTM_SetLinkSuperTout");
   1305     if (p != (tACL_CONN *)NULL)
   1306     {
   1307         p->link_super_tout = timeout;
   1308 
   1309         /* Only send if current role is Master; 2.0 spec requires this */
   1310         if (p->link_role == BTM_ROLE_MASTER)
   1311         {
   1312             if (!btsnd_hcic_write_link_super_tout (LOCAL_BR_EDR_CONTROLLER_ID,
   1313                                                    p->hci_handle, timeout))
   1314                 return(BTM_NO_RESOURCES);
   1315 
   1316             return(BTM_CMD_STARTED);
   1317         }
   1318         else
   1319             return(BTM_SUCCESS);
   1320     }
   1321 
   1322     /* If here, no BD Addr found */
   1323     return(BTM_UNKNOWN_ADDR);
   1324 }
   1325 
   1326 /*******************************************************************************
   1327 **
   1328 ** Function         BTM_IsAclConnectionUp
   1329 **
   1330 ** Description      This function is called to check if an ACL connection exists
   1331 **                  to a specific remote BD Address.
   1332 **
   1333 ** Returns          TRUE if connection is up, else FALSE.
   1334 **
   1335 *******************************************************************************/
   1336 BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda, tBT_TRANSPORT transport)
   1337 {
   1338     tACL_CONN   *p;
   1339 
   1340     BTM_TRACE_API ("BTM_IsAclConnectionUp: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   1341                     remote_bda[0], remote_bda[1], remote_bda[2],
   1342                     remote_bda[3], remote_bda[4], remote_bda[5]);
   1343 
   1344     p = btm_bda_to_acl(remote_bda, transport);
   1345     if (p != (tACL_CONN *)NULL)
   1346     {
   1347         return(TRUE);
   1348     }
   1349 
   1350     /* If here, no BD Addr found */
   1351     return(FALSE);
   1352 }
   1353 
   1354 /*******************************************************************************
   1355 **
   1356 ** Function         BTM_GetNumAclLinks
   1357 **
   1358 ** Description      This function is called to count the number of
   1359 **                  ACL links that are active.
   1360 **
   1361 ** Returns          UINT16  Number of active ACL links
   1362 **
   1363 *******************************************************************************/
   1364 UINT16 BTM_GetNumAclLinks (void)
   1365 {
   1366     uint16_t num_acl = 0;
   1367 
   1368     for (uint16_t i = 0; i < MAX_L2CAP_LINKS; ++i)
   1369     {
   1370         if (btm_cb.acl_db[i].in_use)
   1371             ++num_acl;
   1372     }
   1373 
   1374     return num_acl;
   1375 }
   1376 
   1377 /*******************************************************************************
   1378 **
   1379 ** Function         btm_get_acl_disc_reason_code
   1380 **
   1381 ** Description      This function is called to get the disconnection reason code
   1382 **                  returned by the HCI at disconnection complete event.
   1383 **
   1384 ** Returns          TRUE if connection is up, else FALSE.
   1385 **
   1386 *******************************************************************************/
   1387 UINT16 btm_get_acl_disc_reason_code (void)
   1388 {
   1389     UINT8 res = btm_cb.acl_disc_reason;
   1390     BTM_TRACE_DEBUG ("btm_get_acl_disc_reason_code");
   1391     return(res);
   1392 }
   1393 
   1394 
   1395 /*******************************************************************************
   1396 **
   1397 ** Function         BTM_GetHCIConnHandle
   1398 **
   1399 ** Description      This function is called to get the handle for an ACL connection
   1400 **                  to a specific remote BD Address.
   1401 **
   1402 ** Returns          the handle of the connection, or 0xFFFF if none.
   1403 **
   1404 *******************************************************************************/
   1405 UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda, tBT_TRANSPORT transport)
   1406 {
   1407     tACL_CONN   *p;
   1408     BTM_TRACE_DEBUG ("BTM_GetHCIConnHandle");
   1409     p = btm_bda_to_acl(remote_bda, transport);
   1410     if (p != (tACL_CONN *)NULL)
   1411     {
   1412         return(p->hci_handle);
   1413     }
   1414 
   1415     /* If here, no BD Addr found */
   1416     return(0xFFFF);
   1417 }
   1418 
   1419 /*******************************************************************************
   1420 **
   1421 ** Function         btm_process_clk_off_comp_evt
   1422 **
   1423 ** Description      This function is called when clock offset command completes.
   1424 **
   1425 ** Input Parms      hci_handle - connection handle associated with the change
   1426 **                  clock offset
   1427 **
   1428 ** Returns          void
   1429 **
   1430 *******************************************************************************/
   1431 void btm_process_clk_off_comp_evt (UINT16 hci_handle, UINT16 clock_offset)
   1432 {
   1433     UINT8      xx;
   1434     BTM_TRACE_DEBUG ("btm_process_clk_off_comp_evt");
   1435     /* Look up the connection by handle and set the current mode */
   1436     if ((xx = btm_handle_to_acl_index(hci_handle)) < MAX_L2CAP_LINKS)
   1437         btm_cb.acl_db[xx].clock_offset = clock_offset;
   1438 }
   1439 
   1440 /*******************************************************************************
   1441 **
   1442 ** Function         btm_acl_role_changed
   1443 **
   1444 ** Description      This function is called whan a link's master/slave role change
   1445 **                  event or command status event (with error) is received.
   1446 **                  It updates the link control block, and calls
   1447 **                  the registered callback with status and role (if registered).
   1448 **
   1449 ** Returns          void
   1450 **
   1451 *******************************************************************************/
   1452 void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role)
   1453 {
   1454     UINT8                   *p_bda = (bd_addr) ? bd_addr :
   1455                                         btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
   1456     tACL_CONN               *p = btm_bda_to_acl(p_bda, BT_TRANSPORT_BR_EDR);
   1457     tBTM_ROLE_SWITCH_CMPL   *p_data = &btm_cb.devcb.switch_role_ref_data;
   1458     tBTM_SEC_DEV_REC        *p_dev_rec;
   1459     tBTM_BL_ROLE_CHG_DATA   evt;
   1460 
   1461     BTM_TRACE_DEBUG ("btm_acl_role_changed");
   1462     /* Ignore any stray events */
   1463     if (p == NULL)
   1464     {
   1465         /* it could be a failure */
   1466         if (hci_status != HCI_SUCCESS)
   1467             btm_acl_report_role_change(hci_status, bd_addr);
   1468         return;
   1469     }
   1470 
   1471     p_data->hci_status = hci_status;
   1472 
   1473     if (hci_status == HCI_SUCCESS)
   1474     {
   1475         p_data->role = new_role;
   1476         memcpy(p_data->remote_bd_addr, p_bda, BD_ADDR_LEN);
   1477 
   1478         /* Update cached value */
   1479         p->link_role = new_role;
   1480 
   1481         /* Reload LSTO: link supervision timeout is reset in the LM after a role switch */
   1482         if (new_role == BTM_ROLE_MASTER)
   1483         {
   1484             BTM_SetLinkSuperTout (p->remote_addr, p->link_super_tout);
   1485         }
   1486     }
   1487     else
   1488     {
   1489         /* so the BTM_BL_ROLE_CHG_EVT uses the old role */
   1490         new_role = p->link_role;
   1491     }
   1492 
   1493     /* Check if any SCO req is pending for role change */
   1494     btm_sco_chk_pend_rolechange (p->hci_handle);
   1495 
   1496     /* if switching state is switching we need to turn encryption on */
   1497     /* if idle, we did not change encryption */
   1498     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_SWITCHING)
   1499     {
   1500         if (btsnd_hcic_set_conn_encrypt (p->hci_handle, TRUE))
   1501         {
   1502             p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_ON;
   1503             p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_ON;
   1504             return;
   1505         }
   1506     }
   1507 
   1508     /* Set the switch_role_state to IDLE since the reply received from HCI */
   1509     /* regardless of its result either success or failed. */
   1510     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_IN_PROGRESS)
   1511     {
   1512         p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
   1513         p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE;
   1514     }
   1515 
   1516     /* if role switch complete is needed, report it now */
   1517     btm_acl_report_role_change(hci_status, bd_addr);
   1518 
   1519     /* if role change event is registered, report it now */
   1520     if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK))
   1521     {
   1522         evt.event       = BTM_BL_ROLE_CHG_EVT;
   1523         evt.new_role    = new_role;
   1524         evt.p_bda       = p_bda;
   1525         evt.hci_status  = hci_status;
   1526         (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
   1527     }
   1528 
   1529     BTM_TRACE_DEBUG("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
   1530                      p_data->role, p_data->hci_status, p->switch_role_state);
   1531 
   1532 #if BTM_DISC_DURING_RS == TRUE
   1533     /* If a disconnect is pending, issue it now that role switch has completed */
   1534     if ((p_dev_rec = btm_find_dev (p_bda)) != NULL)
   1535     {
   1536         if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING)
   1537         {
   1538             BTM_TRACE_WARNING("btm_acl_role_changed -> Issuing delayed HCI_Disconnect!!!");
   1539             btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER);
   1540         }
   1541         BTM_TRACE_ERROR("tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
   1542                         PTR_TO_UINT(p_dev_rec), p_dev_rec->rs_disc_pending);
   1543         p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
   1544     }
   1545 
   1546 #endif
   1547 
   1548 }
   1549 
   1550 /*******************************************************************************
   1551 **
   1552 ** Function         BTM_AllocateSCN
   1553 **
   1554 ** Description      Look through the Server Channel Numbers for a free one.
   1555 **
   1556 ** Returns          Allocated SCN number or 0 if none.
   1557 **
   1558 *******************************************************************************/
   1559 
   1560 UINT8 BTM_AllocateSCN(void)
   1561 {
   1562     UINT8   x;
   1563     BTM_TRACE_DEBUG ("BTM_AllocateSCN");
   1564 
   1565     // stack reserves scn 1 for HFP, HSP we still do the correct way
   1566     for (x = 1; x < BTM_MAX_SCN; x++)
   1567     {
   1568         if (!btm_cb.btm_scn[x])
   1569         {
   1570             btm_cb.btm_scn[x] = TRUE;
   1571             return(x+1);
   1572         }
   1573     }
   1574 
   1575     return(0);     /* No free ports */
   1576 }
   1577 
   1578 /*******************************************************************************
   1579 **
   1580 ** Function         BTM_TryAllocateSCN
   1581 **
   1582 ** Description      Try to allocate a fixed server channel
   1583 **
   1584 ** Returns          Returns TRUE if server channel was available
   1585 **
   1586 *******************************************************************************/
   1587 
   1588 BOOLEAN BTM_TryAllocateSCN(UINT8 scn)
   1589 {
   1590     /* Make sure we don't exceed max port range.
   1591      * Stack reserves scn 1 for HFP, HSP we still do the correct way.
   1592      */
   1593     if ( (scn>=BTM_MAX_SCN) || (scn == 1) )
   1594         return FALSE;
   1595 
   1596     /* check if this port is available */
   1597     if (!btm_cb.btm_scn[scn-1])
   1598     {
   1599         btm_cb.btm_scn[scn-1] = TRUE;
   1600         return TRUE;
   1601     }
   1602 
   1603     return (FALSE);     /* Port was busy */
   1604 }
   1605 
   1606 /*******************************************************************************
   1607 **
   1608 ** Function         BTM_FreeSCN
   1609 **
   1610 ** Description      Free the specified SCN.
   1611 **
   1612 ** Returns          TRUE or FALSE
   1613 **
   1614 *******************************************************************************/
   1615 BOOLEAN BTM_FreeSCN(UINT8 scn)
   1616 {
   1617     BTM_TRACE_DEBUG ("BTM_FreeSCN ");
   1618     if (scn <= BTM_MAX_SCN)
   1619     {
   1620         btm_cb.btm_scn[scn-1] = FALSE;
   1621         return(TRUE);
   1622     }
   1623     else
   1624         return(FALSE);      /* Illegal SCN passed in */
   1625 }
   1626 
   1627 /*******************************************************************************
   1628 **
   1629 ** Function         btm_set_packet_types
   1630 **
   1631 ** Description      This function sets the packet types used for a specific
   1632 **                  ACL connection. It is called internally by btm_acl_created
   1633 **                  or by an application/profile by BTM_SetPacketTypes.
   1634 **
   1635 ** Returns          status of the operation
   1636 **
   1637 *******************************************************************************/
   1638 tBTM_STATUS btm_set_packet_types (tACL_CONN *p, UINT16 pkt_types)
   1639 {
   1640     UINT16 temp_pkt_types;
   1641     BTM_TRACE_DEBUG ("btm_set_packet_types");
   1642     /* Save in the ACL control blocks, types that we support */
   1643     temp_pkt_types = (pkt_types & BTM_ACL_SUPPORTED_PKTS_MASK &
   1644                       btm_cb.btm_acl_pkt_types_supported);
   1645 
   1646     /* OR in any exception packet types if at least 2.0 version of spec */
   1647     temp_pkt_types |= ((pkt_types & BTM_ACL_EXCEPTION_PKTS_MASK) |
   1648                        (btm_cb.btm_acl_pkt_types_supported & BTM_ACL_EXCEPTION_PKTS_MASK));
   1649 
   1650     /* Exclude packet types not supported by the peer */
   1651     btm_acl_chk_peer_pkt_type_support (p, &temp_pkt_types);
   1652 
   1653     BTM_TRACE_DEBUG ("SetPacketType Mask -> 0x%04x", temp_pkt_types);
   1654 
   1655     if (!btsnd_hcic_change_conn_type (p->hci_handle, temp_pkt_types))
   1656     {
   1657         return(BTM_NO_RESOURCES);
   1658     }
   1659 
   1660     p->pkt_types_mask = temp_pkt_types;
   1661 
   1662     return(BTM_CMD_STARTED);
   1663 }
   1664 
   1665 /*******************************************************************************
   1666 **
   1667 ** Function         btm_get_max_packet_size
   1668 **
   1669 ** Returns          Returns maximum packet size that can be used for current
   1670 **                  connection, 0 if connection is not established
   1671 **
   1672 *******************************************************************************/
   1673 UINT16 btm_get_max_packet_size (BD_ADDR addr)
   1674 {
   1675     tACL_CONN   *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
   1676     UINT16      pkt_types = 0;
   1677     UINT16      pkt_size = 0;
   1678     BTM_TRACE_DEBUG ("btm_get_max_packet_size");
   1679     if (p != NULL)
   1680     {
   1681         pkt_types = p->pkt_types_mask;
   1682     }
   1683     else
   1684     {
   1685         /* Special case for when info for the local device is requested */
   1686         if (memcmp (controller_get_interface()->get_address(), addr, BD_ADDR_LEN) == 0)
   1687         {
   1688             pkt_types = btm_cb.btm_acl_pkt_types_supported;
   1689         }
   1690     }
   1691 
   1692     if (pkt_types)
   1693     {
   1694         if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH5))
   1695             pkt_size = HCI_EDR3_DH5_PACKET_SIZE;
   1696         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH5))
   1697             pkt_size = HCI_EDR2_DH5_PACKET_SIZE;
   1698         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH3))
   1699             pkt_size = HCI_EDR3_DH3_PACKET_SIZE;
   1700         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH5)
   1701             pkt_size = HCI_DH5_PACKET_SIZE;
   1702         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH3))
   1703             pkt_size = HCI_EDR2_DH3_PACKET_SIZE;
   1704         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM5)
   1705             pkt_size = HCI_DM5_PACKET_SIZE;
   1706         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH3)
   1707             pkt_size = HCI_DH3_PACKET_SIZE;
   1708         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM3)
   1709             pkt_size = HCI_DM3_PACKET_SIZE;
   1710         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH1))
   1711             pkt_size = HCI_EDR3_DH1_PACKET_SIZE;
   1712         else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH1))
   1713             pkt_size = HCI_EDR2_DH1_PACKET_SIZE;
   1714         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH1)
   1715             pkt_size = HCI_DH1_PACKET_SIZE;
   1716         else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM1)
   1717             pkt_size = HCI_DM1_PACKET_SIZE;
   1718     }
   1719 
   1720    return(pkt_size);
   1721 }
   1722 
   1723 /*******************************************************************************
   1724 **
   1725 ** Function         BTM_ReadRemoteVersion
   1726 **
   1727 ** Returns          If connected report peer device info
   1728 **
   1729 *******************************************************************************/
   1730 tBTM_STATUS BTM_ReadRemoteVersion (BD_ADDR addr, UINT8 *lmp_version,
   1731                                    UINT16 *manufacturer, UINT16 *lmp_sub_version)
   1732 {
   1733     tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
   1734     BTM_TRACE_DEBUG ("BTM_ReadRemoteVersion");
   1735     if (p == NULL)
   1736         return(BTM_UNKNOWN_ADDR);
   1737 
   1738     if (lmp_version)
   1739         *lmp_version = p->lmp_version;
   1740 
   1741     if (manufacturer)
   1742         *manufacturer = p->manufacturer;
   1743 
   1744     if (lmp_sub_version)
   1745         *lmp_sub_version = p->lmp_subversion;
   1746 
   1747     return(BTM_SUCCESS);
   1748 }
   1749 
   1750 /*******************************************************************************
   1751 **
   1752 ** Function         BTM_ReadRemoteFeatures
   1753 **
   1754 ** Returns          pointer to the remote supported features mask (8 bytes)
   1755 **
   1756 *******************************************************************************/
   1757 UINT8 *BTM_ReadRemoteFeatures (BD_ADDR addr)
   1758 {
   1759     tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
   1760     BTM_TRACE_DEBUG ("BTM_ReadRemoteFeatures");
   1761     if (p == NULL)
   1762     {
   1763         return(NULL);
   1764     }
   1765 
   1766     return(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]);
   1767 }
   1768 
   1769 /*******************************************************************************
   1770 **
   1771 ** Function         BTM_ReadRemoteExtendedFeatures
   1772 **
   1773 ** Returns          pointer to the remote extended features mask (8 bytes)
   1774 **                  or NULL if bad page
   1775 **
   1776 *******************************************************************************/
   1777 UINT8 *BTM_ReadRemoteExtendedFeatures (BD_ADDR addr, UINT8 page_number)
   1778 {
   1779     tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
   1780     BTM_TRACE_DEBUG ("BTM_ReadRemoteExtendedFeatures");
   1781     if (p == NULL)
   1782     {
   1783         return(NULL);
   1784     }
   1785 
   1786     if (page_number > HCI_EXT_FEATURES_PAGE_MAX)
   1787     {
   1788         BTM_TRACE_ERROR("Warning: BTM_ReadRemoteExtendedFeatures page %d unknown", page_number);
   1789         return NULL;
   1790     }
   1791 
   1792     return(p->peer_lmp_features[page_number]);
   1793 }
   1794 
   1795 /*******************************************************************************
   1796 **
   1797 ** Function         BTM_ReadNumberRemoteFeaturesPages
   1798 **
   1799 ** Returns          number of features pages read from the remote device.
   1800 **
   1801 *******************************************************************************/
   1802 UINT8 BTM_ReadNumberRemoteFeaturesPages (BD_ADDR addr)
   1803 {
   1804     tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
   1805     BTM_TRACE_DEBUG ("BTM_ReadNumberRemoteFeaturesPages");
   1806     if (p == NULL)
   1807     {
   1808         return(0);
   1809     }
   1810 
   1811     return(p->num_read_pages);
   1812 }
   1813 
   1814 /*******************************************************************************
   1815 **
   1816 ** Function         BTM_ReadAllRemoteFeatures
   1817 **
   1818 ** Returns          pointer to all features of the remote (24 bytes).
   1819 **
   1820 *******************************************************************************/
   1821 UINT8 *BTM_ReadAllRemoteFeatures (BD_ADDR addr)
   1822 {
   1823     tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
   1824     BTM_TRACE_DEBUG ("BTM_ReadAllRemoteFeatures");
   1825     if (p == NULL)
   1826     {
   1827         return(NULL);
   1828     }
   1829 
   1830     return(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]);
   1831 }
   1832 
   1833 /*******************************************************************************
   1834 **
   1835 ** Function         BTM_RegBusyLevelNotif
   1836 **
   1837 ** Description      This function is called to register a callback to receive
   1838 **                  busy level change events.
   1839 **
   1840 ** Returns          BTM_SUCCESS if successfully registered, otherwise error
   1841 **
   1842 *******************************************************************************/
   1843 tBTM_STATUS BTM_RegBusyLevelNotif (tBTM_BL_CHANGE_CB *p_cb, UINT8 *p_level,
   1844                                    tBTM_BL_EVENT_MASK evt_mask)
   1845 {
   1846     BTM_TRACE_DEBUG ("BTM_RegBusyLevelNotif");
   1847     if (p_level)
   1848         *p_level = btm_cb.busy_level;
   1849 
   1850     btm_cb.bl_evt_mask = evt_mask;
   1851 
   1852     if (!p_cb)
   1853         btm_cb.p_bl_changed_cb = NULL;
   1854     else if (btm_cb.p_bl_changed_cb)
   1855         return(BTM_BUSY);
   1856     else
   1857         btm_cb.p_bl_changed_cb = p_cb;
   1858 
   1859     return(BTM_SUCCESS);
   1860 }
   1861 
   1862 /*******************************************************************************
   1863 **
   1864 ** Function         BTM_SetQoS
   1865 **
   1866 ** Description      This function is called to setup QoS
   1867 **
   1868 ** Returns          status of the operation
   1869 **
   1870 *******************************************************************************/
   1871 tBTM_STATUS BTM_SetQoS (BD_ADDR bd, FLOW_SPEC *p_flow, tBTM_CMPL_CB *p_cb)
   1872 {
   1873     tACL_CONN   *p = &btm_cb.acl_db[0];
   1874 
   1875     BTM_TRACE_API ("BTM_SetQoS: BdAddr: %02x%02x%02x%02x%02x%02x",
   1876                     bd[0], bd[1], bd[2],
   1877                     bd[3], bd[4], bd[5]);
   1878 
   1879     /* If someone already waiting on the version, do not allow another */
   1880     if (btm_cb.devcb.p_qos_setup_cmpl_cb)
   1881         return(BTM_BUSY);
   1882 
   1883     if ( (p = btm_bda_to_acl(bd, BT_TRANSPORT_BR_EDR)) != NULL)
   1884     {
   1885         btm_cb.devcb.p_qos_setup_cmpl_cb = p_cb;
   1886         alarm_set_on_queue(btm_cb.devcb.qos_setup_timer,
   1887                            BTM_DEV_REPLY_TIMEOUT_MS,
   1888                            btm_qos_setup_timeout, NULL,
   1889                            btu_general_alarm_queue);
   1890 
   1891         if (!btsnd_hcic_qos_setup (p->hci_handle, p_flow->qos_flags, p_flow->service_type,
   1892                                    p_flow->token_rate, p_flow->peak_bandwidth,
   1893                                    p_flow->latency,p_flow->delay_variation))
   1894         {
   1895             btm_cb.devcb.p_qos_setup_cmpl_cb = NULL;
   1896             alarm_cancel(btm_cb.devcb.qos_setup_timer);
   1897             return(BTM_NO_RESOURCES);
   1898         }
   1899         else
   1900             return(BTM_CMD_STARTED);
   1901     }
   1902 
   1903     /* If here, no BD Addr found */
   1904     return(BTM_UNKNOWN_ADDR);
   1905 }
   1906 
   1907 /*******************************************************************************
   1908 **
   1909 ** Function         btm_qos_setup_timeout
   1910 **
   1911 ** Description      Callback when QoS setup times out.
   1912 **
   1913 ** Returns          void
   1914 **
   1915 *******************************************************************************/
   1916 void btm_qos_setup_timeout(UNUSED_ATTR void *data)
   1917 {
   1918     tBTM_CMPL_CB  *p_cb = btm_cb.devcb.p_qos_setup_cmpl_cb;
   1919     btm_cb.devcb.p_qos_setup_cmpl_cb = NULL;
   1920     if (p_cb)
   1921         (*p_cb)((void *) NULL);
   1922 }
   1923 
   1924 /*******************************************************************************
   1925 **
   1926 ** Function         btm_qos_setup_complete
   1927 **
   1928 ** Description      This function is called when the command complete message
   1929 **                  is received from the HCI for the qos setup request.
   1930 **
   1931 ** Returns          void
   1932 **
   1933 *******************************************************************************/
   1934 void btm_qos_setup_complete(UINT8 status, UINT16 handle, FLOW_SPEC *p_flow)
   1935 {
   1936     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_qos_setup_cmpl_cb;
   1937     tBTM_QOS_SETUP_CMPL     qossu;
   1938 
   1939     BTM_TRACE_DEBUG("%s", __func__);
   1940     alarm_cancel(btm_cb.devcb.qos_setup_timer);
   1941     btm_cb.devcb.p_qos_setup_cmpl_cb = NULL;
   1942 
   1943     /* If there was a registered callback, call it */
   1944     if (p_cb)
   1945     {
   1946         memset(&qossu, 0, sizeof(tBTM_QOS_SETUP_CMPL));
   1947         qossu.status = status;
   1948         qossu.handle = handle;
   1949         if (p_flow != NULL)
   1950         {
   1951             qossu.flow.qos_flags = p_flow->qos_flags;
   1952             qossu.flow.service_type = p_flow->service_type;
   1953             qossu.flow.token_rate = p_flow->token_rate;
   1954             qossu.flow.peak_bandwidth = p_flow->peak_bandwidth;
   1955             qossu.flow.latency = p_flow->latency;
   1956             qossu.flow.delay_variation = p_flow->delay_variation;
   1957         }
   1958         BTM_TRACE_DEBUG ("BTM: p_flow->delay_variation: 0x%02x",
   1959                           qossu.flow.delay_variation);
   1960         (*p_cb)(&qossu);
   1961     }
   1962 }
   1963 
   1964 /*******************************************************************************
   1965 **
   1966 ** Function         BTM_ReadRSSI
   1967 **
   1968 ** Description      This function is called to read the link policy settings.
   1969 **                  The address of link policy results are returned in the callback.
   1970 **                  (tBTM_RSSI_RESULTS)
   1971 **
   1972 ** Returns          BTM_CMD_STARTED if successfully initiated or error code
   1973 **
   1974 *******************************************************************************/
   1975 tBTM_STATUS BTM_ReadRSSI (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
   1976 {
   1977     tACL_CONN   *p;
   1978     tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
   1979 #if BLE_INCLUDED == TRUE
   1980     tBT_DEVICE_TYPE dev_type;
   1981     tBLE_ADDR_TYPE  addr_type;
   1982 #endif
   1983     BTM_TRACE_API ("BTM_ReadRSSI: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   1984                     remote_bda[0], remote_bda[1], remote_bda[2],
   1985                     remote_bda[3], remote_bda[4], remote_bda[5]);
   1986 
   1987     /* If someone already waiting on the version, do not allow another */
   1988     if (btm_cb.devcb.p_rssi_cmpl_cb)
   1989         return(BTM_BUSY);
   1990 
   1991 #if BLE_INCLUDED == TRUE
   1992     BTM_ReadDevInfo(remote_bda, &dev_type, &addr_type);
   1993     if (dev_type == BT_DEVICE_TYPE_BLE)
   1994         transport = BT_TRANSPORT_LE;
   1995 #endif
   1996 
   1997     p = btm_bda_to_acl(remote_bda, transport);
   1998     if (p != (tACL_CONN *)NULL)
   1999     {
   2000         btm_cb.devcb.p_rssi_cmpl_cb = p_cb;
   2001         alarm_set_on_queue(btm_cb.devcb.read_rssi_timer,
   2002                            BTM_DEV_REPLY_TIMEOUT_MS, btm_read_rssi_timeout,
   2003                            NULL, btu_general_alarm_queue);
   2004 
   2005         if (!btsnd_hcic_read_rssi (p->hci_handle))
   2006         {
   2007             btm_cb.devcb.p_rssi_cmpl_cb = NULL;
   2008             alarm_cancel(btm_cb.devcb.read_rssi_timer);
   2009             return(BTM_NO_RESOURCES);
   2010         }
   2011         else
   2012             return(BTM_CMD_STARTED);
   2013     }
   2014 
   2015     /* If here, no BD Addr found */
   2016     return(BTM_UNKNOWN_ADDR);
   2017 }
   2018 
   2019 /*******************************************************************************
   2020 **
   2021 ** Function         BTM_ReadLinkQuality
   2022 **
   2023 ** Description      This function is called to read the link qulaity.
   2024 **                  The value of the link quality is returned in the callback.
   2025 **                  (tBTM_LINK_QUALITY_RESULTS)
   2026 **
   2027 ** Returns          BTM_CMD_STARTED if successfully initiated or error code
   2028 **
   2029 *******************************************************************************/
   2030 tBTM_STATUS BTM_ReadLinkQuality (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
   2031 {
   2032     tACL_CONN   *p;
   2033 
   2034     BTM_TRACE_API ("BTM_ReadLinkQuality: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2035                     remote_bda[0], remote_bda[1], remote_bda[2],
   2036                     remote_bda[3], remote_bda[4], remote_bda[5]);
   2037 
   2038     /* If someone already waiting on the version, do not allow another */
   2039     if (btm_cb.devcb.p_link_qual_cmpl_cb)
   2040         return(BTM_BUSY);
   2041 
   2042     p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
   2043     if (p != (tACL_CONN *)NULL)
   2044     {
   2045         btm_cb.devcb.p_link_qual_cmpl_cb = p_cb;
   2046         alarm_set_on_queue(btm_cb.devcb.read_link_quality_timer,
   2047                            BTM_DEV_REPLY_TIMEOUT_MS,
   2048                            btm_read_link_quality_timeout, NULL,
   2049                            btu_general_alarm_queue);
   2050 
   2051         if (!btsnd_hcic_get_link_quality (p->hci_handle))
   2052         {
   2053             btm_cb.devcb.p_link_qual_cmpl_cb = NULL;
   2054             alarm_cancel(btm_cb.devcb.read_link_quality_timer);
   2055             return(BTM_NO_RESOURCES);
   2056         }
   2057         else
   2058             return(BTM_CMD_STARTED);
   2059     }
   2060 
   2061     /* If here, no BD Addr found */
   2062     return(BTM_UNKNOWN_ADDR);
   2063 }
   2064 
   2065 /*******************************************************************************
   2066 **
   2067 ** Function         BTM_ReadTxPower
   2068 **
   2069 ** Description      This function is called to read the current
   2070 **                  TX power of the connection. The tx power level results
   2071 **                  are returned in the callback.
   2072 **                  (tBTM_RSSI_RESULTS)
   2073 **
   2074 ** Returns          BTM_CMD_STARTED if successfully initiated or error code
   2075 **
   2076 *******************************************************************************/
   2077 tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBT_TRANSPORT transport, tBTM_CMPL_CB *p_cb)
   2078 {
   2079     tACL_CONN   *p;
   2080     BOOLEAN     ret;
   2081 #define BTM_READ_RSSI_TYPE_CUR  0x00
   2082 #define BTM_READ_RSSI_TYPE_MAX  0X01
   2083 
   2084     BTM_TRACE_API ("BTM_ReadTxPower: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2085                     remote_bda[0], remote_bda[1], remote_bda[2],
   2086                     remote_bda[3], remote_bda[4], remote_bda[5]);
   2087 
   2088     /* If someone already waiting on the version, do not allow another */
   2089     if (btm_cb.devcb.p_tx_power_cmpl_cb)
   2090         return(BTM_BUSY);
   2091 
   2092     p = btm_bda_to_acl(remote_bda, transport);
   2093     if (p != (tACL_CONN *)NULL)
   2094     {
   2095         btm_cb.devcb.p_tx_power_cmpl_cb = p_cb;
   2096         alarm_set_on_queue(btm_cb.devcb.read_tx_power_timer,
   2097                        BTM_DEV_REPLY_TIMEOUT_MS,
   2098                        btm_read_tx_power_timeout, NULL,
   2099                        btu_general_alarm_queue);
   2100 
   2101 #if BLE_INCLUDED == TRUE
   2102         if (p->transport == BT_TRANSPORT_LE)
   2103         {
   2104             memcpy(btm_cb.devcb.read_tx_pwr_addr, remote_bda, BD_ADDR_LEN);
   2105             ret = btsnd_hcic_ble_read_adv_chnl_tx_power();
   2106         }
   2107         else
   2108 #endif
   2109         {
   2110             ret = btsnd_hcic_read_tx_power (p->hci_handle, BTM_READ_RSSI_TYPE_CUR);
   2111         }
   2112         if (!ret)
   2113         {
   2114             btm_cb.devcb.p_tx_power_cmpl_cb = NULL;
   2115             alarm_cancel(btm_cb.devcb.read_tx_power_timer);
   2116             return(BTM_NO_RESOURCES);
   2117         }
   2118         else
   2119             return(BTM_CMD_STARTED);
   2120     }
   2121 
   2122     /* If here, no BD Addr found */
   2123     return (BTM_UNKNOWN_ADDR);
   2124 }
   2125 
   2126 /*******************************************************************************
   2127 **
   2128 ** Function         btm_read_tx_power_timeout
   2129 **
   2130 ** Description      Callback when reading the tx power times out.
   2131 **
   2132 ** Returns          void
   2133 **
   2134 *******************************************************************************/
   2135 void btm_read_tx_power_timeout(UNUSED_ATTR void *data)
   2136 {
   2137     tBTM_CMPL_CB  *p_cb = btm_cb.devcb.p_tx_power_cmpl_cb;
   2138     btm_cb.devcb.p_tx_power_cmpl_cb = NULL;
   2139     if (p_cb)
   2140         (*p_cb)((void *) NULL);
   2141 }
   2142 
   2143 /*******************************************************************************
   2144 **
   2145 ** Function         btm_read_tx_power_complete
   2146 **
   2147 ** Description      This function is called when the command complete message
   2148 **                  is received from the HCI for the read tx power request.
   2149 **
   2150 ** Returns          void
   2151 **
   2152 *******************************************************************************/
   2153 void btm_read_tx_power_complete(UINT8 *p, BOOLEAN is_ble)
   2154 {
   2155     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_tx_power_cmpl_cb;
   2156     tBTM_TX_POWER_RESULTS   results;
   2157     UINT16                   handle;
   2158     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
   2159     UINT16                   index;
   2160 
   2161     BTM_TRACE_DEBUG("%s", __func__);
   2162     alarm_cancel(btm_cb.devcb.read_tx_power_timer);
   2163     btm_cb.devcb.p_tx_power_cmpl_cb = NULL;
   2164 
   2165     /* If there was a registered callback, call it */
   2166     if (p_cb)
   2167     {
   2168         STREAM_TO_UINT8  (results.hci_status, p);
   2169 
   2170         if (results.hci_status == HCI_SUCCESS)
   2171         {
   2172             results.status = BTM_SUCCESS;
   2173 
   2174             if (!is_ble)
   2175             {
   2176                 STREAM_TO_UINT16 (handle, p);
   2177                 STREAM_TO_UINT8 (results.tx_power, p);
   2178 
   2179                 /* Search through the list of active channels for the correct BD Addr */
   2180                 for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++)
   2181                 {
   2182                     if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle))
   2183                     {
   2184                         memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN);
   2185                         break;
   2186                     }
   2187                 }
   2188             }
   2189 #if BLE_INCLUDED == TRUE
   2190             else
   2191             {
   2192                 STREAM_TO_UINT8 (results.tx_power, p);
   2193                 memcpy(results.rem_bda, btm_cb.devcb.read_tx_pwr_addr, BD_ADDR_LEN);
   2194             }
   2195 #endif
   2196             BTM_TRACE_DEBUG ("BTM TX power Complete: tx_power %d, hci status 0x%02x",
   2197                                   results.tx_power, results.hci_status);
   2198         }
   2199         else
   2200             results.status = BTM_ERR_PROCESSING;
   2201 
   2202         (*p_cb)(&results);
   2203     }
   2204 }
   2205 
   2206 /*******************************************************************************
   2207 **
   2208 ** Function         btm_read_rssi_timeout
   2209 **
   2210 ** Description      Callback when reading the RSSI times out.
   2211 **
   2212 ** Returns          void
   2213 **
   2214 *******************************************************************************/
   2215 void btm_read_rssi_timeout(UNUSED_ATTR void *data)
   2216 {
   2217     tBTM_CMPL_CB  *p_cb = btm_cb.devcb.p_rssi_cmpl_cb;
   2218     btm_cb.devcb.p_rssi_cmpl_cb = NULL;
   2219     if (p_cb)
   2220         (*p_cb)((void *) NULL);
   2221 }
   2222 
   2223 /*******************************************************************************
   2224 **
   2225 ** Function         btm_read_rssi_complete
   2226 **
   2227 ** Description      This function is called when the command complete message
   2228 **                  is received from the HCI for the read rssi request.
   2229 **
   2230 ** Returns          void
   2231 **
   2232 *******************************************************************************/
   2233 void btm_read_rssi_complete (UINT8 *p)
   2234 {
   2235     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_rssi_cmpl_cb;
   2236     tBTM_RSSI_RESULTS        results;
   2237     UINT16                   handle;
   2238     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
   2239     UINT16                   index;
   2240 
   2241     BTM_TRACE_DEBUG("%s", __func__);
   2242     alarm_cancel(btm_cb.devcb.read_rssi_timer);
   2243     btm_cb.devcb.p_rssi_cmpl_cb = NULL;
   2244 
   2245     /* If there was a registered callback, call it */
   2246     if (p_cb)
   2247     {
   2248         STREAM_TO_UINT8  (results.hci_status, p);
   2249 
   2250         if (results.hci_status == HCI_SUCCESS)
   2251         {
   2252             results.status = BTM_SUCCESS;
   2253 
   2254             STREAM_TO_UINT16 (handle, p);
   2255 
   2256             STREAM_TO_UINT8 (results.rssi, p);
   2257             BTM_TRACE_DEBUG ("BTM RSSI Complete: rssi %d, hci status 0x%02x",
   2258                               results.rssi, results.hci_status);
   2259 
   2260             /* Search through the list of active channels for the correct BD Addr */
   2261             for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++)
   2262             {
   2263                 if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle))
   2264                 {
   2265                     memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN);
   2266                     break;
   2267                 }
   2268             }
   2269         }
   2270         else
   2271             results.status = BTM_ERR_PROCESSING;
   2272 
   2273         (*p_cb)(&results);
   2274     }
   2275 }
   2276 
   2277 /*******************************************************************************
   2278 **
   2279 ** Function         btm_read_link_quality_timeout
   2280 **
   2281 ** Description      Callback when reading the link quality times out.
   2282 **
   2283 ** Returns          void
   2284 **
   2285 *******************************************************************************/
   2286 void btm_read_link_quality_timeout(UNUSED_ATTR void *data)
   2287 {
   2288     tBTM_CMPL_CB  *p_cb = btm_cb.devcb.p_link_qual_cmpl_cb;
   2289     btm_cb.devcb.p_link_qual_cmpl_cb = NULL;
   2290     if (p_cb)
   2291         (*p_cb)((void *) NULL);
   2292 }
   2293 
   2294 /*******************************************************************************
   2295 **
   2296 ** Function         btm_read_link_quality_complete
   2297 **
   2298 ** Description      This function is called when the command complete message
   2299 **                  is received from the HCI for the read link quality.
   2300 **
   2301 ** Returns          void
   2302 **
   2303 *******************************************************************************/
   2304 void btm_read_link_quality_complete(UINT8 *p)
   2305 {
   2306     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_link_qual_cmpl_cb;
   2307     tBTM_LINK_QUALITY_RESULTS results;
   2308     UINT16                   handle;
   2309     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
   2310     UINT16                   index;
   2311 
   2312     BTM_TRACE_DEBUG("%s", __func__);
   2313     alarm_cancel(btm_cb.devcb.read_link_quality_timer);
   2314     btm_cb.devcb.p_link_qual_cmpl_cb = NULL;
   2315 
   2316     /* If there was a registered callback, call it */
   2317     if (p_cb)
   2318     {
   2319         STREAM_TO_UINT8  (results.hci_status, p);
   2320 
   2321         if (results.hci_status == HCI_SUCCESS)
   2322         {
   2323             results.status = BTM_SUCCESS;
   2324 
   2325             STREAM_TO_UINT16 (handle, p);
   2326 
   2327             STREAM_TO_UINT8 (results.link_quality, p);
   2328             BTM_TRACE_DEBUG ("BTM Link Quality Complete: Link Quality %d, hci status 0x%02x",
   2329                               results.link_quality, results.hci_status);
   2330 
   2331             /* Search through the list of active channels for the correct BD Addr */
   2332             for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++)
   2333             {
   2334                 if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle))
   2335                 {
   2336                     memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN);
   2337                     break;
   2338                 }
   2339             }
   2340         }
   2341         else
   2342             results.status = BTM_ERR_PROCESSING;
   2343 
   2344         (*p_cb)(&results);
   2345     }
   2346 }
   2347 
   2348 /*******************************************************************************
   2349 **
   2350 ** Function         btm_remove_acl
   2351 **
   2352 ** Description      This function is called to disconnect an ACL connection
   2353 **
   2354 ** Returns          BTM_SUCCESS if successfully initiated, otherwise BTM_NO_RESOURCES.
   2355 **
   2356 *******************************************************************************/
   2357 tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr, tBT_TRANSPORT transport)
   2358 {
   2359     UINT16  hci_handle = BTM_GetHCIConnHandle(bd_addr, transport);
   2360     tBTM_STATUS status = BTM_SUCCESS;
   2361 
   2362     BTM_TRACE_DEBUG ("btm_remove_acl");
   2363 #if BTM_DISC_DURING_RS == TRUE
   2364     tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
   2365 
   2366     /* Role Switch is pending, postpone until completed */
   2367     if (p_dev_rec && (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING))
   2368     {
   2369         p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
   2370     }
   2371     else    /* otherwise can disconnect right away */
   2372 #endif
   2373     {
   2374         if (hci_handle != 0xFFFF && p_dev_rec &&
   2375              p_dev_rec->sec_state!= BTM_SEC_STATE_DISCONNECTING)
   2376         {
   2377             if (!btsnd_hcic_disconnect (hci_handle, HCI_ERR_PEER_USER))
   2378                 status = BTM_NO_RESOURCES;
   2379         }
   2380         else
   2381             status = BTM_UNKNOWN_ADDR;
   2382     }
   2383 
   2384     return status;
   2385 }
   2386 
   2387 
   2388 /*******************************************************************************
   2389 **
   2390 ** Function         BTM_SetTraceLevel
   2391 **
   2392 ** Description      This function sets the trace level for BTM.  If called with
   2393 **                  a value of 0xFF, it simply returns the current trace level.
   2394 **
   2395 ** Returns          The new or current trace level
   2396 **
   2397 *******************************************************************************/
   2398 UINT8 BTM_SetTraceLevel (UINT8 new_level)
   2399 {
   2400     BTM_TRACE_DEBUG ("BTM_SetTraceLevel");
   2401     if (new_level != 0xFF)
   2402         btm_cb.trace_level = new_level;
   2403 
   2404     return(btm_cb.trace_level);
   2405 }
   2406 
   2407 /*******************************************************************************
   2408 **
   2409 ** Function         btm_cont_rswitch
   2410 **
   2411 ** Description      This function is called to continue processing an active
   2412 **                  role switch. It first disables encryption if enabled and
   2413 **                  EPR is not supported
   2414 **
   2415 ** Returns          void
   2416 **
   2417 *******************************************************************************/
   2418 void btm_cont_rswitch (tACL_CONN *p, tBTM_SEC_DEV_REC *p_dev_rec,
   2419                                      UINT8 hci_status)
   2420 {
   2421     BOOLEAN sw_ok = TRUE;
   2422     BTM_TRACE_DEBUG ("btm_cont_rswitch");
   2423     /* Check to see if encryption needs to be turned off if pending
   2424        change of link key or role switch */
   2425     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   2426     {
   2427         /* Must turn off Encryption first if necessary */
   2428         /* Some devices do not support switch or change of link key while encryption is on */
   2429         if (p_dev_rec != NULL && ((p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) != 0)
   2430             && !BTM_EPR_AVAILABLE(p))
   2431         {
   2432             if (btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE))
   2433             {
   2434                 p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF;
   2435                 if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   2436                     p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF;
   2437             }
   2438             else
   2439             {
   2440                 /* Error occurred; set states back to Idle */
   2441                 if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   2442                     sw_ok = FALSE;
   2443             }
   2444         }
   2445         else    /* Encryption not used or EPR supported, continue with switch
   2446                    and/or change of link key */
   2447         {
   2448             if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE)
   2449             {
   2450                 p->switch_role_state = BTM_ACL_SWKEY_STATE_IN_PROGRESS;
   2451 #if BTM_DISC_DURING_RS == TRUE
   2452                 if (p_dev_rec)
   2453                     p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING;
   2454 #endif
   2455                 sw_ok = btsnd_hcic_switch_role (p->remote_addr, (UINT8)!p->link_role);
   2456             }
   2457         }
   2458 
   2459         if (!sw_ok)
   2460         {
   2461             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
   2462             btm_acl_report_role_change(hci_status, p->remote_addr);
   2463         }
   2464     }
   2465 }
   2466 
   2467 /*******************************************************************************
   2468 **
   2469 ** Function         btm_acl_resubmit_page
   2470 **
   2471 ** Description      send pending page request
   2472 **
   2473 *******************************************************************************/
   2474 void btm_acl_resubmit_page (void)
   2475 {
   2476     tBTM_SEC_DEV_REC *p_dev_rec;
   2477     BT_HDR  *p_buf;
   2478     UINT8   *pp;
   2479     BD_ADDR bda;
   2480     BTM_TRACE_DEBUG ("btm_acl_resubmit_page");
   2481     /* If there were other page request schedule can start the next one */
   2482     if ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(btm_cb.page_queue)) != NULL)
   2483     {
   2484         /* skip 3 (2 bytes opcode and 1 byte len) to get to the bd_addr
   2485          * for both create_conn and rmt_name */
   2486         pp = (UINT8 *)(p_buf + 1) + p_buf->offset + 3;
   2487 
   2488         STREAM_TO_BDADDR (bda, pp);
   2489 
   2490         p_dev_rec = btm_find_or_alloc_dev (bda);
   2491 
   2492         memcpy (btm_cb.connecting_bda, p_dev_rec->bd_addr,   BD_ADDR_LEN);
   2493         memcpy (btm_cb.connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
   2494 
   2495         btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p_buf);
   2496     }
   2497     else
   2498         btm_cb.paging = FALSE;
   2499 }
   2500 
   2501 /*******************************************************************************
   2502 **
   2503 ** Function         btm_acl_reset_paging
   2504 **
   2505 ** Description      set paging to FALSE and free the page queue - called at hci_reset
   2506 **
   2507 *******************************************************************************/
   2508 void  btm_acl_reset_paging (void)
   2509 {
   2510     BT_HDR *p;
   2511     BTM_TRACE_DEBUG ("btm_acl_reset_paging");
   2512     /* If we sent reset we are definitely not paging any more */
   2513     while ((p = (BT_HDR *)fixed_queue_try_dequeue(btm_cb.page_queue)) != NULL)
   2514         osi_free(p);
   2515 
   2516     btm_cb.paging = FALSE;
   2517 }
   2518 
   2519 /*******************************************************************************
   2520 **
   2521 ** Function         btm_acl_paging
   2522 **
   2523 ** Description      send a paging command or queue it in btm_cb
   2524 **
   2525 *******************************************************************************/
   2526 void  btm_acl_paging (BT_HDR *p, BD_ADDR bda)
   2527 {
   2528     tBTM_SEC_DEV_REC *p_dev_rec;
   2529 
   2530     BTM_TRACE_DEBUG ("btm_acl_paging discing:%d, paging:%d BDA: %06x%06x",
   2531                       btm_cb.discing, btm_cb.paging,
   2532                       (bda[0]<<16) + (bda[1]<<8) + bda[2], (bda[3]<<16) + (bda[4] << 8) + bda[5]);
   2533     if (btm_cb.discing)
   2534     {
   2535         btm_cb.paging = TRUE;
   2536         fixed_queue_enqueue(btm_cb.page_queue, p);
   2537     }
   2538     else
   2539     {
   2540         if (!BTM_ACL_IS_CONNECTED (bda))
   2541         {
   2542             BTM_TRACE_DEBUG ("connecting_bda: %06x%06x",
   2543                               (btm_cb.connecting_bda[0]<<16) + (btm_cb.connecting_bda[1]<<8) +
   2544                                btm_cb.connecting_bda[2],
   2545                               (btm_cb.connecting_bda[3]<<16) + (btm_cb.connecting_bda[4] << 8) +
   2546                                btm_cb.connecting_bda[5]);
   2547             if (btm_cb.paging &&
   2548                 memcmp (bda, btm_cb.connecting_bda, BD_ADDR_LEN) != 0)
   2549             {
   2550                 fixed_queue_enqueue(btm_cb.page_queue, p);
   2551             }
   2552             else
   2553             {
   2554                 p_dev_rec = btm_find_or_alloc_dev (bda);
   2555                 memcpy (btm_cb.connecting_bda, p_dev_rec->bd_addr,   BD_ADDR_LEN);
   2556                 memcpy (btm_cb.connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
   2557 
   2558                 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
   2559             }
   2560 
   2561             btm_cb.paging = TRUE;
   2562         }
   2563         else /* ACL is already up */
   2564         {
   2565             btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
   2566         }
   2567     }
   2568 }
   2569 
   2570 /*******************************************************************************
   2571 **
   2572 ** Function         btm_acl_notif_conn_collision
   2573 **
   2574 ** Description      Send connection collision event to upper layer if registered
   2575 **
   2576 ** Returns          TRUE if sent out to upper layer,
   2577 **                  FALSE if no one needs the notification.
   2578 **
   2579 *******************************************************************************/
   2580 BOOLEAN  btm_acl_notif_conn_collision (BD_ADDR bda)
   2581 {
   2582     tBTM_BL_EVENT_DATA  evt_data;
   2583 
   2584     /* Report possible collision to the upper layer. */
   2585     if (btm_cb.p_bl_changed_cb)
   2586     {
   2587         BTM_TRACE_DEBUG ("btm_acl_notif_conn_collision: RemBdAddr: %02x%02x%02x%02x%02x%02x",
   2588                           bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
   2589 
   2590         evt_data.event = BTM_BL_COLLISION_EVT;
   2591         evt_data.conn.p_bda = bda;
   2592 
   2593 #if BLE_INCLUDED == TRUE
   2594         evt_data.conn.transport = BT_TRANSPORT_BR_EDR;
   2595         evt_data.conn.handle = BTM_INVALID_HCI_HANDLE;
   2596 #endif
   2597         (*btm_cb.p_bl_changed_cb)(&evt_data);
   2598         return TRUE;
   2599     }
   2600     else
   2601         return FALSE;
   2602 }
   2603 
   2604 
   2605 /*******************************************************************************
   2606 **
   2607 ** Function         btm_acl_chk_peer_pkt_type_support
   2608 **
   2609 ** Description      Check if peer supports requested packets
   2610 **
   2611 *******************************************************************************/
   2612 void btm_acl_chk_peer_pkt_type_support (tACL_CONN *p, UINT16 *p_pkt_type)
   2613 {
   2614     /* 3 and 5 slot packets? */
   2615     if (!HCI_3_SLOT_PACKETS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   2616         *p_pkt_type &= ~(BTM_ACL_PKT_TYPES_MASK_DH3 +BTM_ACL_PKT_TYPES_MASK_DM3);
   2617 
   2618     if (!HCI_5_SLOT_PACKETS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   2619         *p_pkt_type &= ~(BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5);
   2620 
   2621     /* 2 and 3 MPS support? */
   2622     if (!HCI_EDR_ACL_2MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   2623         /* Not supported. Add 'not_supported' mask for all 2MPS packet types */
   2624         *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 +
   2625                             BTM_ACL_PKT_TYPES_MASK_NO_2_DH5);
   2626 
   2627     if (!HCI_EDR_ACL_3MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   2628         /* Not supported. Add 'not_supported' mask for all 3MPS packet types */
   2629         *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 +
   2630                             BTM_ACL_PKT_TYPES_MASK_NO_3_DH5);
   2631 
   2632     /* EDR 3 and 5 slot support? */
   2633     if (HCI_EDR_ACL_2MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])
   2634      || HCI_EDR_ACL_3MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   2635     {
   2636         if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   2637             /* Not supported. Add 'not_supported' mask for all 3-slot EDR packet types */
   2638             *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3);
   2639 
   2640         if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   2641             /* Not supported. Add 'not_supported' mask for all 5-slot EDR packet types */
   2642             *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH5 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH5);
   2643     }
   2644 }
   2645