Home | History | Annotate | Download | only in btu
      1 /******************************************************************************
      2  *
      3  *  Copyright 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains functions that interface with the HCI transport. On
     22  *  the receive side, it routes events to the appropriate handler, e.g.
     23  *  L2CAP, ScoMgr. On the transmit side, it manages the command
     24  *  transmission.
     25  *
     26  ******************************************************************************/
     27 
     28 #define LOG_TAG "bt_btu_hcif"
     29 
     30 #include <base/bind.h>
     31 #include <base/callback.h>
     32 #include <base/location.h>
     33 #include <base/logging.h>
     34 #include <base/threading/thread.h>
     35 #include <stdio.h>
     36 #include <stdlib.h>
     37 #include <string.h>
     38 
     39 #include "bt_common.h"
     40 #include "bt_types.h"
     41 #include "bt_utils.h"
     42 #include "btm_api.h"
     43 #include "btm_int.h"
     44 #include "btu.h"
     45 #include "device/include/controller.h"
     46 #include "hci_layer.h"
     47 #include "hcimsgs.h"
     48 #include "l2c_int.h"
     49 #include "osi/include/log.h"
     50 #include "osi/include/osi.h"
     51 
     52 using tracked_objects::Location;
     53 
     54 extern void btm_process_cancel_complete(uint8_t status, uint8_t mode);
     55 extern void btm_ble_test_command_complete(uint8_t* p);
     56 
     57 /******************************************************************************/
     58 /*            L O C A L    F U N C T I O N     P R O T O T Y P E S            */
     59 /******************************************************************************/
     60 static void btu_hcif_inquiry_comp_evt(uint8_t* p);
     61 static void btu_hcif_inquiry_result_evt(uint8_t* p);
     62 static void btu_hcif_inquiry_rssi_result_evt(uint8_t* p);
     63 static void btu_hcif_extended_inquiry_result_evt(uint8_t* p);
     64 
     65 static void btu_hcif_connection_comp_evt(uint8_t* p);
     66 static void btu_hcif_connection_request_evt(uint8_t* p);
     67 static void btu_hcif_disconnection_comp_evt(uint8_t* p);
     68 static void btu_hcif_authentication_comp_evt(uint8_t* p);
     69 static void btu_hcif_rmt_name_request_comp_evt(uint8_t* p, uint16_t evt_len);
     70 static void btu_hcif_encryption_change_evt(uint8_t* p);
     71 static void btu_hcif_read_rmt_features_comp_evt(uint8_t* p);
     72 static void btu_hcif_read_rmt_ext_features_comp_evt(uint8_t* p);
     73 static void btu_hcif_read_rmt_version_comp_evt(uint8_t* p);
     74 static void btu_hcif_qos_setup_comp_evt(uint8_t* p);
     75 static void btu_hcif_command_complete_evt(BT_HDR* response, void* context);
     76 static void btu_hcif_command_status_evt(uint8_t status, BT_HDR* command,
     77                                         void* context);
     78 static void btu_hcif_hardware_error_evt(uint8_t* p);
     79 static void btu_hcif_flush_occured_evt(void);
     80 static void btu_hcif_role_change_evt(uint8_t* p);
     81 static void btu_hcif_num_compl_data_pkts_evt(uint8_t* p);
     82 static void btu_hcif_mode_change_evt(uint8_t* p);
     83 static void btu_hcif_pin_code_request_evt(uint8_t* p);
     84 static void btu_hcif_link_key_request_evt(uint8_t* p);
     85 static void btu_hcif_link_key_notification_evt(uint8_t* p);
     86 static void btu_hcif_loopback_command_evt(void);
     87 static void btu_hcif_data_buf_overflow_evt(void);
     88 static void btu_hcif_max_slots_changed_evt(void);
     89 static void btu_hcif_read_clock_off_comp_evt(uint8_t* p);
     90 static void btu_hcif_conn_pkt_type_change_evt(void);
     91 static void btu_hcif_qos_violation_evt(uint8_t* p);
     92 static void btu_hcif_page_scan_mode_change_evt(void);
     93 static void btu_hcif_page_scan_rep_mode_chng_evt(void);
     94 static void btu_hcif_esco_connection_comp_evt(uint8_t* p);
     95 static void btu_hcif_esco_connection_chg_evt(uint8_t* p);
     96 
     97 /* Simple Pairing Events */
     98 static void btu_hcif_host_support_evt(uint8_t* p);
     99 static void btu_hcif_io_cap_request_evt(uint8_t* p);
    100 static void btu_hcif_io_cap_response_evt(uint8_t* p);
    101 static void btu_hcif_user_conf_request_evt(uint8_t* p);
    102 static void btu_hcif_user_passkey_request_evt(uint8_t* p);
    103 static void btu_hcif_user_passkey_notif_evt(uint8_t* p);
    104 static void btu_hcif_keypress_notif_evt(uint8_t* p);
    105 static void btu_hcif_rem_oob_request_evt(uint8_t* p);
    106 
    107 static void btu_hcif_simple_pair_complete_evt(uint8_t* p);
    108 #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE
    109 static void btu_hcif_enhanced_flush_complete_evt(void);
    110 #endif
    111 
    112 #if (BTM_SSR_INCLUDED == TRUE)
    113 static void btu_hcif_ssr_evt(uint8_t* p, uint16_t evt_len);
    114 #endif /* BTM_SSR_INCLUDED == TRUE */
    115 
    116 static void btu_ble_ll_conn_complete_evt(uint8_t* p, uint16_t evt_len);
    117 static void btu_ble_read_remote_feat_evt(uint8_t* p);
    118 static void btu_ble_ll_conn_param_upd_evt(uint8_t* p, uint16_t evt_len);
    119 static void btu_ble_proc_ltk_req(uint8_t* p);
    120 static void btu_hcif_encryption_key_refresh_cmpl_evt(uint8_t* p);
    121 static void btu_ble_data_length_change_evt(uint8_t* p, uint16_t evt_len);
    122 #if (BLE_LLT_INCLUDED == TRUE)
    123 static void btu_ble_rc_param_req_evt(uint8_t* p);
    124 #endif
    125 #if (BLE_PRIVACY_SPT == TRUE)
    126 static void btu_ble_proc_enhanced_conn_cmpl(uint8_t* p, uint16_t evt_len);
    127 #endif
    128 
    129 static void do_in_hci_thread(const tracked_objects::Location& from_here,
    130                              const base::Closure& task) {
    131   base::MessageLoop* hci_message_loop = get_message_loop();
    132   if (!hci_message_loop || !hci_message_loop->task_runner().get()) {
    133     LOG_ERROR(LOG_TAG, "%s: HCI message loop not running, accessed from %s",
    134               __func__, from_here.ToString().c_str());
    135     return;
    136   }
    137 
    138   hci_message_loop->task_runner()->PostTask(from_here, task);
    139 }
    140 
    141 /*******************************************************************************
    142  *
    143  * Function         btu_hcif_process_event
    144  *
    145  * Description      This function is called when an event is received from
    146  *                  the Host Controller.
    147  *
    148  * Returns          void
    149  *
    150  ******************************************************************************/
    151 void btu_hcif_process_event(UNUSED_ATTR uint8_t controller_id, BT_HDR* p_msg) {
    152   uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset;
    153   uint8_t hci_evt_code, hci_evt_len;
    154   uint8_t ble_sub_code;
    155   STREAM_TO_UINT8(hci_evt_code, p);
    156   STREAM_TO_UINT8(hci_evt_len, p);
    157 
    158   switch (hci_evt_code) {
    159     case HCI_INQUIRY_COMP_EVT:
    160       btu_hcif_inquiry_comp_evt(p);
    161       break;
    162     case HCI_INQUIRY_RESULT_EVT:
    163       btu_hcif_inquiry_result_evt(p);
    164       break;
    165     case HCI_INQUIRY_RSSI_RESULT_EVT:
    166       btu_hcif_inquiry_rssi_result_evt(p);
    167       break;
    168     case HCI_EXTENDED_INQUIRY_RESULT_EVT:
    169       btu_hcif_extended_inquiry_result_evt(p);
    170       break;
    171     case HCI_CONNECTION_COMP_EVT:
    172       btu_hcif_connection_comp_evt(p);
    173       break;
    174     case HCI_CONNECTION_REQUEST_EVT:
    175       btu_hcif_connection_request_evt(p);
    176       break;
    177     case HCI_DISCONNECTION_COMP_EVT:
    178       btu_hcif_disconnection_comp_evt(p);
    179       break;
    180     case HCI_AUTHENTICATION_COMP_EVT:
    181       btu_hcif_authentication_comp_evt(p);
    182       break;
    183     case HCI_RMT_NAME_REQUEST_COMP_EVT:
    184       btu_hcif_rmt_name_request_comp_evt(p, hci_evt_len);
    185       break;
    186     case HCI_ENCRYPTION_CHANGE_EVT:
    187       btu_hcif_encryption_change_evt(p);
    188       break;
    189     case HCI_ENCRYPTION_KEY_REFRESH_COMP_EVT:
    190       btu_hcif_encryption_key_refresh_cmpl_evt(p);
    191       break;
    192     case HCI_READ_RMT_FEATURES_COMP_EVT:
    193       btu_hcif_read_rmt_features_comp_evt(p);
    194       break;
    195     case HCI_READ_RMT_EXT_FEATURES_COMP_EVT:
    196       btu_hcif_read_rmt_ext_features_comp_evt(p);
    197       break;
    198     case HCI_READ_RMT_VERSION_COMP_EVT:
    199       btu_hcif_read_rmt_version_comp_evt(p);
    200       break;
    201     case HCI_QOS_SETUP_COMP_EVT:
    202       btu_hcif_qos_setup_comp_evt(p);
    203       break;
    204     case HCI_COMMAND_COMPLETE_EVT:
    205       LOG_ERROR(LOG_TAG,
    206                 "%s should not have received a command complete event. "
    207                 "Someone didn't go through the hci transmit_command function.",
    208                 __func__);
    209       break;
    210     case HCI_COMMAND_STATUS_EVT:
    211       LOG_ERROR(LOG_TAG,
    212                 "%s should not have received a command status event. "
    213                 "Someone didn't go through the hci transmit_command function.",
    214                 __func__);
    215       break;
    216     case HCI_HARDWARE_ERROR_EVT:
    217       btu_hcif_hardware_error_evt(p);
    218       break;
    219     case HCI_FLUSH_OCCURED_EVT:
    220       btu_hcif_flush_occured_evt();
    221       break;
    222     case HCI_ROLE_CHANGE_EVT:
    223       btu_hcif_role_change_evt(p);
    224       break;
    225     case HCI_NUM_COMPL_DATA_PKTS_EVT:
    226       btu_hcif_num_compl_data_pkts_evt(p);
    227       break;
    228     case HCI_MODE_CHANGE_EVT:
    229       btu_hcif_mode_change_evt(p);
    230       break;
    231     case HCI_PIN_CODE_REQUEST_EVT:
    232       btu_hcif_pin_code_request_evt(p);
    233       break;
    234     case HCI_LINK_KEY_REQUEST_EVT:
    235       btu_hcif_link_key_request_evt(p);
    236       break;
    237     case HCI_LINK_KEY_NOTIFICATION_EVT:
    238       btu_hcif_link_key_notification_evt(p);
    239       break;
    240     case HCI_LOOPBACK_COMMAND_EVT:
    241       btu_hcif_loopback_command_evt();
    242       break;
    243     case HCI_DATA_BUF_OVERFLOW_EVT:
    244       btu_hcif_data_buf_overflow_evt();
    245       break;
    246     case HCI_MAX_SLOTS_CHANGED_EVT:
    247       btu_hcif_max_slots_changed_evt();
    248       break;
    249     case HCI_READ_CLOCK_OFF_COMP_EVT:
    250       btu_hcif_read_clock_off_comp_evt(p);
    251       break;
    252     case HCI_CONN_PKT_TYPE_CHANGE_EVT:
    253       btu_hcif_conn_pkt_type_change_evt();
    254       break;
    255     case HCI_QOS_VIOLATION_EVT:
    256       btu_hcif_qos_violation_evt(p);
    257       break;
    258     case HCI_PAGE_SCAN_MODE_CHANGE_EVT:
    259       btu_hcif_page_scan_mode_change_evt();
    260       break;
    261     case HCI_PAGE_SCAN_REP_MODE_CHNG_EVT:
    262       btu_hcif_page_scan_rep_mode_chng_evt();
    263       break;
    264     case HCI_ESCO_CONNECTION_COMP_EVT:
    265       btu_hcif_esco_connection_comp_evt(p);
    266       break;
    267     case HCI_ESCO_CONNECTION_CHANGED_EVT:
    268       btu_hcif_esco_connection_chg_evt(p);
    269       break;
    270 #if (BTM_SSR_INCLUDED == TRUE)
    271     case HCI_SNIFF_SUB_RATE_EVT:
    272       btu_hcif_ssr_evt(p, hci_evt_len);
    273       break;
    274 #endif /* BTM_SSR_INCLUDED == TRUE */
    275     case HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT:
    276       btu_hcif_host_support_evt(p);
    277       break;
    278     case HCI_IO_CAPABILITY_REQUEST_EVT:
    279       btu_hcif_io_cap_request_evt(p);
    280       break;
    281     case HCI_IO_CAPABILITY_RESPONSE_EVT:
    282       btu_hcif_io_cap_response_evt(p);
    283       break;
    284     case HCI_USER_CONFIRMATION_REQUEST_EVT:
    285       btu_hcif_user_conf_request_evt(p);
    286       break;
    287     case HCI_USER_PASSKEY_REQUEST_EVT:
    288       btu_hcif_user_passkey_request_evt(p);
    289       break;
    290     case HCI_REMOTE_OOB_DATA_REQUEST_EVT:
    291       btu_hcif_rem_oob_request_evt(p);
    292       break;
    293     case HCI_SIMPLE_PAIRING_COMPLETE_EVT:
    294       btu_hcif_simple_pair_complete_evt(p);
    295       break;
    296     case HCI_USER_PASSKEY_NOTIFY_EVT:
    297       btu_hcif_user_passkey_notif_evt(p);
    298       break;
    299     case HCI_KEYPRESS_NOTIFY_EVT:
    300       btu_hcif_keypress_notif_evt(p);
    301       break;
    302 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
    303     case HCI_ENHANCED_FLUSH_COMPLETE_EVT:
    304       btu_hcif_enhanced_flush_complete_evt();
    305       break;
    306 #endif
    307 
    308     case HCI_BLE_EVENT: {
    309       STREAM_TO_UINT8(ble_sub_code, p);
    310 
    311       HCI_TRACE_EVENT("BLE HCI(id=%d) event = 0x%02x)", hci_evt_code,
    312                       ble_sub_code);
    313 
    314       uint8_t ble_evt_len = hci_evt_len - 1;
    315       switch (ble_sub_code) {
    316         case HCI_BLE_ADV_PKT_RPT_EVT: /* result of inquiry */
    317           HCI_TRACE_EVENT("HCI_BLE_ADV_PKT_RPT_EVT");
    318           btm_ble_process_adv_pkt(ble_evt_len, p);
    319           break;
    320         case HCI_BLE_CONN_COMPLETE_EVT:
    321           btu_ble_ll_conn_complete_evt(p, hci_evt_len);
    322           break;
    323         case HCI_BLE_LL_CONN_PARAM_UPD_EVT:
    324           btu_ble_ll_conn_param_upd_evt(p, hci_evt_len);
    325           break;
    326         case HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT:
    327           btu_ble_read_remote_feat_evt(p);
    328           break;
    329         case HCI_BLE_LTK_REQ_EVT: /* received only at slave device */
    330           btu_ble_proc_ltk_req(p);
    331           break;
    332 #if (BLE_PRIVACY_SPT == TRUE)
    333         case HCI_BLE_ENHANCED_CONN_COMPLETE_EVT:
    334           btu_ble_proc_enhanced_conn_cmpl(p, hci_evt_len);
    335           break;
    336 #endif
    337 #if (BLE_LLT_INCLUDED == TRUE)
    338         case HCI_BLE_RC_PARAM_REQ_EVT:
    339           btu_ble_rc_param_req_evt(p);
    340           break;
    341 #endif
    342         case HCI_BLE_DATA_LENGTH_CHANGE_EVT:
    343           btu_ble_data_length_change_evt(p, hci_evt_len);
    344           break;
    345 
    346         case HCI_BLE_PHY_UPDATE_COMPLETE_EVT:
    347           btm_ble_process_phy_update_pkt(ble_evt_len, p);
    348           break;
    349 
    350         case HCI_LE_EXTENDED_ADVERTISING_REPORT_EVT:
    351           btm_ble_process_ext_adv_pkt(hci_evt_len, p);
    352           break;
    353 
    354         case HCI_LE_ADVERTISING_SET_TERMINATED_EVT:
    355           btm_le_on_advertising_set_terminated(p, hci_evt_len);
    356           break;
    357       }
    358       break;
    359     }
    360 
    361     case HCI_VENDOR_SPECIFIC_EVT:
    362       btm_vendor_specific_evt(p, hci_evt_len);
    363       break;
    364   }
    365 }
    366 
    367 /*******************************************************************************
    368  *
    369  * Function         btu_hcif_send_cmd
    370  *
    371  * Description      This function is called to send commands to the Host
    372  *                  Controller.
    373  *
    374  * Returns          void
    375  *
    376  ******************************************************************************/
    377 void btu_hcif_send_cmd(UNUSED_ATTR uint8_t controller_id, BT_HDR* p_buf) {
    378   if (!p_buf) return;
    379 
    380   uint16_t opcode;
    381   uint8_t* stream = p_buf->data + p_buf->offset;
    382   void* vsc_callback = NULL;
    383 
    384   STREAM_TO_UINT16(opcode, stream);
    385 
    386   // Eww...horrible hackery here
    387   /* If command was a VSC, then extract command_complete callback */
    388   if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC ||
    389       (opcode == HCI_BLE_RAND) || (opcode == HCI_BLE_ENCRYPT)) {
    390     vsc_callback = *((void**)(p_buf + 1));
    391   }
    392 
    393   hci_layer_get_interface()->transmit_command(
    394       p_buf, btu_hcif_command_complete_evt, btu_hcif_command_status_evt,
    395       vsc_callback);
    396 }
    397 
    398 using hci_cmd_cb = base::Callback<void(uint8_t* /* return_parameters */,
    399                                        uint16_t /* return_parameters_length*/)>;
    400 
    401 struct cmd_with_cb_data {
    402   hci_cmd_cb cb;
    403   Location posted_from;
    404 };
    405 
    406 void cmd_with_cb_data_init(cmd_with_cb_data* cb_wrapper) {
    407   new (&cb_wrapper->cb) hci_cmd_cb;
    408   new (&cb_wrapper->posted_from) Location;
    409 }
    410 
    411 void cmd_with_cb_data_cleanup(cmd_with_cb_data* cb_wrapper) {
    412   cb_wrapper->cb.~hci_cmd_cb();
    413   cb_wrapper->posted_from.~Location();
    414 }
    415 
    416 static void btu_hcif_command_complete_evt_with_cb_on_task(BT_HDR* event,
    417                                                           void* context) {
    418   command_opcode_t opcode;
    419   uint8_t* stream =
    420       event->data + event->offset +
    421       3;  // 2 to skip the event headers, 1 to skip the command credits
    422   STREAM_TO_UINT16(opcode, stream);
    423 
    424   cmd_with_cb_data* cb_wrapper = (cmd_with_cb_data*)context;
    425   HCI_TRACE_DEBUG("command complete for: %s",
    426                   cb_wrapper->posted_from.ToString().c_str());
    427   cb_wrapper->cb.Run(stream, event->len - 5);
    428   cmd_with_cb_data_cleanup(cb_wrapper);
    429   osi_free(cb_wrapper);
    430 
    431   osi_free(event);
    432 }
    433 
    434 static void btu_hcif_command_complete_evt_with_cb(BT_HDR* response,
    435                                                   void* context) {
    436   do_in_hci_thread(FROM_HERE,
    437                    base::Bind(btu_hcif_command_complete_evt_with_cb_on_task,
    438                               response, context));
    439 }
    440 
    441 static void btu_hcif_command_status_evt_with_cb_on_task(uint8_t status,
    442                                                         BT_HDR* event,
    443                                                         void* context) {
    444   command_opcode_t opcode;
    445   uint8_t* stream = event->data + event->offset;
    446   STREAM_TO_UINT16(opcode, stream);
    447 
    448   CHECK(status != 0);
    449 
    450   // report command status error
    451   cmd_with_cb_data* cb_wrapper = (cmd_with_cb_data*)context;
    452   HCI_TRACE_DEBUG("command status for: %s",
    453                   cb_wrapper->posted_from.ToString().c_str());
    454   cb_wrapper->cb.Run(&status, sizeof(uint16_t));
    455   cmd_with_cb_data_cleanup(cb_wrapper);
    456   osi_free(cb_wrapper);
    457 
    458   osi_free(event);
    459 }
    460 
    461 static void btu_hcif_command_status_evt_with_cb(uint8_t status, BT_HDR* command,
    462                                                 void* context) {
    463   // Command is pending, we  report only error.
    464   if (!status) {
    465     osi_free(command);
    466     return;
    467   }
    468 
    469   do_in_hci_thread(
    470       FROM_HERE, base::Bind(btu_hcif_command_status_evt_with_cb_on_task, status,
    471                             command, context));
    472 }
    473 
    474 /* This function is called to send commands to the Host Controller. |cb| is
    475  * called when command status event is called with error code, or when the
    476  * command complete event is received. */
    477 void btu_hcif_send_cmd_with_cb(const tracked_objects::Location& posted_from,
    478                                uint16_t opcode, uint8_t* params,
    479                                uint8_t params_len, hci_cmd_cb cb) {
    480   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    481   uint8_t* pp = (uint8_t*)(p + 1);
    482 
    483   p->len = HCIC_PREAMBLE_SIZE + params_len;
    484   p->offset = 0;
    485 
    486   UINT16_TO_STREAM(pp, opcode);
    487   UINT8_TO_STREAM(pp, params_len);
    488   if (params) {
    489     memcpy(pp, params, params_len);
    490   }
    491 
    492   cmd_with_cb_data* cb_wrapper =
    493       (cmd_with_cb_data*)osi_malloc(sizeof(cmd_with_cb_data));
    494 
    495   cmd_with_cb_data_init(cb_wrapper);
    496   cb_wrapper->cb = cb;
    497   cb_wrapper->posted_from = posted_from;
    498 
    499   hci_layer_get_interface()->transmit_command(
    500       p, btu_hcif_command_complete_evt_with_cb,
    501       btu_hcif_command_status_evt_with_cb, (void*)cb_wrapper);
    502 }
    503 
    504 /*******************************************************************************
    505  *
    506  * Function         btu_hcif_inquiry_comp_evt
    507  *
    508  * Description      Process event HCI_INQUIRY_COMP_EVT
    509  *
    510  * Returns          void
    511  *
    512  ******************************************************************************/
    513 static void btu_hcif_inquiry_comp_evt(uint8_t* p) {
    514   uint8_t status;
    515 
    516   STREAM_TO_UINT8(status, p);
    517 
    518   /* Tell inquiry processing that we are done */
    519   btm_process_inq_complete(status, BTM_BR_INQUIRY_MASK);
    520 }
    521 
    522 /*******************************************************************************
    523  *
    524  * Function         btu_hcif_inquiry_result_evt
    525  *
    526  * Description      Process event HCI_INQUIRY_RESULT_EVT
    527  *
    528  * Returns          void
    529  *
    530  ******************************************************************************/
    531 static void btu_hcif_inquiry_result_evt(uint8_t* p) {
    532   /* Store results in the cache */
    533   btm_process_inq_results(p, BTM_INQ_RESULT_STANDARD);
    534 }
    535 
    536 /*******************************************************************************
    537  *
    538  * Function         btu_hcif_inquiry_rssi_result_evt
    539  *
    540  * Description      Process event HCI_INQUIRY_RSSI_RESULT_EVT
    541  *
    542  * Returns          void
    543  *
    544  ******************************************************************************/
    545 static void btu_hcif_inquiry_rssi_result_evt(uint8_t* p) {
    546   /* Store results in the cache */
    547   btm_process_inq_results(p, BTM_INQ_RESULT_WITH_RSSI);
    548 }
    549 
    550 /*******************************************************************************
    551  *
    552  * Function         btu_hcif_extended_inquiry_result_evt
    553  *
    554  * Description      Process event HCI_EXTENDED_INQUIRY_RESULT_EVT
    555  *
    556  * Returns          void
    557  *
    558  ******************************************************************************/
    559 static void btu_hcif_extended_inquiry_result_evt(uint8_t* p) {
    560   /* Store results in the cache */
    561   btm_process_inq_results(p, BTM_INQ_RESULT_EXTENDED);
    562 }
    563 
    564 /*******************************************************************************
    565  *
    566  * Function         btu_hcif_connection_comp_evt
    567  *
    568  * Description      Process event HCI_CONNECTION_COMP_EVT
    569  *
    570  * Returns          void
    571  *
    572  ******************************************************************************/
    573 static void btu_hcif_connection_comp_evt(uint8_t* p) {
    574   uint8_t status;
    575   uint16_t handle;
    576   RawAddress bda;
    577   uint8_t link_type;
    578   uint8_t enc_mode;
    579 #if (BTM_SCO_INCLUDED == TRUE)
    580   tBTM_ESCO_DATA esco_data;
    581 #endif
    582 
    583   STREAM_TO_UINT8(status, p);
    584   STREAM_TO_UINT16(handle, p);
    585   STREAM_TO_BDADDR(bda, p);
    586   STREAM_TO_UINT8(link_type, p);
    587   STREAM_TO_UINT8(enc_mode, p);
    588 
    589   handle = HCID_GET_HANDLE(handle);
    590 
    591   if (status != HCI_SUCCESS) {
    592     HCI_TRACE_DEBUG(
    593         "%s: Connection failed: status=%d, handle=%d, link_type=%d, "
    594         "enc_mode=%d",
    595         __func__, status, handle, link_type, enc_mode);
    596   }
    597 
    598   if (link_type == HCI_LINK_TYPE_ACL) {
    599     btm_sec_connected(bda, handle, status, enc_mode);
    600 
    601     l2c_link_hci_conn_comp(status, handle, bda);
    602   }
    603 #if (BTM_SCO_INCLUDED == TRUE)
    604   else {
    605     memset(&esco_data, 0, sizeof(tBTM_ESCO_DATA));
    606     /* esco_data.link_type = HCI_LINK_TYPE_SCO; already zero */
    607     esco_data.bd_addr = bda;
    608     btm_sco_connected(status, &bda, handle, &esco_data);
    609   }
    610 #endif /* BTM_SCO_INCLUDED */
    611 }
    612 
    613 /*******************************************************************************
    614  *
    615  * Function         btu_hcif_connection_request_evt
    616  *
    617  * Description      Process event HCI_CONNECTION_REQUEST_EVT
    618  *
    619  * Returns          void
    620  *
    621  ******************************************************************************/
    622 static void btu_hcif_connection_request_evt(uint8_t* p) {
    623   RawAddress bda;
    624   DEV_CLASS dc;
    625   uint8_t link_type;
    626 
    627   STREAM_TO_BDADDR(bda, p);
    628   STREAM_TO_DEVCLASS(dc, p);
    629   STREAM_TO_UINT8(link_type, p);
    630 
    631   /* Pass request to security manager to check connect filters before */
    632   /* passing request to l2cap */
    633   if (link_type == HCI_LINK_TYPE_ACL) {
    634     btm_sec_conn_req(bda, dc);
    635   }
    636 #if (BTM_SCO_INCLUDED == TRUE)
    637   else {
    638     btm_sco_conn_req(bda, dc, link_type);
    639   }
    640 #endif /* BTM_SCO_INCLUDED */
    641 }
    642 
    643 /*******************************************************************************
    644  *
    645  * Function         btu_hcif_disconnection_comp_evt
    646  *
    647  * Description      Process event HCI_DISCONNECTION_COMP_EVT
    648  *
    649  * Returns          void
    650  *
    651  ******************************************************************************/
    652 static void btu_hcif_disconnection_comp_evt(uint8_t* p) {
    653   uint16_t handle;
    654   uint8_t reason;
    655 
    656   ++p;
    657   STREAM_TO_UINT16(handle, p);
    658   STREAM_TO_UINT8(reason, p);
    659 
    660   handle = HCID_GET_HANDLE(handle);
    661 
    662   if ((reason != HCI_ERR_CONN_CAUSE_LOCAL_HOST) &&
    663       (reason != HCI_ERR_PEER_USER)) {
    664     /* Uncommon disconnection reasons */
    665     HCI_TRACE_DEBUG("%s: Got Disconn Complete Event: reason=%d, handle=%d",
    666                     __func__, reason, handle);
    667   }
    668 
    669 #if (BTM_SCO_INCLUDED == TRUE)
    670   /* If L2CAP doesn't know about it, send it to SCO */
    671   if (!l2c_link_hci_disc_comp(handle, reason)) btm_sco_removed(handle, reason);
    672 #else
    673   l2c_link_hci_disc_comp(handle, reason);
    674 #endif /* BTM_SCO_INCLUDED */
    675 
    676   /* Notify security manager */
    677   btm_sec_disconnected(handle, reason);
    678 }
    679 
    680 /*******************************************************************************
    681  *
    682  * Function         btu_hcif_authentication_comp_evt
    683  *
    684  * Description      Process event HCI_AUTHENTICATION_COMP_EVT
    685  *
    686  * Returns          void
    687  *
    688  ******************************************************************************/
    689 static void btu_hcif_authentication_comp_evt(uint8_t* p) {
    690   uint8_t status;
    691   uint16_t handle;
    692 
    693   STREAM_TO_UINT8(status, p);
    694   STREAM_TO_UINT16(handle, p);
    695 
    696   btm_sec_auth_complete(handle, status);
    697 }
    698 
    699 /*******************************************************************************
    700  *
    701  * Function         btu_hcif_rmt_name_request_comp_evt
    702  *
    703  * Description      Process event HCI_RMT_NAME_REQUEST_COMP_EVT
    704  *
    705  * Returns          void
    706  *
    707  ******************************************************************************/
    708 static void btu_hcif_rmt_name_request_comp_evt(uint8_t* p, uint16_t evt_len) {
    709   uint8_t status;
    710   RawAddress bd_addr;
    711 
    712   STREAM_TO_UINT8(status, p);
    713   STREAM_TO_BDADDR(bd_addr, p);
    714 
    715   evt_len -= (1 + BD_ADDR_LEN);
    716 
    717   btm_process_remote_name(&bd_addr, p, evt_len, status);
    718 
    719   btm_sec_rmt_name_request_complete(&bd_addr, p, status);
    720 }
    721 
    722 /*******************************************************************************
    723  *
    724  * Function         btu_hcif_encryption_change_evt
    725  *
    726  * Description      Process event HCI_ENCRYPTION_CHANGE_EVT
    727  *
    728  * Returns          void
    729  *
    730  ******************************************************************************/
    731 static void btu_hcif_encryption_change_evt(uint8_t* p) {
    732   uint8_t status;
    733   uint16_t handle;
    734   uint8_t encr_enable;
    735 
    736   STREAM_TO_UINT8(status, p);
    737   STREAM_TO_UINT16(handle, p);
    738   STREAM_TO_UINT8(encr_enable, p);
    739 
    740   btm_acl_encrypt_change(handle, status, encr_enable);
    741   btm_sec_encrypt_change(handle, status, encr_enable);
    742 }
    743 
    744 /*******************************************************************************
    745  *
    746  * Function         btu_hcif_read_rmt_features_comp_evt
    747  *
    748  * Description      Process event HCI_READ_RMT_FEATURES_COMP_EVT
    749  *
    750  * Returns          void
    751  *
    752  ******************************************************************************/
    753 static void btu_hcif_read_rmt_features_comp_evt(uint8_t* p) {
    754   btm_read_remote_features_complete(p);
    755 }
    756 
    757 /*******************************************************************************
    758  *
    759  * Function         btu_hcif_read_rmt_ext_features_comp_evt
    760  *
    761  * Description      Process event HCI_READ_RMT_EXT_FEATURES_COMP_EVT
    762  *
    763  * Returns          void
    764  *
    765  ******************************************************************************/
    766 static void btu_hcif_read_rmt_ext_features_comp_evt(uint8_t* p) {
    767   uint8_t* p_cur = p;
    768   uint8_t status;
    769   uint16_t handle;
    770 
    771   STREAM_TO_UINT8(status, p_cur);
    772 
    773   if (status == HCI_SUCCESS)
    774     btm_read_remote_ext_features_complete(p);
    775   else {
    776     STREAM_TO_UINT16(handle, p_cur);
    777     btm_read_remote_ext_features_failed(status, handle);
    778   }
    779 }
    780 
    781 /*******************************************************************************
    782  *
    783  * Function         btu_hcif_read_rmt_version_comp_evt
    784  *
    785  * Description      Process event HCI_READ_RMT_VERSION_COMP_EVT
    786  *
    787  * Returns          void
    788  *
    789  ******************************************************************************/
    790 static void btu_hcif_read_rmt_version_comp_evt(uint8_t* p) {
    791   btm_read_remote_version_complete(p);
    792 }
    793 
    794 /*******************************************************************************
    795  *
    796  * Function         btu_hcif_qos_setup_comp_evt
    797  *
    798  * Description      Process event HCI_QOS_SETUP_COMP_EVT
    799  *
    800  * Returns          void
    801  *
    802  ******************************************************************************/
    803 static void btu_hcif_qos_setup_comp_evt(uint8_t* p) {
    804   uint8_t status;
    805   uint16_t handle;
    806   FLOW_SPEC flow;
    807 
    808   STREAM_TO_UINT8(status, p);
    809   STREAM_TO_UINT16(handle, p);
    810   STREAM_TO_UINT8(flow.qos_flags, p);
    811   STREAM_TO_UINT8(flow.service_type, p);
    812   STREAM_TO_UINT32(flow.token_rate, p);
    813   STREAM_TO_UINT32(flow.peak_bandwidth, p);
    814   STREAM_TO_UINT32(flow.latency, p);
    815   STREAM_TO_UINT32(flow.delay_variation, p);
    816 
    817   btm_qos_setup_complete(status, handle, &flow);
    818 }
    819 
    820 /*******************************************************************************
    821  *
    822  * Function         btu_hcif_esco_connection_comp_evt
    823  *
    824  * Description      Process event HCI_ESCO_CONNECTION_COMP_EVT
    825  *
    826  * Returns          void
    827  *
    828  ******************************************************************************/
    829 static void btu_hcif_esco_connection_comp_evt(uint8_t* p) {
    830 #if (BTM_SCO_INCLUDED == TRUE)
    831   tBTM_ESCO_DATA data;
    832   uint16_t handle;
    833   RawAddress bda;
    834   uint8_t status;
    835 
    836   STREAM_TO_UINT8(status, p);
    837   STREAM_TO_UINT16(handle, p);
    838   STREAM_TO_BDADDR(bda, p);
    839 
    840   STREAM_TO_UINT8(data.link_type, p);
    841   STREAM_TO_UINT8(data.tx_interval, p);
    842   STREAM_TO_UINT8(data.retrans_window, p);
    843   STREAM_TO_UINT16(data.rx_pkt_len, p);
    844   STREAM_TO_UINT16(data.tx_pkt_len, p);
    845   STREAM_TO_UINT8(data.air_mode, p);
    846 
    847   data.bd_addr = bda;
    848   btm_sco_connected(status, &bda, handle, &data);
    849 #endif
    850 }
    851 
    852 /*******************************************************************************
    853  *
    854  * Function         btu_hcif_esco_connection_chg_evt
    855  *
    856  * Description      Process event HCI_ESCO_CONNECTION_CHANGED_EVT
    857  *
    858  * Returns          void
    859  *
    860  ******************************************************************************/
    861 static void btu_hcif_esco_connection_chg_evt(uint8_t* p) {
    862 #if (BTM_SCO_INCLUDED == TRUE)
    863   uint16_t handle;
    864   uint16_t tx_pkt_len;
    865   uint16_t rx_pkt_len;
    866   uint8_t status;
    867   uint8_t tx_interval;
    868   uint8_t retrans_window;
    869 
    870   STREAM_TO_UINT8(status, p);
    871   STREAM_TO_UINT16(handle, p);
    872 
    873   STREAM_TO_UINT8(tx_interval, p);
    874   STREAM_TO_UINT8(retrans_window, p);
    875   STREAM_TO_UINT16(rx_pkt_len, p);
    876   STREAM_TO_UINT16(tx_pkt_len, p);
    877 
    878   btm_esco_proc_conn_chg(status, handle, tx_interval, retrans_window,
    879                          rx_pkt_len, tx_pkt_len);
    880 #endif
    881 }
    882 
    883 /*******************************************************************************
    884  *
    885  * Function         btu_hcif_hdl_command_complete
    886  *
    887  * Description      Handle command complete event
    888  *
    889  * Returns          void
    890  *
    891  ******************************************************************************/
    892 static void btu_hcif_hdl_command_complete(uint16_t opcode, uint8_t* p,
    893                                           uint16_t evt_len,
    894                                           void* p_cplt_cback) {
    895   switch (opcode) {
    896     case HCI_INQUIRY_CANCEL:
    897       /* Tell inquiry processing that we are done */
    898       btm_process_cancel_complete(HCI_SUCCESS, BTM_BR_INQUIRY_MASK);
    899       break;
    900     case HCI_SET_EVENT_FILTER:
    901       btm_event_filter_complete(p);
    902       break;
    903 
    904     case HCI_DELETE_STORED_LINK_KEY:
    905       btm_delete_stored_link_key_complete(p);
    906       break;
    907 
    908     case HCI_READ_LOCAL_NAME:
    909       btm_read_local_name_complete(p, evt_len);
    910       break;
    911 
    912     case HCI_GET_LINK_QUALITY:
    913       btm_read_link_quality_complete(p);
    914       break;
    915 
    916     case HCI_READ_RSSI:
    917       btm_read_rssi_complete(p);
    918       break;
    919 
    920     case HCI_READ_FAILED_CONTACT_COUNTER:
    921       btm_read_failed_contact_counter_complete(p);
    922       break;
    923 
    924     case HCI_READ_AUTOMATIC_FLUSH_TIMEOUT:
    925       btm_read_automatic_flush_timeout_complete(p);
    926       break;
    927 
    928     case HCI_READ_TRANSMIT_POWER_LEVEL:
    929       btm_read_tx_power_complete(p, false);
    930       break;
    931 
    932     case HCI_CREATE_CONNECTION_CANCEL:
    933       btm_create_conn_cancel_complete(p);
    934       break;
    935 
    936     case HCI_READ_LOCAL_OOB_DATA:
    937       btm_read_local_oob_complete(p);
    938       break;
    939 
    940     case HCI_READ_INQ_TX_POWER_LEVEL:
    941       btm_read_inq_tx_power_complete(p);
    942       break;
    943 
    944     /* BLE Commands sComplete*/
    945     case HCI_BLE_ADD_WHITE_LIST:
    946       btm_ble_add_2_white_list_complete(*p);
    947       break;
    948 
    949     case HCI_BLE_CLEAR_WHITE_LIST:
    950       btm_ble_clear_white_list_complete(p, evt_len);
    951       break;
    952 
    953     case HCI_BLE_REMOVE_WHITE_LIST:
    954       btm_ble_remove_from_white_list_complete(p, evt_len);
    955       break;
    956 
    957     case HCI_BLE_RAND:
    958     case HCI_BLE_ENCRYPT:
    959       btm_ble_rand_enc_complete(p, opcode, (tBTM_RAND_ENC_CB*)p_cplt_cback);
    960       break;
    961 
    962     case HCI_BLE_READ_ADV_CHNL_TX_POWER:
    963       btm_read_tx_power_complete(p, true);
    964       break;
    965 
    966     case HCI_BLE_WRITE_ADV_ENABLE:
    967       btm_ble_write_adv_enable_complete(p);
    968       break;
    969 
    970     case HCI_BLE_CREATE_LL_CONN:
    971     case HCI_LE_EXTENDED_CREATE_CONNECTION:
    972       // No command complete event for those commands according to spec
    973       LOG(ERROR) << "No command complete expected, but received!";
    974       break;
    975 
    976     case HCI_BLE_CREATE_CONN_CANCEL:
    977       btm_ble_create_conn_cancel_complete(p);
    978       break;
    979 
    980     case HCI_BLE_TRANSMITTER_TEST:
    981     case HCI_BLE_RECEIVER_TEST:
    982     case HCI_BLE_TEST_END:
    983       btm_ble_test_command_complete(p);
    984       break;
    985 
    986 #if (BLE_PRIVACY_SPT == TRUE)
    987     case HCI_BLE_ADD_DEV_RESOLVING_LIST:
    988       btm_ble_add_resolving_list_entry_complete(p, evt_len);
    989       break;
    990 
    991     case HCI_BLE_RM_DEV_RESOLVING_LIST:
    992       btm_ble_remove_resolving_list_entry_complete(p, evt_len);
    993       break;
    994 
    995     case HCI_BLE_CLEAR_RESOLVING_LIST:
    996       btm_ble_clear_resolving_list_complete(p, evt_len);
    997       break;
    998 
    999     case HCI_BLE_READ_RESOLVABLE_ADDR_PEER:
   1000       btm_ble_read_resolving_list_entry_complete(p, evt_len);
   1001       break;
   1002 
   1003     case HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL:
   1004     case HCI_BLE_SET_ADDR_RESOLUTION_ENABLE:
   1005     case HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT:
   1006       break;
   1007 #endif
   1008     default:
   1009       if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC)
   1010         btm_vsc_complete(p, opcode, evt_len, (tBTM_VSC_CMPL_CB*)p_cplt_cback);
   1011       break;
   1012   }
   1013 }
   1014 
   1015 /*******************************************************************************
   1016  *
   1017  * Function         btu_hcif_command_complete_evt
   1018  *
   1019  * Description      Process event HCI_COMMAND_COMPLETE_EVT
   1020  *
   1021  * Returns          void
   1022  *
   1023  ******************************************************************************/
   1024 static void btu_hcif_command_complete_evt_on_task(BT_HDR* event,
   1025                                                   void* context) {
   1026   command_opcode_t opcode;
   1027   uint8_t* stream =
   1028       event->data + event->offset +
   1029       3;  // 2 to skip the event headers, 1 to skip the command credits
   1030   STREAM_TO_UINT16(opcode, stream);
   1031 
   1032   btu_hcif_hdl_command_complete(
   1033       opcode, stream,
   1034       event->len -
   1035           5,  // 3 for the command complete headers, 2 for the event headers
   1036       context);
   1037 
   1038   osi_free(event);
   1039 }
   1040 
   1041 static void btu_hcif_command_complete_evt(BT_HDR* response, void* context) {
   1042   do_in_hci_thread(FROM_HERE, base::Bind(btu_hcif_command_complete_evt_on_task,
   1043                                          response, context));
   1044 }
   1045 
   1046 /*******************************************************************************
   1047  *
   1048  * Function         btu_hcif_hdl_command_status
   1049  *
   1050  * Description      Handle a command status event
   1051  *
   1052  * Returns          void
   1053  *
   1054  ******************************************************************************/
   1055 static void btu_hcif_hdl_command_status(uint16_t opcode, uint8_t status,
   1056                                         uint8_t* p_cmd,
   1057                                         void* p_vsc_status_cback) {
   1058   RawAddress bd_addr;
   1059   uint16_t handle;
   1060 #if (BTM_SCO_INCLUDED == TRUE)
   1061   tBTM_ESCO_DATA esco_data;
   1062 #endif
   1063 
   1064   switch (opcode) {
   1065     case HCI_EXIT_SNIFF_MODE:
   1066     case HCI_EXIT_PARK_MODE:
   1067 #if (BTM_SCO_WAKE_PARKED_LINK == TRUE)
   1068       if (status != HCI_SUCCESS) {
   1069         /* Allow SCO initiation to continue if waiting for change mode event */
   1070         if (p_cmd != NULL) {
   1071           p_cmd++; /* bypass length field */
   1072           STREAM_TO_UINT16(handle, p_cmd);
   1073           btm_sco_chk_pend_unpark(status, handle);
   1074         }
   1075       }
   1076 #endif
   1077     /* Case Falls Through */
   1078 
   1079     case HCI_HOLD_MODE:
   1080     case HCI_SNIFF_MODE:
   1081     case HCI_PARK_MODE:
   1082       btm_pm_proc_cmd_status(status);
   1083       break;
   1084 
   1085     default:
   1086       /* If command failed to start, we may need to tell BTM */
   1087       if (status != HCI_SUCCESS) {
   1088         switch (opcode) {
   1089           case HCI_INQUIRY:
   1090             /* Tell inquiry processing that we are done */
   1091             btm_process_inq_complete(status, BTM_BR_INQUIRY_MASK);
   1092             break;
   1093 
   1094           case HCI_RMT_NAME_REQUEST:
   1095             /* Tell inquiry processing that we are done */
   1096             btm_process_remote_name(NULL, NULL, 0, status);
   1097 
   1098             btm_sec_rmt_name_request_complete(NULL, NULL, status);
   1099             break;
   1100 
   1101           case HCI_QOS_SETUP_COMP_EVT:
   1102             /* Tell qos setup that we are done */
   1103             btm_qos_setup_complete(status, 0, NULL);
   1104             break;
   1105 
   1106           case HCI_SWITCH_ROLE:
   1107             /* Tell BTM that the command failed */
   1108             /* read bd addr out of stored command */
   1109             if (p_cmd != NULL) {
   1110               p_cmd++;
   1111               STREAM_TO_BDADDR(bd_addr, p_cmd);
   1112               btm_acl_role_changed(status, &bd_addr, BTM_ROLE_UNDEFINED);
   1113             } else
   1114               btm_acl_role_changed(status, NULL, BTM_ROLE_UNDEFINED);
   1115             l2c_link_role_changed(nullptr, BTM_ROLE_UNDEFINED,
   1116                                   HCI_ERR_COMMAND_DISALLOWED);
   1117             break;
   1118 
   1119           case HCI_CREATE_CONNECTION:
   1120             /* read bd addr out of stored command */
   1121             if (p_cmd != NULL) {
   1122               p_cmd++;
   1123               STREAM_TO_BDADDR(bd_addr, p_cmd);
   1124               btm_sec_connected(bd_addr, HCI_INVALID_HANDLE, status, 0);
   1125               l2c_link_hci_conn_comp(status, HCI_INVALID_HANDLE, bd_addr);
   1126             }
   1127             break;
   1128 
   1129           case HCI_READ_RMT_EXT_FEATURES:
   1130             if (p_cmd != NULL) {
   1131               p_cmd++; /* skip command length */
   1132               STREAM_TO_UINT16(handle, p_cmd);
   1133             } else
   1134               handle = HCI_INVALID_HANDLE;
   1135 
   1136             btm_read_remote_ext_features_failed(status, handle);
   1137             break;
   1138 
   1139           case HCI_AUTHENTICATION_REQUESTED:
   1140             /* Device refused to start authentication.  That should be treated
   1141              * as authentication failure. */
   1142             btm_sec_auth_complete(BTM_INVALID_HCI_HANDLE, status);
   1143             break;
   1144 
   1145           case HCI_SET_CONN_ENCRYPTION:
   1146             /* Device refused to start encryption.  That should be treated as
   1147              * encryption failure. */
   1148             btm_sec_encrypt_change(BTM_INVALID_HCI_HANDLE, status, false);
   1149             break;
   1150 
   1151           case HCI_BLE_CREATE_LL_CONN:
   1152           case HCI_LE_EXTENDED_CREATE_CONNECTION:
   1153             btm_ble_create_ll_conn_complete(status);
   1154             break;
   1155 
   1156 #if (BTM_SCO_INCLUDED == TRUE)
   1157           case HCI_SETUP_ESCO_CONNECTION:
   1158           case HCI_ENH_SETUP_ESCO_CONNECTION:
   1159             /* read handle out of stored command */
   1160             if (p_cmd != NULL) {
   1161               p_cmd++;
   1162               STREAM_TO_UINT16(handle, p_cmd);
   1163 
   1164               /* Determine if initial connection failed or is a change
   1165                * of setup */
   1166               if (btm_is_sco_active(handle))
   1167                 btm_esco_proc_conn_chg(status, handle, 0, 0, 0, 0);
   1168               else
   1169                 btm_sco_connected(status, NULL, handle, &esco_data);
   1170             }
   1171             break;
   1172 #endif
   1173 
   1174           /* This is commented out until an upper layer cares about returning
   1175           event
   1176           #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
   1177                       case HCI_ENHANCED_FLUSH:
   1178                           break;
   1179           #endif
   1180           */
   1181           default:
   1182             if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC)
   1183               btm_vsc_complete(&status, opcode, 1,
   1184                                (tBTM_VSC_CMPL_CB*)p_vsc_status_cback);
   1185             break;
   1186         }
   1187 
   1188       } else {
   1189         if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC)
   1190           btm_vsc_complete(&status, opcode, 1,
   1191                            (tBTM_VSC_CMPL_CB*)p_vsc_status_cback);
   1192       }
   1193   }
   1194 }
   1195 
   1196 /*******************************************************************************
   1197  *
   1198  * Function         btu_hcif_command_status_evt
   1199  *
   1200  * Description      Process event HCI_COMMAND_STATUS_EVT
   1201  *
   1202  * Returns          void
   1203  *
   1204  ******************************************************************************/
   1205 static void btu_hcif_command_status_evt_on_task(uint8_t status, BT_HDR* event,
   1206                                                 void* context) {
   1207   command_opcode_t opcode;
   1208   uint8_t* stream = event->data + event->offset;
   1209   STREAM_TO_UINT16(opcode, stream);
   1210 
   1211   btu_hcif_hdl_command_status(opcode, status, stream, context);
   1212   osi_free(event);
   1213 }
   1214 
   1215 static void btu_hcif_command_status_evt(uint8_t status, BT_HDR* command,
   1216                                         void* context) {
   1217   do_in_hci_thread(FROM_HERE, base::Bind(btu_hcif_command_status_evt_on_task,
   1218                                          status, command, context));
   1219 }
   1220 
   1221 /*******************************************************************************
   1222  *
   1223  * Function         btu_hcif_hardware_error_evt
   1224  *
   1225  * Description      Process event HCI_HARDWARE_ERROR_EVT
   1226  *
   1227  * Returns          void
   1228  *
   1229  ******************************************************************************/
   1230 static void btu_hcif_hardware_error_evt(uint8_t* p) {
   1231   HCI_TRACE_ERROR("Ctlr H/w error event - code:0x%x", *p);
   1232 
   1233   /* If anyone wants device status notifications, give him one. */
   1234   btm_report_device_status(BTM_DEV_STATUS_DOWN);
   1235 
   1236   /* Reset the controller */
   1237   if (BTM_IsDeviceUp()) BTM_DeviceReset(NULL);
   1238 }
   1239 
   1240 /*******************************************************************************
   1241  *
   1242  * Function         btu_hcif_flush_occured_evt
   1243  *
   1244  * Description      Process event HCI_FLUSH_OCCURED_EVT
   1245  *
   1246  * Returns          void
   1247  *
   1248  ******************************************************************************/
   1249 static void btu_hcif_flush_occured_evt(void) {}
   1250 
   1251 /*******************************************************************************
   1252  *
   1253  * Function         btu_hcif_role_change_evt
   1254  *
   1255  * Description      Process event HCI_ROLE_CHANGE_EVT
   1256  *
   1257  * Returns          void
   1258  *
   1259  ******************************************************************************/
   1260 static void btu_hcif_role_change_evt(uint8_t* p) {
   1261   uint8_t status;
   1262   RawAddress bda;
   1263   uint8_t role;
   1264 
   1265   STREAM_TO_UINT8(status, p);
   1266   STREAM_TO_BDADDR(bda, p);
   1267   STREAM_TO_UINT8(role, p);
   1268 
   1269   btm_blacklist_role_change_device(bda, status);
   1270   l2c_link_role_changed(&bda, role, status);
   1271   btm_acl_role_changed(status, &bda, role);
   1272 }
   1273 
   1274 /*******************************************************************************
   1275  *
   1276  * Function         btu_hcif_num_compl_data_pkts_evt
   1277  *
   1278  * Description      Process event HCI_NUM_COMPL_DATA_PKTS_EVT
   1279  *
   1280  * Returns          void
   1281  *
   1282  ******************************************************************************/
   1283 static void btu_hcif_num_compl_data_pkts_evt(uint8_t* p) {
   1284   /* Process for L2CAP and SCO */
   1285   l2c_link_process_num_completed_pkts(p);
   1286 
   1287   /* Send on to SCO */
   1288   /*?? No SCO for now */
   1289 }
   1290 
   1291 /*******************************************************************************
   1292  *
   1293  * Function         btu_hcif_mode_change_evt
   1294  *
   1295  * Description      Process event HCI_MODE_CHANGE_EVT
   1296  *
   1297  * Returns          void
   1298  *
   1299  ******************************************************************************/
   1300 static void btu_hcif_mode_change_evt(uint8_t* p) {
   1301   uint8_t status;
   1302   uint16_t handle;
   1303   uint8_t current_mode;
   1304   uint16_t interval;
   1305 
   1306   STREAM_TO_UINT8(status, p);
   1307 
   1308   STREAM_TO_UINT16(handle, p);
   1309   STREAM_TO_UINT8(current_mode, p);
   1310   STREAM_TO_UINT16(interval, p);
   1311 #if (BTM_SCO_WAKE_PARKED_LINK == TRUE)
   1312   btm_sco_chk_pend_unpark(status, handle);
   1313 #endif
   1314   btm_pm_proc_mode_change(status, handle, current_mode, interval);
   1315 
   1316 #if (HID_DEV_INCLUDED == TRUE && HID_DEV_PM_INCLUDED == TRUE)
   1317   hidd_pm_proc_mode_change(status, current_mode, interval);
   1318 #endif
   1319 }
   1320 
   1321 /*******************************************************************************
   1322  *
   1323  * Function         btu_hcif_ssr_evt
   1324  *
   1325  * Description      Process event HCI_SNIFF_SUB_RATE_EVT
   1326  *
   1327  * Returns          void
   1328  *
   1329  ******************************************************************************/
   1330 #if (BTM_SSR_INCLUDED == TRUE)
   1331 static void btu_hcif_ssr_evt(uint8_t* p, uint16_t evt_len) {
   1332   btm_pm_proc_ssr_evt(p, evt_len);
   1333 }
   1334 #endif
   1335 
   1336 /*******************************************************************************
   1337  *
   1338  * Function         btu_hcif_pin_code_request_evt
   1339  *
   1340  * Description      Process event HCI_PIN_CODE_REQUEST_EVT
   1341  *
   1342  * Returns          void
   1343  *
   1344  ******************************************************************************/
   1345 static void btu_hcif_pin_code_request_evt(uint8_t* p) {
   1346   RawAddress bda;
   1347 
   1348   STREAM_TO_BDADDR(bda, p);
   1349 
   1350   /* Tell L2CAP that there was a PIN code request,  */
   1351   /* it may need to stretch timeouts                */
   1352   l2c_pin_code_request(bda);
   1353 
   1354   btm_sec_pin_code_request(bda);
   1355 }
   1356 
   1357 /*******************************************************************************
   1358  *
   1359  * Function         btu_hcif_link_key_request_evt
   1360  *
   1361  * Description      Process event HCI_LINK_KEY_REQUEST_EVT
   1362  *
   1363  * Returns          void
   1364  *
   1365  ******************************************************************************/
   1366 static void btu_hcif_link_key_request_evt(uint8_t* p) {
   1367   RawAddress bda;
   1368 
   1369   STREAM_TO_BDADDR(bda, p);
   1370   btm_sec_link_key_request(bda);
   1371 }
   1372 
   1373 /*******************************************************************************
   1374  *
   1375  * Function         btu_hcif_link_key_notification_evt
   1376  *
   1377  * Description      Process event HCI_LINK_KEY_NOTIFICATION_EVT
   1378  *
   1379  * Returns          void
   1380  *
   1381  ******************************************************************************/
   1382 static void btu_hcif_link_key_notification_evt(uint8_t* p) {
   1383   RawAddress bda;
   1384   LINK_KEY key;
   1385   uint8_t key_type;
   1386 
   1387   STREAM_TO_BDADDR(bda, p);
   1388   STREAM_TO_ARRAY16(key, p);
   1389   STREAM_TO_UINT8(key_type, p);
   1390 
   1391   btm_sec_link_key_notification(bda, key, key_type);
   1392 }
   1393 
   1394 /*******************************************************************************
   1395  *
   1396  * Function         btu_hcif_loopback_command_evt
   1397  *
   1398  * Description      Process event HCI_LOOPBACK_COMMAND_EVT
   1399  *
   1400  * Returns          void
   1401  *
   1402  ******************************************************************************/
   1403 static void btu_hcif_loopback_command_evt(void) {}
   1404 
   1405 /*******************************************************************************
   1406  *
   1407  * Function         btu_hcif_data_buf_overflow_evt
   1408  *
   1409  * Description      Process event HCI_DATA_BUF_OVERFLOW_EVT
   1410  *
   1411  * Returns          void
   1412  *
   1413  ******************************************************************************/
   1414 static void btu_hcif_data_buf_overflow_evt(void) {}
   1415 
   1416 /*******************************************************************************
   1417  *
   1418  * Function         btu_hcif_max_slots_changed_evt
   1419  *
   1420  * Description      Process event HCI_MAX_SLOTS_CHANGED_EVT
   1421  *
   1422  * Returns          void
   1423  *
   1424  ******************************************************************************/
   1425 static void btu_hcif_max_slots_changed_evt(void) {}
   1426 
   1427 /*******************************************************************************
   1428  *
   1429  * Function         btu_hcif_read_clock_off_comp_evt
   1430  *
   1431  * Description      Process event HCI_READ_CLOCK_OFF_COMP_EVT
   1432  *
   1433  * Returns          void
   1434  *
   1435  ******************************************************************************/
   1436 static void btu_hcif_read_clock_off_comp_evt(uint8_t* p) {
   1437   uint8_t status;
   1438   uint16_t handle;
   1439   uint16_t clock_offset;
   1440 
   1441   STREAM_TO_UINT8(status, p);
   1442 
   1443   /* If failed to get clock offset just drop the result */
   1444   if (status != HCI_SUCCESS) return;
   1445 
   1446   STREAM_TO_UINT16(handle, p);
   1447   STREAM_TO_UINT16(clock_offset, p);
   1448 
   1449   handle = HCID_GET_HANDLE(handle);
   1450 
   1451   btm_process_clk_off_comp_evt(handle, clock_offset);
   1452   btm_sec_update_clock_offset(handle, clock_offset);
   1453 }
   1454 
   1455 /*******************************************************************************
   1456  *
   1457  * Function         btu_hcif_conn_pkt_type_change_evt
   1458  *
   1459  * Description      Process event HCI_CONN_PKT_TYPE_CHANGE_EVT
   1460  *
   1461  * Returns          void
   1462  *
   1463  ******************************************************************************/
   1464 static void btu_hcif_conn_pkt_type_change_evt(void) {}
   1465 
   1466 /*******************************************************************************
   1467  *
   1468  * Function         btu_hcif_qos_violation_evt
   1469  *
   1470  * Description      Process event HCI_QOS_VIOLATION_EVT
   1471  *
   1472  * Returns          void
   1473  *
   1474  ******************************************************************************/
   1475 static void btu_hcif_qos_violation_evt(uint8_t* p) {
   1476   uint16_t handle;
   1477 
   1478   STREAM_TO_UINT16(handle, p);
   1479 
   1480   handle = HCID_GET_HANDLE(handle);
   1481 
   1482   l2c_link_hci_qos_violation(handle);
   1483 }
   1484 
   1485 /*******************************************************************************
   1486  *
   1487  * Function         btu_hcif_page_scan_mode_change_evt
   1488  *
   1489  * Description      Process event HCI_PAGE_SCAN_MODE_CHANGE_EVT
   1490  *
   1491  * Returns          void
   1492  *
   1493  ******************************************************************************/
   1494 static void btu_hcif_page_scan_mode_change_evt(void) {}
   1495 
   1496 /*******************************************************************************
   1497  *
   1498  * Function         btu_hcif_page_scan_rep_mode_chng_evt
   1499  *
   1500  * Description      Process event HCI_PAGE_SCAN_REP_MODE_CHNG_EVT
   1501  *
   1502  * Returns          void
   1503  *
   1504  ******************************************************************************/
   1505 static void btu_hcif_page_scan_rep_mode_chng_evt(void) {}
   1506 
   1507 /**********************************************
   1508  * Simple Pairing Events
   1509  **********************************************/
   1510 
   1511 /*******************************************************************************
   1512  *
   1513  * Function         btu_hcif_host_support_evt
   1514  *
   1515  * Description      Process event HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT
   1516  *
   1517  * Returns          void
   1518  *
   1519  ******************************************************************************/
   1520 static void btu_hcif_host_support_evt(uint8_t* p) {
   1521   btm_sec_rmt_host_support_feat_evt(p);
   1522 }
   1523 
   1524 /*******************************************************************************
   1525  *
   1526  * Function         btu_hcif_io_cap_request_evt
   1527  *
   1528  * Description      Process event HCI_IO_CAPABILITY_REQUEST_EVT
   1529  *
   1530  * Returns          void
   1531  *
   1532  ******************************************************************************/
   1533 static void btu_hcif_io_cap_request_evt(uint8_t* p) {
   1534   RawAddress bda;
   1535   STREAM_TO_BDADDR(bda, p);
   1536   btm_io_capabilities_req(bda);
   1537 }
   1538 
   1539 /*******************************************************************************
   1540  *
   1541  * Function         btu_hcif_io_cap_response_evt
   1542  *
   1543  * Description      Process event HCI_IO_CAPABILITY_RESPONSE_EVT
   1544  *
   1545  * Returns          void
   1546  *
   1547  ******************************************************************************/
   1548 static void btu_hcif_io_cap_response_evt(uint8_t* p) {
   1549   btm_io_capabilities_rsp(p);
   1550 }
   1551 
   1552 /*******************************************************************************
   1553  *
   1554  * Function         btu_hcif_user_conf_request_evt
   1555  *
   1556  * Description      Process event HCI_USER_CONFIRMATION_REQUEST_EVT
   1557  *
   1558  * Returns          void
   1559  *
   1560  ******************************************************************************/
   1561 static void btu_hcif_user_conf_request_evt(uint8_t* p) {
   1562   btm_proc_sp_req_evt(BTM_SP_CFM_REQ_EVT, p);
   1563 }
   1564 
   1565 /*******************************************************************************
   1566  *
   1567  * Function         btu_hcif_user_passkey_request_evt
   1568  *
   1569  * Description      Process event HCI_USER_PASSKEY_REQUEST_EVT
   1570  *
   1571  * Returns          void
   1572  *
   1573  ******************************************************************************/
   1574 static void btu_hcif_user_passkey_request_evt(uint8_t* p) {
   1575   btm_proc_sp_req_evt(BTM_SP_KEY_REQ_EVT, p);
   1576 }
   1577 
   1578 /*******************************************************************************
   1579  *
   1580  * Function         btu_hcif_user_passkey_notif_evt
   1581  *
   1582  * Description      Process event HCI_USER_PASSKEY_NOTIFY_EVT
   1583  *
   1584  * Returns          void
   1585  *
   1586  ******************************************************************************/
   1587 static void btu_hcif_user_passkey_notif_evt(uint8_t* p) {
   1588   btm_proc_sp_req_evt(BTM_SP_KEY_NOTIF_EVT, p);
   1589 }
   1590 
   1591 /*******************************************************************************
   1592  *
   1593  * Function         btu_hcif_keypress_notif_evt
   1594  *
   1595  * Description      Process event HCI_KEYPRESS_NOTIFY_EVT
   1596  *
   1597  * Returns          void
   1598  *
   1599  ******************************************************************************/
   1600 static void btu_hcif_keypress_notif_evt(uint8_t* p) {
   1601   btm_keypress_notif_evt(p);
   1602 }
   1603 
   1604 /*******************************************************************************
   1605  *
   1606  * Function         btu_hcif_rem_oob_request_evt
   1607  *
   1608  * Description      Process event HCI_REMOTE_OOB_DATA_REQUEST_EVT
   1609  *
   1610  * Returns          void
   1611  *
   1612  ******************************************************************************/
   1613 static void btu_hcif_rem_oob_request_evt(uint8_t* p) { btm_rem_oob_req(p); }
   1614 
   1615 /*******************************************************************************
   1616  *
   1617  * Function         btu_hcif_simple_pair_complete_evt
   1618  *
   1619  * Description      Process event HCI_SIMPLE_PAIRING_COMPLETE_EVT
   1620  *
   1621  * Returns          void
   1622  *
   1623  ******************************************************************************/
   1624 static void btu_hcif_simple_pair_complete_evt(uint8_t* p) {
   1625   btm_simple_pair_complete(p);
   1626 }
   1627 
   1628 /*******************************************************************************
   1629  *
   1630  * Function         btu_hcif_enhanced_flush_complete_evt
   1631  *
   1632  * Description      Process event HCI_ENHANCED_FLUSH_COMPLETE_EVT
   1633  *
   1634  * Returns          void
   1635  *
   1636  ******************************************************************************/
   1637 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
   1638 static void btu_hcif_enhanced_flush_complete_evt(void) {
   1639   /* This is empty until an upper layer cares about returning event */
   1640 }
   1641 #endif
   1642 /**********************************************
   1643  * End of Simple Pairing Events
   1644  **********************************************/
   1645 
   1646 /**********************************************
   1647  * BLE Events
   1648  **********************************************/
   1649 static void btu_hcif_encryption_key_refresh_cmpl_evt(uint8_t* p) {
   1650   uint8_t status;
   1651   uint8_t enc_enable = 0;
   1652   uint16_t handle;
   1653 
   1654   STREAM_TO_UINT8(status, p);
   1655   STREAM_TO_UINT16(handle, p);
   1656 
   1657   if (status == HCI_SUCCESS) enc_enable = 1;
   1658 
   1659   btm_sec_encrypt_change(handle, status, enc_enable);
   1660 }
   1661 
   1662 static void btu_ble_ll_conn_complete_evt(uint8_t* p, uint16_t evt_len) {
   1663   btm_ble_conn_complete(p, evt_len, false);
   1664 }
   1665 #if (BLE_PRIVACY_SPT == TRUE)
   1666 static void btu_ble_proc_enhanced_conn_cmpl(uint8_t* p, uint16_t evt_len) {
   1667   btm_ble_conn_complete(p, evt_len, true);
   1668 }
   1669 #endif
   1670 
   1671 extern void gatt_notify_conn_update(uint16_t handle, uint16_t interval,
   1672                                     uint16_t latency, uint16_t timeout,
   1673                                     uint8_t status);
   1674 
   1675 static void btu_ble_ll_conn_param_upd_evt(uint8_t* p, uint16_t evt_len) {
   1676   /* LE connection update has completed successfully as a master. */
   1677   /* We can enable the update request if the result is a success. */
   1678   /* extract the HCI handle first */
   1679   uint8_t status;
   1680   uint16_t handle;
   1681   uint16_t interval;
   1682   uint16_t latency;
   1683   uint16_t timeout;
   1684 
   1685   STREAM_TO_UINT8(status, p);
   1686   STREAM_TO_UINT16(handle, p);
   1687   STREAM_TO_UINT16(interval, p);
   1688   STREAM_TO_UINT16(latency, p);
   1689   STREAM_TO_UINT16(timeout, p);
   1690 
   1691   l2cble_process_conn_update_evt(handle, status, interval, latency, timeout);
   1692 
   1693   gatt_notify_conn_update(handle & 0x0FFF, interval, latency, timeout, status);
   1694 }
   1695 
   1696 static void btu_ble_read_remote_feat_evt(uint8_t* p) {
   1697   btm_ble_read_remote_features_complete(p);
   1698 }
   1699 
   1700 static void btu_ble_proc_ltk_req(uint8_t* p) {
   1701   uint16_t ediv, handle;
   1702   uint8_t* pp;
   1703 
   1704   STREAM_TO_UINT16(handle, p);
   1705   pp = p + 8;
   1706   STREAM_TO_UINT16(ediv, pp);
   1707   btm_ble_ltk_request(handle, p, ediv);
   1708   /* This is empty until an upper layer cares about returning event */
   1709 }
   1710 
   1711 static void btu_ble_data_length_change_evt(uint8_t* p, uint16_t evt_len) {
   1712   uint16_t handle;
   1713   uint16_t tx_data_len;
   1714   uint16_t rx_data_len;
   1715 
   1716   if (!controller_get_interface()->supports_ble_packet_extension()) {
   1717     HCI_TRACE_WARNING("%s, request not supported", __func__);
   1718     return;
   1719   }
   1720 
   1721   STREAM_TO_UINT16(handle, p);
   1722   STREAM_TO_UINT16(tx_data_len, p);
   1723   p += 2; /* Skip the TxTimer */
   1724   STREAM_TO_UINT16(rx_data_len, p);
   1725 
   1726   l2cble_process_data_length_change_event(handle, tx_data_len, rx_data_len);
   1727 }
   1728 
   1729 /**********************************************
   1730  * End of BLE Events Handler
   1731  **********************************************/
   1732 #if (BLE_LLT_INCLUDED == TRUE)
   1733 static void btu_ble_rc_param_req_evt(uint8_t* p) {
   1734   uint16_t handle;
   1735   uint16_t int_min, int_max, latency, timeout;
   1736 
   1737   STREAM_TO_UINT16(handle, p);
   1738   STREAM_TO_UINT16(int_min, p);
   1739   STREAM_TO_UINT16(int_max, p);
   1740   STREAM_TO_UINT16(latency, p);
   1741   STREAM_TO_UINT16(timeout, p);
   1742 
   1743   l2cble_process_rc_param_request_evt(handle, int_min, int_max, latency,
   1744                                       timeout);
   1745 }
   1746 #endif /* BLE_LLT_INCLUDED */
   1747