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