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