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