btm_sec.c revision 104e3f238f500cacdb8afaccdc672dfc34eae7ee
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains functions for the Bluetooth Security Manager 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h" 315cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE && BT_TRACE_VERBOSE == FALSE) 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* needed for sprintf() */ 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "gatt_int.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_MAX_COLLISION_DELAY (GKI_SECS_TO_TICKS(5)) 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 486975b4d711142b885af479721cada448952c6b41Andre Eisenbach 496975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************** 506975b4d711142b885af479721cada448952c6b41Andre Eisenbach** L O C A L F U N C T I O N P R O T O T Y P E S * 516975b4d711142b885af479721cada448952c6b41Andre Eisenbach*********************************************************************************/ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur); 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id); 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec); 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec); 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void); 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_check_pending_reqs(void); 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec); 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec); 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle); 847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8 btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec); 927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec); 937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec); 947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec); 957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE - authenticated link key is possible */ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OUT, IO, IN, NONE */ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* OUT */ {FALSE, FALSE, TRUE, FALSE}, 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IO */ {FALSE, TRUE, TRUE, FALSE}, 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IN */ {TRUE, TRUE, TRUE, FALSE}, 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* NONE */ {FALSE, FALSE, FALSE, FALSE} 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_OUT 0 DisplayOnly */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IO 1 DisplayYesNo */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IN 2 KeyboardOnly */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_NONE 3 NoInputNoOutput */ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_authenticated 1137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is authenticated 1157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec) 1207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) 1227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_encrypted 1317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is encrypted 1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec) 1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_authorized 1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is authorized 1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec) 1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) 1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_serv_trusted 1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check service is trusted 1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec) 1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id)) 1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecRegister 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Application manager calls this function to register for 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** security services. There can be one and only one application 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** saving link keys. BTM allows only first registration. 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecRegister (tBTM_APPL_INFO *p_cb_info) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 temp_value = {0}; 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_Sec: application registered"); 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb_info->p_le_callback) 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_SecRegister:p_cb_info->p_le_callback == 0x%x ", p_cb_info->p_le_callback); 2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_cb_info->p_le_callback) 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta #if SMP_INCLUDED == TRUE 2095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_Sec: SMP_Register( btm_proc_smp_cback )"); 2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta SMP_Register(btm_proc_smp_cback); 2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta #endif 2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* if no IR is loaded, need to regenerate all the keys */ 2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) 2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_ble_reset_id(); 2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 2205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_SecRegister:p_cb_info->p_le_callback == NULL "); 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api = *p_cb_info; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 2275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_SecRegister: btm_cb.api.p_le_callback = 0x%x ", btm_cb.api.p_le_callback); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_Sec: application registered"); 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecRegisterLinkKeyNotificationCallback 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Application manager calls this function to register for 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** link key notification. When there is nobody registered 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** we should avoid changing link key 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback) 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_link_key_callback = p_callback; 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecAddRmtNameNotifyCallback 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Any profile can register to be notified when name of the 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** remote device is resolved. 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_rmt_name_callback[i] == NULL) 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_rmt_name_callback[i] = p_callback; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecDeleteRmtNameNotifyCallback 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Any profile can deregister notification when a new Link Key 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is generated per connection. 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if OK, else FALSE 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_rmt_name_callback[i] == p_callback) 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_rmt_name_callback[i] = NULL; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecSetConnectFilterCallback 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Host can register to be asked whenever a HCI connection 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** request is received. In the registered function host 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** suppose to check connectibility filters. Yes/No result 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** should be returned syncronously 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SecSetConnectFilterCallback (tBTM_FILTER_CB *p_callback) 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_conn_filter_cb = p_callback; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetSecurityMode 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get security mode for the device 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_GetSecurityMode (void) 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_cb.security_mode); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetSecurityFlags 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get security flags for the device 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE or FALSE is device found 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags) 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) p_dev_rec->sec_flags; 3537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 3547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 3555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); 3567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 3577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 3587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 3607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_GetSecurityFlagsByTransport 3627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description Get security flags for the device on a particular transport 3647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE is device found 3667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 3687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags, 3697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport) 3707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 3717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec; 3727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 3747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 3757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_BR_EDR) 3767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) p_dev_rec->sec_flags; 3777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 3787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8); 3797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetSecurityMode 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set security mode for the device 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetSecurityMode (UINT8 security_mode) 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 397ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 sp_mode = HCI_SP_MODE_ENABLED; 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sp_debug_mode = HCI_SPD_MODE_DISABLED; 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (security_mode) 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_PRE_LISBON_INCLUDED == TRUE) 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SEC_MODE_NONE: 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SEC_MODE_SERVICE: 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SEC_MODE_LINK: 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SEC_MODE_SP_DEBUG: 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sp_debug_mode = HCI_SPD_MODE_ENABLED; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SEC_MODE_SP: 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the default is enabled */ 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 4165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_SetSecurityMode: unknown mode:%d", security_mode); 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = security_mode; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4213aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Lisbon devices and only use BTM_SEC_MODE_SP */ 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = BTM_SEC_MODE_SP; 4255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("BTM_SetSecurityMode: SP:%d, debug:%d", sp_mode, sp_debug_mode); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_simple_pairing_mode(sp_mode); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_simp_pair_debug_mode(sp_debug_mode); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* must be a pre-Lisbon device */ 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_PRE_LISBON_INCLUDED == TRUE) 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If previously security mode was Link Level and now lesser notify */ 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* controller not to perform authentication, encryption on startup */ 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((old_mode == BTM_SEC_MODE_LINK) 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ( security_mode != BTM_SEC_MODE_LINK)) 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("BTM_SetSecurityMode: Authen Enable -> FALSE"); 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (FALSE); 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_encr_mode (HCI_ENCRYPT_MODE_DISABLED); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If previously security is increased to Link Level notify */ 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* controller to perform authentication, encryption on startup */ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((old_mode != BTM_SEC_MODE_LINK) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ( security_mode == BTM_SEC_MODE_LINK)) 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("BTM_SetSecurityMode: Authen Enable -> TRUE"); 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_encr_mode (HCI_ENCRYPT_MODE_POINT_TO_POINT); 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_PRE_LISBON_INCLUDED == TRUE */ 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetPinType 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set PIN type for the device. 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len) 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d", 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pin_type, (char *) pin_code, pin_code_len); 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If device is not up security mode will be set as a part of startup */ 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.cfg.pin_type != pin_type) 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.devcb.state > BTM_DEV_STATE_WAIT_AFTER_RESET) ) 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (pin_type); 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.pin_type = pin_type; 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.pin_code_len = pin_code_len; 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len); 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetPairableMode 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enable or disable pairing 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters allow_pairing - (TRUE or FALSE) whether or not the device 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allows pairing. 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connect_only_paired - (TRUE or FALSE) whether or not to 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** only allow paired devices to connect. 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired) 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SetPairableMode() allow_pairing: %u connect_only_paired: %u", allow_pairing, connect_only_paired); 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_disabled = !allow_pairing; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.connect_only_paired = connect_only_paired; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES ((UINT16) 0xffff) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetUCDSecurityLevel 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register UCD service security level with Security Manager 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: is_originator - TRUE if originating the connection, FALSE if not 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetUCDSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id, 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONNLESS_ORIG; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONNLESS_TERM; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (conn_type, p_name, service_id, 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5405cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(is_originator); 5415cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_name); 5425cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(service_id); 5435cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(sec_level); 5445cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(psm); 5455cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(mx_proto_id); 5465cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(mx_chan_id); 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetSecurityLevel 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register service security level with Security Manager 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: is_originator - TRUE if originating the connection, FALSE if not 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id, 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type; 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONN_ORIENT_ORIG; 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONN_ORIENT_TERM; 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (conn_type, p_name, service_id, 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (is_originator, p_name, service_id, 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_set_security_level 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register service security level with Security Manager 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: conn_type - TRUE if originating the connection, FALSE if not 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec; 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 index; 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 first_unused_record = BTM_NO_AVAIL_SEC_SERVICES; 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN record_allocated = FALSE; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_ucd; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_ORIG_MASK) 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_ucd = TRUE; 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_ucd = FALSE; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if the record can be reused (same service name, psm, mx_proto_id, 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id, and mx_chan_id), or obtain the next unused record */ 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec = &btm_cb.sec_serv_rec[0]; 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++) 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if there is already a record for this service */ 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->security_flags & BTM_SEC_IN_USE) 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->psm == psm && 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id == mx_proto_id && 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id == p_srec->service_id && 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!strncmp (p_name, (char *) p_srec->orig_service_name, 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_SERVICE_NAME_LEN) || 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !strncmp (p_name, (char *) p_srec->term_service_name, 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_SERVICE_NAME_LEN))) 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->psm == psm && 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id == mx_proto_id && 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id == p_srec->service_id) 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project record_allocated = TRUE; 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark the first available service record */ 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!record_allocated) 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC)); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project record_allocated = TRUE; 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project first_unused_record = index; 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!record_allocated) 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)", BTM_SEC_MAX_SERVICE_RECORDS); 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(record_allocated); 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process the request if service record is valid */ 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If a duplicate service wasn't found, use the first available */ 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (index >= BTM_SEC_MAX_SERVICE_RECORDS) 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = first_unused_record; 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec = &btm_cb.sec_serv_rec[index]; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->psm = psm; 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->service_id = service_id; 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id = mx_proto_id; 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->orig_mx_chan_id = mx_chan_id; 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_srec->orig_service_name, sizeof(p_srec->orig_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN); 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear out the old setting, just in case it exists */ 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags &= 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags &= 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parameter validation. Originator should not set requirements for incoming connections */ 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM); 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode == BTM_SEC_MODE_SP) 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_OUT_AUTHENTICATE) 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_OUT_MITM; 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the authenticate bit is set, when encrypt bit is set */ 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_OUT_ENCRYPT) 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_OUT_AUTHENTICATE; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* outgoing connections usually set the security level right before 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the connection is initiated. 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * set it to be the outgoing service */ 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd == FALSE ) 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_srec; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->term_mx_chan_id = mx_chan_id; 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_srec->term_service_name, sizeof(p_srec->term_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN); 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear out the old setting, just in case it exists */ 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags &= 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags &= 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parameter validation. Acceptor should not set requirements for outgoing connections */ 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM); 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode == BTM_SEC_MODE_SP) 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_IN_AUTHENTICATE) 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_IN_MITM; 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the authenticate bit is set, when encrypt bit is set */ 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_IN_ENCRYPT) 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_IN_AUTHENTICATE; 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(BTM_SEC_IN_USE); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d", 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index, service_id, conn_type, psm, mx_proto_id, mx_chan_id); 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : security_flags: 0x%04x, ucd_security_flags: 0x%04x", 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags, p_srec->ucd_security_flags); 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 7935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : service name [%s] (up to %d chars saved)", 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_name, BTM_SEC_SERVICE_NAME_LEN); 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d", 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index, service_id, is_originator, psm, mx_proto_id, mx_chan_id); 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 8035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : sec: 0x%x, service name [%s] (up to %d chars saved)", 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN); 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(record_allocated); 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecClrService 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes specified service record(s) from the security database. 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** All service records with the specified name are removed. 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically used only by devices with limited RAM so that it can 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** reuse an old security service record. 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Unpredictable results may occur if a service is cleared 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** that is still in use by an application/profile. 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. ('0' removes all service 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** records (except SDP). 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were freed. 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id) 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_freed = 0; 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) && 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!service_id || (service_id == p_srec->service_id))) 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id); 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags = 0; 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags = 0; 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_freed++; 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_freed); 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_clr_service_by_psm 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes specified service record from the security database. 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** All service records with the specified psm are removed. 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically used by L2CAP to free up the service record used 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by dynamic PSM clients when the channel is closed. 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The given psm must be a virtual psm. 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. ('0' removes all service 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** records (except SDP). 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were freed. 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm) 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_freed = 0; 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) ) 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id); 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags = 0; 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_freed++; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed); 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_freed); 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 893ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_clr_temp_auth_service 894ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 895ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Removes specified device record's temporary authorization 896ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** flag from the security database. 897ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 898ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters Device address to be cleared 899ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 900ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void. 901ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 902ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 903ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda) 904ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 905ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec; 906ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 907ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_dev_rec = btm_find_dev (bda)) == NULL) 908ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 9095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB"); 910ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 911ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 912ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 913ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */ 914ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service) 915ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 9165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]", 917ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); 918ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 919ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID; 920ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 921ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 922ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 923ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 924ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 925ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecClrUCDService 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** ('0' removes all service records ) 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were cleared. 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrUCDService (UINT8 service_id) 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_cleared = 0; 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!service_id || (service_id == (UINT32)p_srec->service_id))) 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_UCD_SEC_CLR[%d]: id %d", i, service_id); 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags = 0; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_cleared++; 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_cleared); 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 9575cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(service_id); 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(0); 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_PINCodeReply 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after Security Manager submitted 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PIN code request to the UI. 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device for which PIN was requested 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation BTM_SUCCESS if success 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pin_len - length in bytes of the PIN Code 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_pin - pointer to array with the PIN Code 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s PairFlags: 0x%02x PinLen:%d Result:%d", 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res); 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state); 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr"); 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB"); 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) ) 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = BTM_ILLEGAL_VALUE; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */ 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) || 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) ) 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (bd_addr); 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.security_mode_changed == FALSE) ) 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is start of the dedicated bonding if local device is 2.0 */ 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = pin_len; 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, pin_len); 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = TRUE; 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = 0xff ; 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* before originating */ 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection"); 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we change state little bit early so btm_sec_connected() will originate connection */ 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* when existing ACL link is down completely */ 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we already accepted incoming connection from pairing device */ 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer"); 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 10667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE); 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 10765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len); 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if this was not pre-fetched, save the PIN */ 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len == 0) 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, pin_len); 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = pin_len; 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin); 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_DeviceAuthorized 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after Security Manager submitted 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization request to the UI. 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device for which PIN was requested 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation BTM_SUCCESS if success 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_DeviceAuthorized (BD_ADDR bd_addr, UINT8 res, UINT32 trusted_mask[]) 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: Attempting Authorization of Unknown Device Address [%02x%02x%02x%02x%02x%02x]", 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: authorized status:%d State:%d Trusted:%08x %08x", 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res, (p_dev_rec) ? p_dev_rec->sec_state : 0, trusted_mask[0], trusted_mask[1]); 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res == BTM_SUCCESS) 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED; 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 1115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 1117ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1118ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1119ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Save the currently authorized service in case we are asked again 1120ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta by another multiplexer layer */ 1121ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_dev_rec->is_originator) 1122ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 11235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("BTM_DeviceAuthorized: Setting last_author_service_id to %d", 1124ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->p_cur_service->service_id); 1125ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = p_dev_rec->p_cur_service->service_id; 1126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING) 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE); 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((res = (UINT8)btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE); 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_sec_bond_by_transport 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description this is the bond function that will start either SSP or SMP. 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device to bond 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pin_len - length in bytes of the PIN Code 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_pin - pointer to array with the PIN Code 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: After 2.1 parameters are not used and preserved here not to change API 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport, 11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 11643aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 *p_features; 11653aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 ii; 11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p= btm_bda_to_acl(bd_addr, transport); 11675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x", 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11705344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport); 11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Other security process is in progress */ 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state)); 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11806975b4d711142b885af479721cada448952c6b41Andre Eisenbach if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL) 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11826975b4d711142b885af479721cada448952c6b41Andre Eisenbach return(BTM_NO_RESOURCES); 11837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags); 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Finished if connection is active and already paired */ 11887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR 11897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 11907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) 11917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE 11927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)) 11937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 11947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 11957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("BTM_SecBond -> Already Paired"); 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell controller to get rid of the link key if it has one stored */ 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS) 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the PIN code if we got a valid one */ 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0)) 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = pin_len; 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN); 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN); 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE; 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = TRUE; 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12216975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 12227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK; 12257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1226ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (SMP_Pair(bd_addr) == SMP_STARTED) 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 12307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 12347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags = 0; 12357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(BTM_NO_RESOURCES); 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED 12407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta | BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED); 12417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 12427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 12435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags); 12443aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (!HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The special case when we authenticate keyboard. Set pin type to fixed */ 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* It would be probably better to do it from the application, but it is */ 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* complicated */ 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_type_changed = TRUE; 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED); 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12583aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++) 12593aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 12603aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_features = p_dev_rec->features[ii]; 12615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT(" remote_features page[%1d] = %02x-%02x-%02x-%02x", 12623aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach ii, p_features[0], p_features[1], p_features[2], p_features[3]); 12635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT(" %02x-%02x-%02x-%02x", 12643aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_features[4], p_features[5], p_features[6], p_features[7]); 12653aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle); 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN; 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection already exists... */ 12747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE) 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_authentication (p_dev_rec)) 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark lcb as bonding */ 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (bd_addr, TRUE); 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4); 12873aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (!HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]) 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_dev_rec->sm4 == BTM_SM4_KNOWN)) 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_sec_check_prefetch_pin (p_dev_rec) ) 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_MODE_SP == btm_cb.security_mode && BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local is 2.1 and peer is unknown */ 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are not accepting connection request from peer 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * -> RNR (to learn if peer is 2.1) 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 13027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We are accepting connection request from peer */ 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d", 13107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state); 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* both local and peer are 2.1 */ 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_dd_create_conn(p_dev_rec); 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 13267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 13277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_SecBondByTransport 13287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 13297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description This function is called to perform bonding with peer device. 13307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** If the connection is already up, but not secure, pairing 13317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** is attempted. If already paired BTM_SUCCESS is returned. 13327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 13337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters: bd_addr - Address of the device to bond 13347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - doing SSP over BR/EDR or SMP over LE 13357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** pin_len - length in bytes of the PIN Code 13367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** p_pin - pointer to array with the PIN Code 13377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** trusted_mask - bitwise OR of trusted services (array of UINT32) 13387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 13397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Note: After 2.1 parameters are not used and preserved here not to change API 13407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 13417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport, 13427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 13437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 13447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE 13457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_DEVICE_TYPE dev_type; 13467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBLE_ADDR_TYPE addr_type; 13477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 13487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); 13497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* LE device, do SMP pairing */ 13507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) || 13517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0)) 13527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 13537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_ILLEGAL_ACTION; 13547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 13557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 13567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); 13577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_SecBond 13627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 13637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description This function is called to perform bonding with peer device. 13647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** If the connection is already up, but not secure, pairing 13657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** is attempted. If already paired BTM_SUCCESS is returned. 13667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 13677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters: bd_addr - Address of the device to bond 13687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** pin_len - length in bytes of the PIN Code 13697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** p_pin - pointer to array with the PIN Code 13707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** trusted_mask - bitwise OR of trusted services (array of UINT32) 13717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 13727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Note: After 2.1 parameters are not used and preserved here not to change API 13737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 13747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 13757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 13767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 13777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 13787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (BTM_UseLeLink(bd_addr)) 13797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = BT_TRANSPORT_LE; 13807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 13817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); 13827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 13837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 13847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecBondCancel 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to cancel ongoing bonding process 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with peer device. 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 13917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - FALSE for BR/EDR link; TRUE for LE link 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr) 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SecBondCancel() State: %s flags:0x%x", 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags); 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_UNKNOWN_ADDR; 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 14067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE) 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Cancel LE pairing"); 14117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (SMP_PairCancel(bd_addr)) 14127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 14137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_CMD_STARTED; 14147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_WRONG_MODE; 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state ); 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pre-fetching pin for dedicated bonding */ 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_SUCCESS; 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this BDA is in a bonding procedure */ 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link is up */ 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If some other thread disconnecting, we do not send second command */ 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link was set up by Bonding process */ 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 14427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding(bd_addr, FALSE); 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NOT_AUTHORIZED; 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /*HCI link is not up */ 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link creation was started by Bonding process */ 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_create_conn_cancel(bd_addr)) 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) 1459ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1460ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_CancelRemoteDeviceName(); 1461ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD; 1462ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return BTM_CMD_STARTED; 1463ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NOT_AUTHORIZED; 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_WRONG_MODE; 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecUseMasterLinkKey 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to tell master of the piconet to 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** switch to master link key 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: use_master_key - If true Master Link Key shoul be used 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecUseMasterLinkKey (BOOLEAN use_master_key) 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btsnd_hcic_master_link_key (use_master_key) ? BTM_SUCCESS : 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_NO_RESOURCES); 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetMasterKeyCompCback 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to register for the master key complete 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** status event. 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: mkey_cback - callback registered with the security manager 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetMasterKeyCompCback( tBTM_MKEY_CALLBACK *mkey_cback ) 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.mkey_cback = mkey_cback; 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecGetDeviceLinkKey 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to obtain link key for the device 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** it returns BTM_SUCCESS if link key is available, or 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_UNKNOWN_ADDR if Security Manager does not know about 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the device or device record does not contain link key info 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** link_key - Link Key is copied into this array 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key) 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN); 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_UNKNOWN_ADDR); 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetEncryption 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to ensure that connection is 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** encrypted. Should be called only on an open connection. 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically only needed for connections that first want to 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bring up unencrypted links, then later encrypt them. 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are completed. Can be set to NULL 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if status is not desired. 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_ref_data - pointer to any data the caller wishes to receive 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in the callback function upon completion. 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* can be set to NULL if not used. 15467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - TRUE to encryption the link over LE trasnport 15477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** or FALSE for BR/EDR trasnport 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS - already encrypted 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_PENDING - command will be returned in the callback 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_WRONG_MODE- connection not up. 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_BUSY - security procedures are currently active 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MODE_UNSUPPORTED - if security manager not linked in. 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback, 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_ref_data) 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc; 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 15627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p = btm_bda_to_acl(bd_addr, transport); 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 15667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 15677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!p_dev_rec || 15687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 15697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 15707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) 15717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 15727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connection should be up and runnning */ 15755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected"); 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 15787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE); 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((transport == BT_TRANSPORT_BR_EDR && 15847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)) 15857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 15867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta || (transport == BT_TRANSPORT_LE && 15877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED)) 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted"); 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 15947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_callback) 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connection should be up and runnning */ 16025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy"); 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 16057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_BUSY); 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_BUSY); 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = FALSE; 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x", 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required); 16187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 16207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role); 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = btm_sec_execute_procedure (p_dev_rec); 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (rc != BTM_CMD_STARTED && rc != BTM_BUSY) 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 16347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc); 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(rc); 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet. 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle) 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1645ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 old_state = p_dev_rec->sec_state; 1646ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_STATUS status = BTM_CMD_STARTED; 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect: handle:0x%x, reason=0x%x", 16497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta conn_handle, reason); 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if some other thread disconnecting, we do not send second command */ 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_STATE_DISCONNECTING != old_state) 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING; 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If a Role Switch is in progress, delay the HCI Disconnect to avoid controller problem (4329B1) */ 16587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && 16597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->hci_handle == conn_handle) 16607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect"); 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING; 1664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = BTM_SUCCESS; 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1666ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tear down the HCI link */ 16697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!btsnd_hcic_disconnect (conn_handle, reason)) 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* could not send disconnect. restore old state */ 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = old_state; 1673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = BTM_NO_RESOURCES; 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1676ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (status); 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ConfirmReqReply 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to confirm the numeric value for 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_CFM_REQ_EVT 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: res - result of the operation BTM_SUCCESS if success 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr - Address of the peer device 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr) 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s Res: %u", 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM) 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) ) 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res == BTM_SUCCESS) 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (bd_addr, TRUE); 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */ 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (bd_addr, FALSE); 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_PasskeyReqReply 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the passkey for 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_KEY_REQ_EVT 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: res - result of the operation BTM_SUCCESS if success 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr - Address of the peer device 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey - numeric value in the range of 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey) 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s res:%d", 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) ) 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 17597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SecBondCancel(bd_addr); 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN); 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (passkey > BTM_MAX_PASSKEY_VAL) 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = BTM_ILLEGAL_VALUE; 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply (bd_addr); 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_reply (bd_addr, passkey); 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SendKeypressNotif 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used during the passkey entry model 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by a device with KeyboardOnly IO capabilities 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (very likely to be a HID Device). 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It is called by a HID Device to inform the remote device when 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a key has been entered or erased. 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type - notification type 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type) 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This API only make sense between PASSKEY_REQ and SP complete */ 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY) 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_send_keypress_notif (bd_addr, type); 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_IoCapRsp 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called in response to BTM_SP_IO_REQ_EVT 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by the tBTM_SP_CALLBACK implementation, this function is 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** called to provide the actual response 18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** io_cap - The IO capability of local device. 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** oob - BTM_OOB_NONE or BTM_OOB_PRESENT. 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** auth_req- MITM protection required or not. 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req) 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s oob: %d io_cap: %d", 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap); 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS) 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX) 18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req = auth_req; 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = io_cap; 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT)); 18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req); 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalOobData 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local OOB data from 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** LM 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void) 18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_SUCCESS; 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_read_local_oob_data() == FALSE) 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_NO_RESOURCES; 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RemoteOobDataReply 18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the remote OOB data for 18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_RMT_OOB_EVT 18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** c - simple pairing Hash C. 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** r - simple pairing Randomizer C. 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r) 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_RemoteOobDataReply(): State: %s res:%d", 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (bd_addr); 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_reply (bd_addr, c, r); 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BuildOobData 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to build the OOB data payload to 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be sent over OOB (non-Bluetooth) link 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_data - the location for OOB data 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** max_len - p_data size. 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** c - simple pairing Hash C. 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** r - simple pairing Randomizer C. 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** name_len- 0, local device name would not be included. 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, the local device name is included for 19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** up to this specified length 19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of bytes in p_data. 19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, 19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 r, UINT8 name_len) 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data; 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = 0; 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 delta; 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 name_size; 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE) 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add mandatory part */ 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, len); 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, btm_cb.devcb.local_addr); 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = BTM_OOB_MANDATORY_SIZE; 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= len; 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now optional part */ 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add Hash C */ 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_HASH_C_SIZE + 2; 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_HASH_C_SIZE + 1; 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE; 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE); 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add Rand R */ 19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_RAND_R_SIZE + 2; 19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_RAND_R_SIZE + 1; 19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE; 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE); 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add class of device */ 19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_COD_SIZE + 2; 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_COD_SIZE + 1; 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_COD_TYPE; 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class); 19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_size = name_len; 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (name_size > strlen(btm_cb.cfg.bd_name)) 19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_size = (UINT16)strlen(btm_cb.cfg.bd_name); 19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = name_size + 2; 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = name_size + 1; 19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = name_type; 19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size); 19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update len */ 19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_data; 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, len); 19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadOobData 20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to parse the OOB data payload 20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** received over OOB (non-Bluetooth) link 20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_data - the location for OOB data 20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** eir_tag - The associated EIR tag to read the data. 20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** *p_len(output) - the length of the data with the given tag. 20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the beginning of the data with the given tag. 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NULL, if the tag is not found. 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len) 20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data; 20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 max_len; 20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 len, type; 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_ret = NULL; 20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ret_len = 0; 20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(max_len, p); 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= BTM_OOB_MANDATORY_SIZE) 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag) 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ret = p; /* the location for bd_addr */ 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = BTM_OOB_BD_ADDR_SIZE; 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= BTM_OOB_MANDATORY_SIZE; 20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now the optional data in EIR format */ 20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (max_len > 0) 20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = *p++; /* tag data len + 1 */ 20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = *p++; 20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (eir_tag == type) 20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ret = p; 20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = len - 1; 20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the data size of this tag is len + 1 (tag data len + 2) */ 20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len > len) 20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= len; 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len--; 20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len--; 20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += len; 20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len = 0; 20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_len) 20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = ret_len; 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_ret; 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetOutService 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the service for 20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** outgoing connections. 20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the profile/application calls BTM_SetSecurityLevel 20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** before initiating a connection, this function does not 20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** need to be called. 20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id) 20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_serv_rec; 20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->service_id == service_id) 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d", 21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id, p_serv_rec->orig_mx_chan_id); 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_serv_rec; 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************ 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** I N T E R N A L F U N C T I O N S 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/ 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_is_upgrade_possible 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2117ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function returns TRUE if the existing link key 2118ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** can be upgraded or if the link key does not exist. 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2120ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BOOLEAN 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2123ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_originator) 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM; 2126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN is_possible = TRUE; 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2130ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_possible = FALSE; 21317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->p_cur_service) 21327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 21335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible id:%d, link_key_typet:%d, rmt_io_caps:%d, chk flags:x%x, flags:x%x", 21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtm_check, p_dev_rec->p_cur_service->security_flags); 21367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 21377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 21387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 21395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible link_key_typet:%d, rmt_io_caps:%d, chk flags:x%x, ", 21407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check); 21417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Already have a link key to the connected peer. Is the link key secure enough? 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Is a link key upgrade even possible? 21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->security_required & mtm_check) /* needs MITM */ 21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) /* has unauthenticated link key */ 21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX) /* a valid peer IO cap */ 21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps])) /* authenticated link key is possible */ 21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* upgrade is possible: check if the application wants the upgrade. 21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If the application is configured to use a global MITM flag, 21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * it probably would not want to upgrade the link key based on the security level database */ 2153ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_possible = TRUE; 2154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2155ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 21565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible is_possible:%d sec_flags:0x%x", is_possible, p_dev_rec->sec_flags); 2157ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return is_possible; 2158ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2160ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 2161ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2162ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_check_upgrade 2163ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2164ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called to check if the existing link key 2165ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** needs to be upgraded. 2166ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2167ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 2168ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2169ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 2170ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_originator) 2171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 2172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SP_UPGRADE evt_data; 21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_check_upgrade..."); 2175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Only check if link key already exists */ 2177ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 2178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 2179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE) 2180ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 21815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags); 2182ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* upgrade is possible: check if the application wants the upgrade. 2183ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * If the application is configured to use a global MITM flag, 2184ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * it probably would not want to upgrade the link key based on the security level database */ 2185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 2186ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta evt_data.upgrade = TRUE; 2187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.api.p_sp_callback) 2188ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 2189ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 21905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade); 2191ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (evt_data.upgrade) 2192ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2193ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if the application confirms the upgrade, set the upgrade bit */ 2194ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Clear the link key known to go through authentication/pairing again */ 2197ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED); 2198ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED; 21995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags); 22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_l2cap_access_req 22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP to grant permission to 22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establish L2CAP connection to or from the peer device. 22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_originator - TRUE if protocol above L2CAP originates 22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are complete. MUST NOT BE NULL. 22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tBTM_STATUS 22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_OUT_FLAGS (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHORIZE) 22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_IN_FLAGS (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE) 22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle, 22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type, 22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, 22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_ref_data) 22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec; 22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 security_required; 22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 old_security_required; 22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN old_is_originator; 22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc = BTM_SUCCESS; 22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN chk_acp_auth_done = FALSE; 22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 22387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */ 22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_ORIG_MASK) 22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req conn_type:0x%x, 0x%x", conn_type, p_ref_data); 22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req is_originator:%d, 0x%x", is_originator, p_ref_data); 22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find or get oldest record */ 22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = handle; 22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the service record for the PSM */ 22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec = btm_sec_find_first_serv (conn_type, psm); 22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no application registered with this PSM do not allow connection */ 22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_serv_rec) 22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_l2cap_access_req() PSM:%d no application registerd", psm); 22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_MODE_UNSUPPORTED); 22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SDP connection we will always let through */ 22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BT_PSM_SDP == psm) 22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY); 22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required = p_serv_rec->ucd_security_flags; 22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_CMD_STARTED; 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) || 22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) 22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) || 22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) 23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_SUCCESS) 23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 23087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); 23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required = p_serv_rec->security_flags; 23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there are some devices (moto KRZR) which connects to several services at the same time */ 23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we will process one after another */ 23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_l2cap_access_req() - busy - PSM:%d delayed state: %s mode:%d, sm4:0x%x", 2324ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4); 23255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags); 23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_CMD_STARTED; 23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((BTM_SEC_MODE_SP != btm_cb.security_mode) 23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((BTM_SEC_MODE_SP == btm_cb.security_mode) && (BTM_SM4_KNOWN == p_dev_rec->sm4)) 2329ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)) 23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ) 23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2332ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* legacy mode - local is legacy or local is lisbon/peer is legacy 2333ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * or SM4 with no possibility of link key upgrade */ 23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 23377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 23387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) || 23397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_rec))) ) 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 23477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) || 23487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) || 23497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) || 23507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) || 23517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_encrypted(p_dev_rec))) || 23527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && btm_dev_encrypted(p_dev_rec) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)))) 23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_SUCCESS) 23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 23617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); 23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_req_pending = TRUE; 23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save pointer to service record */ 23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mess /w security_required in btm_sec_l2cap_access_req for Lisbon */ 23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode == BTM_SEC_MODE_SP) 23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4 -> always authenticate & encrypt */ 23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT); 23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !(BTM_SM4_KNOWN & p_dev_rec->sm4)) 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags); 23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the remote features are not known yet */ 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_REQ_PEND; 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* responder */ 24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */ 24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project chk_acp_auth_done = TRUE; 24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4 -> always authenticate & encrypt */ 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !(BTM_SM4_KNOWN & p_dev_rec->sm4)) 24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("(rsp) remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags); 24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the remote features are not known yet */ 24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_REQ_PEND; 24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req() sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", 24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done); 24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_security_required = p_dev_rec->security_required; 24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_is_originator = p_dev_rec->is_originator; 24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = security_required; 24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = is_originator; 24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_ucd = TRUE; 24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_ucd = FALSE; 24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there are multiple service records used through the same PSM */ 24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* leave security decision for the multiplexor on the top */ 24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((btm_sec_find_next_serv (p_serv_rec)) != NULL) 24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */ 24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_sec_find_next_serv (p_serv_rec)) != NULL) 24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done); 24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!BTM_SEC_IS_SM4(p_dev_rec->sm4)) 24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm); 24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pre-Lisbon: restore the old settings */ 24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = old_security_required; 24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = old_is_originator; 24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the originator is using dynamic PSM in legacy mode, do not start any security process now. 24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * The layer above L2CAP needs to carry out the security requirement after L2CAP connect response is received*/ 24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && (btm_cb.security_mode != BTM_SEC_MODE_SP || !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001)) 24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm); 24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* restore the old settings */ 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = old_security_required; 24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = old_is_originator; 24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (chk_acp_auth_done) 24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x", 24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)); 24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4, but we do not know for sure which level of security we need. 24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * as long as we have a link key, it's OK */ 24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_DELAY_CHECK; 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project because of data path issues. Delay this disconnect a little bit 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 24885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("peer should have initiated security process by now (SM4 to SM4)"); 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_DELAY_FOR_ENC; 24917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, rc); 24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24935aec4865e0231bbdefbcebad270e8cb9bf002d7bHemant Gupta return(BTM_CMD_STARTED); 24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2499ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID 2500ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id) 2501ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2502ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Although authentication and encryption are per connection 2503ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** authorization is per access request. For example when serial connection 2504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** is up and authorized and client requests to read file (access to other 2505ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** scn), we need to request user's permission again. 2506ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta */ 2507ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED; 2508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we already have a link key to the connected peer, is the link key secure enough ? */ 25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_upgrade(p_dev_rec, is_originator); 25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d Handle:%d State:%d Flags:0x%x Required:0x%x Service ID:%d", 25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 25227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc); 25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(rc); 25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_mx_access_request 25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by all Multiplexing Protocols during 25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establishing connection to or from peer device to grant 25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** permission to establish application connection. 25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_originator - TRUE if protocol above L2CAP originates 25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of the multiplexer 25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - multiplexer channel to reach application 25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are completed 25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_ref_data - Pointer to any reference data needed by the 25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the callback function. 25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_CMD_STARTED 25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator, 25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec; 25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc; 2559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 security_required; 25607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN transport = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */ 25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_mx_access_request is_originator:%d", is_originator); 25635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find or get oldest record */ 25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the service record for the PSM */ 25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id); 25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no application registered with this PSM do not allow connection */ 25705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_serv_rec) 25715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 25737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 25745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d", 25765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, mx_proto_id, mx_chan_id); 25775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there are some devices (moto phone) which connects to several services at the same time */ 25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we will process one after another */ 25825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) 25835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_mx_access_request service PSM:%d Proto:%d SCN:%d delayed state: %s", 25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state)); 25865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_CMD_STARTED; 2588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta security_required = p_serv_rec->security_flags; 2589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((BTM_SEC_MODE_SP != btm_cb.security_mode) 2590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || ((BTM_SEC_MODE_SP == btm_cb.security_mode) && (BTM_SM4_KNOWN == p_dev_rec->sm4)) 2591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)) 2592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* legacy mode - local is legacy or local is lisbon/peer is legacy 2595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * or SM4 with no possibility of link key upgrade */ 2596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_originator) 2597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 25997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 26007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) 2601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_SUCCESS; 2604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2606ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2608ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 26097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 26107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) || 26117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) || 26127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))&& btm_dev_encrypted(p_dev_rec))) || 26137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) 2614ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_SUCCESS; 2617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2618ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (rc == BTM_CMD_STARTED) 2621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2622ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_sec_queue_mx_request (bd_addr, psm, is_originator, mx_proto_id, mx_chan_id, p_callback, p_ref_data); 2623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return rc; 2624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = p_serv_rec->security_flags; 26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_MODE_SP == btm_cb.security_mode) 26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 26335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we already have a link key, check if that link key is good enough */ 26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_upgrade(p_dev_rec, is_originator); 26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = is_originator; 26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 26415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Although authentication and encryption are per connection */ 26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* authorization is per access request. For example when serial connection */ 26455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is up and authorized and client requests to read file (access to other */ 26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* scn, we need to request user's permission again. */ 26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED); 26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: mx_access_req proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d", 26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags, p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc); 26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return rc; 26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_conn_req 26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when the peer device is requesting 26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc) 26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); 26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some device may request a connection before we are done with the HCI_Reset sequence */ 26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.state != BTM_DEV_STATE_READY) 26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request when device not ready"); 26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Security guys wants us not to allow connection from not paired devices */ 26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection is allowed for only paired devices */ 26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.connect_only_paired) 26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)) 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device"); 26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE 27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If non-discoverable, only allow known devices to connect */ 27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE) 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request from not paired device"); 27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Host can be registered to verify comming BDA or DC */ 27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_conn_filter_cb) 27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(* btm_cb.p_conn_filter_cb) (bda, dc)) 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request did not pass filter"); 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* incomming call did not pass connection filters. Reject */ 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN))) 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device"); 27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* incoming connection from bonding device is rejected */ 27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT; 27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Host is not interested or approved connection. Save BDA and DC and */ 27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pass request to L2CAP */ 27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN); 27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_dc, dc, DEV_CLASS_LEN); 27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2c_link_hci_conn_req (bda)) 27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* accept the connection -> allocate a device record */ 27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bda); 27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_CONN_PEND; 27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_bond_cancel_complete 27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to report bond cancel complete 27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. 27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void) 27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) || 27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 2773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) || 2774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME && 2775ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags)) 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for dedicated bonding in legacy mode, authentication happens at "link level" 27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * btm_sec_connected is called with failed status. 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * In theory, the code that handles is_pairing_device/TRUE should clean out security related code. 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * However, this function may clean out the security related flags and btm_sec_connected would not know 27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this function also needs to do proper clean up. 27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL) 27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify application that the cancel succeeded */ 27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_bond_cancel_cmpl_callback) 27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS); 27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_create_conn_cancel_complete 27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the command complete message 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is received from the HCI for the create connection cancel 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** command. 28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p) 28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (status, p); 28095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s status:%d", 28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), status); 28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the create conn cancel cmd was issued by the bond cancel, 28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the application needs to be notified that bond cancel succeeded 28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (status) 28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_SUCCESS: 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_ERR_CONNECTION_EXISTS: 28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_ERR_NO_CONNECTION: 28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify application of the error */ 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_bond_cancel_cmpl_callback) 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING); 28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_check_pending_reqs 28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called at the end of the security procedure 28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to let L2CAP and RFCOMM know to re-submit any pending requests 28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void) 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_QUEUE_ENTRY *p_e; 28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BUFFER_Q bq; 28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First, resubmit L2CAP requests */ 28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.sec_req_pending) 28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_req_pending = FALSE; 28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_resubmit_pending_sec_req (NULL); 28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, re-submit anything in the mux queue */ 28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bq = btm_cb.sec_pending_q; 28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_init_q (&btm_cb.sec_pending_q); 28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL) 28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check that the ACL is still up before starting security procedures */ 28627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_bda_to_acl(p_e->bd_addr, BT_TRANSPORT_BR_EDR) != NULL) 28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_check_pending_reqs() submitting PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u", 28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->psm, p_e->is_orig, p_e->mx_proto_id, p_e->mx_chan_id); 28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig, 28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_proto_id, p_e->mx_chan_id, 28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_callback, p_e->p_ref_data); 28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_e); 28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_init 28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is on the SEC startup 28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_init (UINT8 sec_mode) 28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0 /* cleared in btm_init; put back in if calling from anywhere else! */ 28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.sec_serv_rec, 0, sizeof (btm_cb.sec_serv_rec)); 28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.sec_dev_rec, 0, sizeof (btm_cb.sec_dev_rec)); 28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&btm_cb.pairing_tle, 0, sizeof(TIMER_LIST_ENT)); 28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = sec_mode; 28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN); 28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY; 28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_device_down 29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function should be called when device is disabled or 29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** turned off 29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void) 29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_device_down() State: %s", btm_pair_state_descr(btm_cb.pairing_state)); 29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dev_reset 29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function should be called after device reset 29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void) 29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_PRE_LISBON_INCLUDED == TRUE) 29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode == BTM_SEC_MODE_LINK) 29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_encr_mode (HCI_ENCRYPT_MODE_POINT_TO_POINT); 29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_PRE_LISBON_INCLUDED == TRUE) 29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 29393aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach /* btm_sec_dev_reset() is only called from btm_decode_ext_features_page(...) 29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * right now. */ 29413aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btsnd_hcic_write_simple_pairing_mode(HCI_SP_MODE_ENABLED); 29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_set_event_mask(LOCAL_BR_EDR_CONTROLLER_ID, 29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)HCI_DUMO_EVENT_MASK_EXT); 29477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 29487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btsnd_hcic_ble_set_evt_mask((UINT8 *)HCI_BLE_EVENT_MASK_DEF); 29497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_set_event_mask(LOCAL_BR_EDR_CONTROLLER_ID, 29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)HCI_LISBON_EVENT_MASK_EXT); 29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the default IO capabilities */ 29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS; 29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add mx service to use no security */ 29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (RFCOMM_INCLUDED == TRUE) 29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX, 29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0); 29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = BTM_SEC_MODE_SERVICE; 29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode); 29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_abort_access_req 29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP or RFCOMM to abort 29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the pending operation. 29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr) 29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_abort_callback) 29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_abort_callback)(bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name); 29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING) 29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)) 29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dd_create_conn 30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to create the ACL connection for 30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the dedicated boding process 30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec) 30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure an L2cap link control block is available */ 30157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL) 30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30175344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]", 30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set up the control block to indicated dedicated bonding */ 30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) 30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: failed create [%02x%02x%02x%02x%02x%02x]", 30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_release_lcb(p_lcb); 30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE) 30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_update_busy_level (BTM_BLI_PAGE_EVT); 30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]", 30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_rmt_name_request_complete 30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when remote name was obtained from 30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer device 30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status) 30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DEV_CLASS dev_class; 30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_sec_state; 30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete"); 30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda)) 30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr))) 30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If remote name request failed, p_bd_addr is null and we need to search */ 30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* based on state assuming that we are doing 1 at a time */ 30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bd_addr) 30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (p_bd_addr); 30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[0]; 30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)) 30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_addr = p_dev_rec->bd_addr; 30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i == BTM_SEC_MAX_DEVICE_RECORDS) 30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = NULL; 30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_bd_name) 31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_name = (UINT8 *)""; 31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d State:%d p_dev_rec: 0x%08x ", 31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, 31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, p_dev_rec->sec_state, p_dev_rec); 31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d", 31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, 31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status); 31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_sec_state = p_dev_rec->sec_state; 31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN); 31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 31245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags); 31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */ 31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[0] = 0; 31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) 31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved */ 31365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3138831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class, 31405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[0] = 0; 31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[1] = 0; 31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[2] = 0; 31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved even if not found so clients can continue */ 31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3152831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 31535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)""); 31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we were delaying asking UI for a PIN because name was not resolved, ask now */ 31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr 31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) ) 31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", btm_cb.pairing_flags, btm_cb.api.p_pin_callback); 31645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) && 31665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) && 31675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_pin_callback) 31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31695344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback"); 31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name); 31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the same state again to force the timer to be restarted */ 31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if we were delaying bonding because name was not resolved */ 31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) 31815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) 31835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status); 3185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD) 3186ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 3187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_sec_bond_cancel_complete(); 3188ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 3189ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 3190ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 31967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 31977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_bd_name, status); 31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */ 32025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 32035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/ 32057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* If it is set, there may be a race condition */ 32065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete IS_SM4_UNKNOWN Flags:0x%04x", 32077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags); 32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0) 32095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_KNOWN; 32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32145344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__, 32157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4), 32167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)); 32177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN. 32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed) 32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 32215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec)) 32225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ 32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* before originating */ 32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) 32265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection"); 32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both we and the peer are 2.1 - continue to create connection */ 32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 32315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection"); 32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA"); 32465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR); 32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if we were delaying link_key_callback because name was not resolved */ 32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->link_key_not_sent) 32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If HCI connection complete has not arrived, wait for it */ 32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = FALSE; 32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_send_link_key_notif(p_dev_rec); 32615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If its not us who perform authentication, we should tell stackserver */ 32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* that some authentication has been completed */ 32645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is required when different entities receive link notification and auth complete */ 32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 32665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a bonding procedure can disconnect the link now */ 32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 32785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)"); 32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE); 32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer(p_dev_rec->hci_handle); 32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_sec_state != BTM_SEC_STATE_GETTING_NAME) 32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If get name failed, notify the waiting layer */ 32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND) 32965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("waiting for remote features!!"); 32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remote Name succeeded, execute the next security procedure, if any */ 33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (UINT8)btm_sec_execute_procedure (p_dev_rec); 33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If result is pending reply from the user or from the device is pending */ 33055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 33097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 33115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_rmt_host_support_feat_evt 33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the 33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received 33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p) 33235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR bd_addr; /* peer address */ 33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_FEATURES features; 33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (bd_addr, p); 33295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x p[0]: 0x%x", p_dev_rec->sm4, p[0]); 33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_KNOWN; 33363aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE); 33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HCI_SSP_HOST_SUPPORTED(features)) 33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_TRUE; 33405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]); 33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 33445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_io_capabilities_req 33485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when LM request for the IO 33505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capability of the local device and 33515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if the OOB data is present for the device in the event 33525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 33545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 33565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p) 33575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 33585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_IO_REQ evt_data; 33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = 0; 33605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 33615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_orig = TRUE; 33625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 callback_rc = BTM_SUCCESS; 33635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 33655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* setup the default response according to compile options */ 33675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* assume that the local IO capability does not change 33685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * loc_io_caps is initialized with the default value */ 33695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.io_cap = btm_cb.devcb.loc_io_caps; 33705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data = BTM_OOB_NONE; 33715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_AUTH_REQ; 33725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_io_capabilities_req() State: %s", btm_pair_state_descr(btm_cb.pairing_state)); 33745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); 33765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_TRUE; 33775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_io_capabilities_req() State: %s Flags: 0x%04x p_cur_service: 0x%08x", 33795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, p_dev_rec->p_cur_service); 33805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 33825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP) 33845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* received IO capability response already-> not the originator of SSP */ 33865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_orig = FALSE; 33875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) 33895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 33905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* security is already in progress */ 33925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) 33935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 33955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 33965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); 33975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 33985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN)) 33995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* and it's not the device in bonding -> reject it */ 34015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_HOST_BUSY_PAIRING; 34025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 34045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local device initiated dedicated bonding */ 34065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 34075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 34105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_HOST_BUSY_PAIRING; 34125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* paring is not allowed */ 34165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_disabled) 34175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 34185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err_code != 0) 34205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 34225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 34235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); 34245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 34255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code); 34265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 34275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.is_orig = is_orig; 34305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 34325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local device initiated the pairing non-bonding -> use p_cur_service */ 34345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 34355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service && 34365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE)) 34375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_MITM) ? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO; 34395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 34435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (evt_data.bd_addr); 34445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); 34465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 34485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 34495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: False-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); 34505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 34515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 34525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 34535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); 34555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = BTM_SUCCESS; 34575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) 34585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE; 34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */ 34625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_AUTH_SPGB_YES; 34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.api.p_sp_callback) 34655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the callback function implementation may change the IO capability... */ 34675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 34685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 34715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data)) 34725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 34735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (callback_rc == BTM_SUCCESS) 34745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 34755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) 34775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT)); 34795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the user does not indicate "reply later" by setting the oob_data to unknown 34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * send the response right now. Save the current IO capability in the control block */ 34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req = evt_data.auth_req; 34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = evt_data.io_cap; 34855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_io_capabilities_req: State: %s IO_CAP:%d oob_data:%d auth_req:%d", 34875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap, 34885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data, evt_data.auth_req); 34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap, 34915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data, evt_data.auth_req); 34925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_io_capabilities_rsp 34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 34995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the IO capability of the 35005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specified device is received 35015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 35035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 35055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p) 35065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 35075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 35085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_IO_RSP evt_data; 35095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.io_cap, p); 35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.oob_data, p); 35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.auth_req, p); 35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a new device record or reuse the oldest one */ 35165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); 35175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no security is in progress, this indicates incoming security */ 35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); 35225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP); 35245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure we reset the trusted mask to help against attacks */ 35265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* work around for FW bug */ 35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_stop_on_ssp(); 35305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (evt_data.bd_addr); 35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We must have a device record here. 35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Use the connecting device's CoD for the connection */ 35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFALSE-POSITIVE error from Coverity test-tool. evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); 35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */ 35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */ 35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (evt_data.auth_req & BTM_AUTH_DD_BOND) ) /* and dedicated bonding bit is set */ 35475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD; 35495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the IO capability in the device record */ 35525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_io_caps = evt_data.io_cap; 35535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_auth_req = evt_data.auth_req; 35545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 35565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 35575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 35605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_proc_sp_req_evt 35625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process/report 35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_USER_CONFIRMATION_REQUEST_EVT 35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or HCI_USER_PASSKEY_REQUEST_EVT 35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or HCI_USER_PASSKEY_NOTIFY_EVT 35675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 35695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p) 35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_ERR_PROCESSING; 35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_EVT_DATA evt_data; 35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda = evt_data.cfm_req.bd_addr; 35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All events start with bd_addr */ 35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s", 35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5], 35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event, btm_pair_state_descr(btm_cb.pairing_state)); 35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL) 35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) 35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)evt_data.cfm_req.bd_name, sizeof(evt_data.cfm_req.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN); 35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_CFM_REQ_EVT: 35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Numeric confirmation. Need user to conf the passkey */ 35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); 35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The device record must be allocated in the "IO cap exchange" step */ 36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p); 36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works = TRUE; 36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process user confirm req in association with the auth_req param */ 36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO) 36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO) 36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO) 36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) ) 36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both devices are DisplayYesNo and one or both devices want to authenticate 36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project -> use authenticated link key */ 36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works = FALSE; 36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d", 36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps, 36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req); 36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.loc_auth_req = btm_cb.devcb.loc_auth_req; 36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.rmt_auth_req = p_dev_rec->rmt_auth_req; 36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.loc_io_caps = btm_cb.devcb.loc_io_caps; 36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.rmt_io_caps = p_dev_rec->rmt_io_caps; 36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_NOTIF_EVT: 36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Passkey notification (other side is a keyboard) */ 36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32 (evt_data.key_notif.passkey, p); 36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT: passkey: %u", evt_data.key_notif.passkey); 36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_REQ_EVT: 36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HCI_USER_PASSKEY_REQUEST_EVT */ 36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY); 36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data); 36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_NOT_AUTHORIZED) 36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */ 36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) ) 36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* automatically reply with just works if no sp_cback */ 36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_SUCCESS; 36565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTM_SP_CFM_REQ_EVT) 36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status); 36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfirmReqReply (status, p_bda); 36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTM_SP_KEY_REQ_EVT) 36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PasskeyReqReply(status, p_bda, 0); 36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Something bad. we can only fail this connection */ 36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SP_CFM_REQ_EVT == event) 36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (p_bda, FALSE); 36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTM_SP_KEY_NOTIF_EVT == event) 36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do nothing -> it very unlikely to happen. 36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project This event is most likely to be received by a HID host when it first connects to a HID device. 36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Usually the Host initiated the connection in this case. 36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project On Mobile platforms, if there's a security process happening, 36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the host probably can not initiate another connection. 36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTW (PC) is another story. */ 36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL != (p_dev_rec = btm_find_dev (p_bda)) ) 36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE); 36905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply(p_bda); 36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_keypress_notif_evt 37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a key press notification is 37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** received 37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_keypress_notif_evt (UINT8 *p) 37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_KEYPRESS evt_data; 37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda; 37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse & report BTM_SP_KEYPRESS_EVT */ 37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda = evt_data.bd_addr; 37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.notif_type = *p; 37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_simple_pair_complete 37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when simple pairing process is 37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** complete 37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 37355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p) 37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_COMPLT evt_data; 37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN disc = FALSE; 37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = *p++; 37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL) 37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x", 37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (evt_data.bd_addr[0]<<24) + (evt_data.bd_addr[1]<<16) + (evt_data.bd_addr[2]<<8) + evt_data.bd_addr[3], 37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]); 37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_simple_pair_complete() Pair State: %s Status:%d sec_state: %u", 37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state); 37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_ERR_PROCESSING; 37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_SUCCESS; 37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_PAIRING_NOT_ALLOWED) 37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The test spec wants the peer device to get this failure code. */ 37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT); 37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Change the timer to 1 second */ 37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT); 37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0) 37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop the timer */ 37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&btm_cb.pairing_tle); 37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) 37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the initiating side: will receive auth complete event. disconnect ACL at that time */ 37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc = TRUE; 37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc = TRUE; 37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Let the pairing state stay active, p_auth_complete_callback will report the failure */ 37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc) 37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* simple pairing failed */ 3799db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta /* Avoid sending disconnect on HCI_ERR_PEER_USER */ 3800db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) 3801db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta { 3802db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 3803db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta } 38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_rem_oob_req 38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process/report 38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_REMOTE_OOB_DATA_REQUEST_EVT 38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 38165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p) 38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda; 38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_RMT_OOB evt_data; 38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 38235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 c; 38245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 r; 38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda = evt_data.bd_addr; 38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 38295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 38315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) && 38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_sp_callback) 38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S((char *)evt_data.bd_name, sizeof(evt_data.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN+1); 3839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta evt_data.bd_name[BTM_MAX_REM_BD_NAME_LEN] = 0; 38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); 38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((*btm_cb.api.p_sp_callback) (BTM_SP_RMT_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data) == BTM_NOT_AUTHORIZED) 38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RemoteOobDataReply(TRUE, p_bda, c, r); 38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 38475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* something bad. we can only fail this connection */ 38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 38515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (p_bda); 38525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_read_local_oob_complete 38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when read local oob data is 38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p) 38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_LOC_OOB evt_data; 38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status = *p++; 38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38695344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status); 38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_SUCCESS; 38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_ARRAY16(evt_data.c, p); 38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_ARRAY16(evt_data.r, p); 38755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 38775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_ERR_PROCESSING; 38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */ 38835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_auth_collision 38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when authentication or encryption 38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** needs to be retried at a later time. 38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle) 38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.collision_start_time) 38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = GKI_get_tick_count (); 39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((GKI_get_tick_count () - btm_cb.collision_start_time) < btm_cb.max_collision_delay) 39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle == BTM_SEC_INVALID_HANDLE) 39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL) 39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING); 39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev_by_handle (handle); 39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec != NULL) 39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state); 39145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We will restart authentication after timeout */ 39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) 39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = 0; 39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = (UINT32) btm_sec_collision_timeout; 39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT); 39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_auth_complete 39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when authentication of the connection is 39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status) 39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_sm4; 39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN are_bonding = FALSE; 39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 39435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 39445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d dev->sec_state: %u Bda:%08x, RName:%s", 39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), 39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status, 39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state, 39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->bd_addr[2]<<24)+(p_dev_rec->bd_addr[3]<<16)+(p_dev_rec->bd_addr[4]<<8)+p_dev_rec->bd_addr[5], 39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d", 39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), 39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status); 39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For transaction collision we need to wait and repeat. There is no need */ 39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for random timeout because only slave should receive the result */ 39645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) 39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_auth_collision(handle); 39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = 0; 39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection was made just to do bonding. If we authenticate 39745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the connection that is up, this is the last event received. 39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec 39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) 39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer (p_dev_rec->hci_handle); 39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 39865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* keep the old sm4 flag and clear the retry bit in control block */ 39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_sm4 = p_dev_rec->sm4; 39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_RETRY; 39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 39945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) 39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project are_bonding = TRUE; 39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) 40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS) 40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (old_state != BTM_PAIR_STATE_IDLE) ) 40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There can be a race condition, when we are starting authentication and 40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the peer device is doing encryption. 40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** If first we receive encryption change up, then initiated authentication 40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** can not be performed. According to the spec we can not do authentication 40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** on the encrypted link, so device is correct. 40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_COMMAND_DISALLOWED) 40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) == 40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))) 40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = HCI_SUCCESS; 40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Currently we do not notify user if it is a keyboard which connects */ 40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* User probably Disabled the keyboard while it was asleap. Let her try */ 40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report the suthentication status */ 40285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_state != BTM_PAIR_STATE_IDLE) 40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a bonding procedure can disconnect the link now */ 40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (are_bonding) 40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 4042db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta { 4043db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))) 4044db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); 4045db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta } 40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer (p_dev_rec->hci_handle); 40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If authentication failed, notify the waiting layer */ 40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((old_sm4 & BTM_SM4_RETRY) == 0) 40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allow retry only once */ 40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION) 40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not retried yet. set the retry bit */ 40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_RETRY; 40625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags); 40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this retry for missing key is for Lisbon or later only. 40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Legacy device do not need this. the controller will drive the retry automatically */ 40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4)) 40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not retried yet. set the retry bit */ 40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_RETRY; 40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 40715344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags); 40725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* With BRCM controller, we do not need to delete the stored link key in controller. 40745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project If the stack may sit on top of other controller, we may need this 40755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DeleteStoredLinkKey (bd_addr, NULL); */ 40765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_RETRY) 40795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_execute_procedure (p_dev_rec); 40815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 40865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 40885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 40905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 40955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Authentication succeeded, execute the next security procedure, if any */ 40975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_execute_procedure (p_dev_rec); 40985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no next procedure, or procedure failed to start, notify the caller */ 41005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 41017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 41025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 41035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 41055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_mkey_comp_event 41075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when encryption of the connection is 41095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 41105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 41125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_mkey_comp_event (UINT16 handle, UINT8 status, UINT8 key_flg) 41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 41175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 bd_addr[BD_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} ; 41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41195344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: mkey comp status:%d State:%d", 41205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, (p_dev_rec) ? p_dev_rec->sec_state : 0); 41215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If encryption setup failed, notify the waiting layer */ 41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.mkey_cback) 41255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 41275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.mkey_cback)(bd_addr, status, key_flg ); 41285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 41295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.mkey_cback)(p_dev_rec->bd_addr, status, key_flg ); 41305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 41325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 41345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_encrypt_change 41365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when encryption of the connection is 41385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 41395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 41415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 41435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) 41445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 4146ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 41477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p_acl = NULL; 41487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 acl_idx = btm_handle_to_acl_index(handle); 4149ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 41505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d", 41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable); 41525344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 ); 41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For transaction collision we need to wait and repeat. There is no need */ 41555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for random timeout because only slave should receive the result */ 41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) 41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_auth_collision(handle); 41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = 0; 41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 41645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_SUCCESS) && encr_enable) 41677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 41687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->hci_handle == handle) 41697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED); 41707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 41717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED); 41727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 41735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* It is possible that we decrypted the link to perform role switch */ 41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mark link not to be encrypted, so that when we execute security next time it will kick in again */ 41765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_SUCCESS) && !encr_enable) 41777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 41787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->hci_handle == handle) 41797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED; 41807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 41817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED; 41827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags ); 4185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 41877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (acl_idx != MAX_L2CAP_LINKS ) 41887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_acl = &btm_cb.acl_db[acl_idx]; 4189ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 41907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_acl && p_acl->transport == BT_TRANSPORT_LE) 41915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4192d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE 4193d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera ||status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) 4194d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN); 41955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_link_encrypted(p_dev_rec->bd_addr, encr_enable); 41965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 41995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BR/EDR connection, update the encryption key size to be 16 as always */ 42005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->enc_key_size = 16; 42015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 42025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this encryption was started by peer do not need to do anything */ 42045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING) 42055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state) 42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr); 42115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 42165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If encryption setup failed, notify the waiting layer */ 42185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 42195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 42215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Encryption setup succeeded, execute the next security procedure, if any */ 42255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (UINT8)btm_sec_execute_procedure (p_dev_rec); 42265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no next procedure, or procedure failed to start, notify the caller */ 42285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 42297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 42305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_create_conn 42355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function records current role and forwards request to 42375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI 42385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 42405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 42425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_create_conn (BD_ADDR bda, UINT16 packet_types, 42435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 page_scan_rep_mode, UINT8 page_scan_mode, 42445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 clock_offset, UINT8 allow_switch) 42455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 42465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (bda); 42475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_bda, p_dev_rec->bd_addr, BD_ADDR_LEN); 42495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); 42505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = 0xff ; 42525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 42545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->role_master = TRUE; 42555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If any SCO link up, do not allow a switch */ 42575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_GetNumScoLinks() != 0) 42585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project allow_switch = HCI_CR_CONN_NOT_ALLOW_SWITCH; 42595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btsnd_hcic_create_conn (bda, packet_types, page_scan_rep_mode, 42615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project page_scan_mode, clock_offset, allow_switch)); 42625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_connect_after_reject_timeout 42675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Connection for bonding could not start because of the collision 42695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Initiate outgoing connection 42705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 42725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 42745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_connect_after_reject_timeout (TIMER_LIST_ENT *p_tle) 42755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 42765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec; 42775cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 42785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_connect_after_reject_timeout()"); 42805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = 0; 42815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = 0; 42825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 42845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection"); 42865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 42885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 42905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 42915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 42925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_connected 42985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when a connection to the peer device is 43005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establsihed 43015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 43035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 43055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) 43065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 43075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); 43085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 res; 43095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_pairing_device = FALSE; 43105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tACL_CONN *p_acl_cb; 43117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 bit_shift = 0; 43125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 43145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 43165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 43175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 43185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 43195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x RName:%s", 43215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, 43225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5], 43235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 43245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 43265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x ", 43285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, 43295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]); 43305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 43325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 43345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no device record for new connection. Allocate one */ 43365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 43375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bda); 43395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 43415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* can not find the device record and the status is error, 43435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * just ignore it */ 43445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Update the timestamp for this device */ 43485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 43507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 43517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0; 43527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) 43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell L2CAP it's a bonding connection. */ 43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) 43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming connection failed while pairing, then try to connect and continue */ 43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Motorola S9 disconnects without asking pin code */ 43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ)) 43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN"); 43665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 43695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer with 0 to initiate connection with new LCB */ 43715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because L2CAP will delete current LCB with this event */ 43725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout; 43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0); 43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 43797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR); 43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE); 43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always clear the pending flag */ 43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 43935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 43977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR; 43987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 43997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4404ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4405ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) ) 44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection from bonding device */ 44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_HOST_REJECT_DEVICE) 44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)) 44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x", 44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags, p_dev_rec->sm4); 44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT; 44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 44185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 44217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR); 44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we already have pin code */ 44265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) 44275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer with 0 to initiate connection with new LCB */ 44295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because L2CAP will delete current LCB with this event */ 44305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 44315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout; 44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0); 44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* wait for incoming connection without resetting pairing state */ 44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (status == HCI_ERR_CONNECTION_EXISTS) 44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44405344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection"); 44415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_pairing_device = TRUE; 44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection was made to do bonding restore link security if changed */ 44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 44495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if connection fails during pin request, notify application */ 44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection failed because of during pairing, need to tell user */ 44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_pairing_device) 44555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 44577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift); 44585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required ); 44595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify host that the key is not known any more */ 44635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 44645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 44665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 44685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* 44717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta Do not send authentication failure, if following conditions hold good 44727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1. BTM Sec Pairing state is idle 44737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2. Link key for the remote device is present. 44747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3. Remote is SSP capable. 44757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta */ 44767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else if ((p_dev_rec->link_key_type <= BTM_LKEY_TYPE_REMOTE_UNIT) && 44777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((status == HCI_ERR_AUTH_FAILURE) || 44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_KEY_MISSING) || 44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_HOST_REJECT_SECURITY) || 44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_PAIRING_NOT_ALLOWED) || 44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_UNIT_KEY_USED) || 44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || 44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || 44847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (status == HCI_ERR_REPEATED_ATTEMPTS)))) 44855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 44877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift); 44887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 44897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 44907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE 44917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* If we rejected pairing, pass this special result code */ 44927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY) 44937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 44947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta status = HCI_ERR_HOST_REJECT_SECURITY; 44957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 44967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify host that the key is not known any more */ 44995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 45025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 45035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 45045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT || 45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT) 45097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE); 45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 45117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 45125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If initiated dedicated bonding, return the link key now, and initiate disconnect */ 45175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If dedicated bonding, and we now have a link key, we are all done */ 45185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_pairing_device 45195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) ) 45205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->link_key_not_sent) 45225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = FALSE; 45245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_send_link_key_notif(p_dev_rec); 45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remember flag before it is initialized */ 45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = TRUE; 45325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = FALSE; 45345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 45365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 45375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 45385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 45395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 45415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( res ) 45435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Let l2cap start bond timer */ 45455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE); 45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = handle; 45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role may not be correct here, it will be updated by l2cap, but we need to */ 45545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* notify btm_acl that link is up, so starting of rmt name request will not */ 45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set paging flag up */ 45567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR); 45575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_acl_cb) 45585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */ 45605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE) 45615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For now there are a some devices that do not like sending */ 45625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* commands events and data at the same time. */ 45635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the packet types to the default allowed by the device */ 45645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported); 45655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.btm_def_link_policy) 45675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); 45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 45695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_acl_created (bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR); 45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize security flags. We need to do that because some */ 45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* authorization complete could have come after the connection is dropped */ 45745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* and that would set wrong flag that link has been authorized already */ 45757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | 45767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift); 45775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (enc_mode != HCI_ENCRYPT_MODE_DISABLED) 45797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift); 45805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode == BTM_SEC_MODE_LINK) 45827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift); 45835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_changed = FALSE; 45855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* After connection is established we perform security if we do not know */ 45875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the name, or if we are originator because some procedure can have */ 45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* been scheduled while connection was down */ 45895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator); 45905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator) 45915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 45937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE); 45945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 45975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 45995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_role_changed 46015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is colled when controller reports role 46035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** changed, or failed command status for Role Change request 46045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 46065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_role_changed (void *p_ref_data) 46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 46105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = (tBTM_SEC_DEV_REC *)p_ref_data; 46115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 res; 46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: role changed"); 46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this role switch was started by peer do not need to do anything */ 46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_SWITCHING_ROLE) 46175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If serurity required was to FORCE switch and it failed, notify the waiting layer */ 46205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec->security_required & BTM_SEC_FORCE_MASTER) && !p_dev_rec->role_master) 46215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((p_dev_rec->security_required & BTM_SEC_FORCE_SLAVE) && p_dev_rec->role_master)) 46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_ROLE_SWITCHED; 46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | 46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((res = (UINT8)btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE); 46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_disconnect 46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to disconnect HCI link 46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns btm status 46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason) 46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In some weird race condition we may not have a record */ 46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_disconnect (handle, reason); 46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are in the process of bonding we need to tell client that auth failed */ 46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) 46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are currently doing bonding. Link will be disconnected when done */ 46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_BUSY); 46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle)); 46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 46745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_disconnected 46765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when a connection to the peer device is 46785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dropped 46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 46815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason) 46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 46855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 46865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_pairing_flags = btm_cb.pairing_flags; 46875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int result = HCI_ERR_AUTH_FAILURE; 4688ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach tBTM_SEC_CALLBACK *p_callback = NULL; 46897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 46905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If page was delayed for disc complete, can do it now */ 46925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.discing = FALSE; 46935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 46955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 46975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE; 47007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4701ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4702ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 47035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 47045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR("btm_sec_disconnected - Clearing Pending flag"); 47055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 47065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 47075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear unused flags */ 47095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= BTM_SM4_TRUE; 47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("btm_sec_disconnected() sec_req:x%x State: %s reason:%d bda:%04x%08x RName:%s", 47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state), reason, (p_dev_rec->bd_addr[0]<<8)+p_dev_rec->bd_addr[1], 47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->bd_addr[2]<<24)+(p_dev_rec->bd_addr[3]<<16)+(p_dev_rec->bd_addr[4]<<8)+p_dev_rec->bd_addr[5], p_dev_rec->sec_bd_name); 47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("before Update sec_flags=0x%x", p_dev_rec->sec_flags); 47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are in the process of bonding we need to tell client that auth failed */ 47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 47195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)) 47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the disconnection reason is REPEATED_ATTEMPTS, 47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project send this error message to complete callback function 47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project to display the error message of Repeated attempts. 47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project All others, send HCI_ERR_AUTH_FAILURE. */ 47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == HCI_ERR_REPEATED_ATTEMPTS) 47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = HCI_ERR_REPEATED_ATTEMPTS; 47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = HCI_ERR_HOST_REJECT_SECURITY; 47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 47385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, result); 47395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 47435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->enc_key_size = 0; 474424adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS); 47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* see sec_flags processing in btm_acl_removed */ 47467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 47477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 47487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 47497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE; 47507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED); 47517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 47527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 47535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 47547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 47557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE; 47567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED); 47577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 47585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 47605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 4761ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4762ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach p_callback = p_dev_rec->p_callback; 4763ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4764ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach /* if security is pending, send callback to clean up the security state */ 4765ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach if(p_callback) 4766ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach { 4767ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before 4768ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach we do, this call back must be reset here */ 47697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING); 4770ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach } 4771ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 47725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("after Update sec_flags=0x%x", p_dev_rec->sec_flags); 47735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 47745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 47765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_notification 47785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a new connection link key is 47805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generated 47815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 47835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 47855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type) 47865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 47875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); 47885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN we_are_bonding = FALSE; 47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_notification() BDA:%04x%08x, TYPE: %d", 47915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5], 47925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_type); 47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection was made to do bonding restore link security if changed */ 47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Override the key type if version is pre-1.1 */ 47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.local_version.hci_version < HCI_VERSION_1_1) 47995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type = BTM_LKEY_TYPE_IGNORE; 48005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (key_type != BTM_LKEY_TYPE_CHANGED_COMB) 48015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type = key_type; 48025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 4804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) 4805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* BR/EDR connection, update the encryption key size to be 16 as always */ 4806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->enc_key_size = 16; 4807ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 48085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN); 48095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 48115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) 48125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 48145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project we_are_bonding = TRUE; 48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 48165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 48175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If name is not known at this point delay calling callback until the name is */ 48205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* resolved. Unless it is a HID Device and we really need to send all link keys. */ 48215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 48225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL)) ) 48235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_notification() Delayed BDA: %08x%04x Type:%d", 48255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5], key_type); 48265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = TRUE; 48285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If it is for bonding nothing else will follow, so we need to start name resolution */ 48305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (we_are_bonding) 48315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0))) 48335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_rmt_name_failed(); 48345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x", p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, p_dev_rec->dev_class[1]) 48375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 48385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If its not us who perform authentication, we should tell stackserver */ 48415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* that some authentication has been completed */ 48425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is required when different entities receive link notification and auth complete */ 48435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 48445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 48465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 48475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 48485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We will save link key only if the user authorized it - BTE report link key in all cases */ 48515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE 48525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED) 48535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 48545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_callback) 48565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 48585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_link_key, p_dev_rec->link_key_type); 48595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 48625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 48645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_request 48665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests link key 48685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 48705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda) 48735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 48745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); 48755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_request() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 48775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 48785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4879b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) && 4880b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta (btm_cb.collision_start_time != 0) && 4881b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) ) 4882b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta { 4883b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req " 4884b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta "State: %d START_TIMEOUT : %d", 4885b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta btm_cb.pairing_state, btm_cb.collision_start_time); 4886b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta btsnd_hcic_link_key_neg_reply (p_bda); 4887b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta return; 4888b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta } 48895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 48905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key); 48925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 48935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 48965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (p_bda); 48975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Only ask the host for a key if this guy is not already bonding */ 48995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 49005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) ) 49015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_req_callback) 49035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((*btm_cb.api.p_link_key_req_callback)(p_bda, p_dev_rec->link_key) == BTM_SUCCESS) 49055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key); 49075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 49085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The link key is not in the database and it is not known to the manager */ 49135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_neg_reply (p_bda); 49145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 49155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 49175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_pairing_timeout 49195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when host does not provide PIN 49215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** within requested time 49225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 49245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 49265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle) 49275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 49285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 49295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 49305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 49315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE) 49325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO; 49335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 49345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_YES; 49355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 49365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 49375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 name[2]; 49385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 49395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->pairing_tle.param = 0; 49415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */ 49425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[UNUSED_VALUE] pointer p_dev_rec is actually used several times... This is a Coverity false-positive, i.e. a fake issue. 49435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 49445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (p_cb->pairing_bda); 49455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pairing_timeout() State: %s Flags: %u", 49475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags); 49485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->pairing_state) 49505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_PIN_REQ: 49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_PIN: 49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) 49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda); 49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 49595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify the UI that no longer need the PIN */ 49605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 49615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name[0] = 0; 49655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, 49665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 49675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name, HCI_ERR_CONNECTION_TOUT); 49685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 49725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); 49735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: 49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE); 49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 49805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 49825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_KEY_ENTRY: 49835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); 49845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 49865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */ 49875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 49895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: 49905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 49915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project auth_req |= BTM_AUTH_DD_BOND; 49925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps, 49945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_OOB_NONE, auth_req); 49955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 49965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 49975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: 49995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda); 50005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */ 50035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_DISCONNECT: 50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* simple pairing failed. Started a 1-sec timer at simple pairing complete. 50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * now it's time to tear down the ACL link*/ 50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x", 50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3], 50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]); 50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: 50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify the UI that timeout has happened while waiting for authentication*/ 50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name[0] = 0; 50265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, 50275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 50285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name, HCI_ERR_CONNECTION_TOUT); 50295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); 50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 50385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state)); 50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 50455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_pin_code_request 50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests PIN code 50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda) 50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 50575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505857bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#ifdef PORCHE_PAIRING_CONFLICT 505957bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath UINT8 default_pin_code_len = 4; 506057bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30}; 506157bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#endif 50625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request() State: %s, BDA:%04x%08x", 50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), 50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5] ); 50655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) && 50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) ) 50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fake this out - porshe carkit issue - */ 50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btm_cb.pairing_state = BTM_PAIR_STATE_IDLE; 50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(! btm_cb.pin_code_len_saved) 50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 50775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 50795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); 50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ) 50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) 50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s", 50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state)); 50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reply pin code again due to counter in_rand when local initiates pairing */ 50925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing"); 50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(! btm_cb.pin_code_len_saved) 50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 509557bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 509657bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code); 50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 50995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 51015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); 51025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 51055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 51065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (p_bda); 51115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* received PIN code request. must be non-sm4 */ 51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_KNOWN; 51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN); 51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD; 51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure we reset the trusted mask to help against attacks */ 51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) 51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying"); 51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code); 51285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Use the connecting device's CoD for the connection */ 51325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN)) 51335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) ) 51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN); 51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We could have started connection after asking user for the PIN code */ 51375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len != 0) 51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply"); 51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code); 51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = btm_cb.pin_code_len; 51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark that we forwarded received from the user PIN code */ 51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = 0; 51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We can change mode back right away, that other connection being established */ 51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is not forced to be secure - found a FW issue, so we can not do this 51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); */ 51525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If pairing disabled OR (no PIN callback and not bonding) */ 51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR we could not allocate entry in the database reject pairing request */ 51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_cb->pairing_disabled 51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_cb->api.p_pin_callback == NULL) 51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR Microsoft keyboard can for some reason try to establish connection */ 51625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the only thing we can do here is to shut it up. Normally we will be originator */ 51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for keyboard bonding */ 51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator 51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) 51665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) ) 51675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!", 51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec); 51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 51725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify upper layer of PIN request and start expiration timer */ 51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = 0; 51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 51785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Pin code request can not come at the same time as connection request */ 51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN); 51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); 51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the name is known */ 51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Even if name is not known we might not be able to get one */ 51845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this is the case when we are already getting something from the */ 51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* device, so HCI level is flow controlled */ 51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Also cannot send remote name request while paging, i.e. connection is not completed */ 51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback"); 51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->api.p_pin_callback) 51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name); 51945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name"); 51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We received PIN code request for the device with unknown name */ 52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* it is not user friendly just to ask for the PIN without name */ 52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* try to get name at first */ 52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr, 52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_PAGE_SCAN_REP_MODE_R1, 52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_MANDATARY_PAGE_SCAN_MODE, 0)) 52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 52075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[0] = 'f'; 52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[1] = '0'; 52095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback"); 52105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 52125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->api.p_pin_callback) 52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name); 52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_update_clock_offset 52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to update clock offset 52265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 52285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 52305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset) 52315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 52325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 52335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_inq_info; 52345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL) 52365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL) 52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 52455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************** 52485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C F U N C T I O N S 52495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/ 52505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 52525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_execute_procedure 52545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start required security 52565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedure. There is a case when multiplexing protocol 52575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** calls this function on the originating side, connection to 52585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer will not be established. This function in this 52595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** case performs only authorization. 52605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS - permission is granted 52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_CMD_STARTED - in process 52635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES - permission declined 52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) 52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 52685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d", 52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state); 52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is a chance that we are getting name. Wait until done. */ 52725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != 0) 52735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If any security is required, get the name first */ 52765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 52775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 52785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start get name"); 52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_get_name (p_dev_rec)) 52815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 52835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not authenticated and authentication is required */ 52885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start authentication and return PENDING to the caller */ 52895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE))) 52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming UCD packet, discard it */ 52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) 52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_FAILED_ON_SECURITY); 52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start authentication"); 53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_authentication (p_dev_rec)) 53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not encrypted and encryption is required */ 53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start encryption and return PENDING to the caller */ 53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 53125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT)) 53135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT))) 53145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 53155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 53175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming UCD packet, discard it */ 53185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) 53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_FAILED_ON_SECURITY); 53205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 53215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53225344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start encryption"); 53235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_encryption (p_dev_rec)) 53255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 53275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 53295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not authorized and authorization is required */ 53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start authorization and return PENDING to the caller */ 53335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) 53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE)) 53355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE)))) 53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("service id:%d, is trusted:%d", 53385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id, 53395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 53405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id))); 53415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) && 53425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) && 53435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 53445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id) == FALSE)) 53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start authorization"); 53475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_start_authorization (p_dev_rec)); 53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All required security procedures already established */ 53525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE | 53535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE | 53545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT | 53555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | 53565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 53575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]); 53595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: access granted"); 53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 53625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 53635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 53665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_get_name 53685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start get name procedure 53705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 53725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 53745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec) 53755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 53765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tempstate = p_dev_rec->sec_state; 53775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME; 53795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Device should be connected, no need to provide correct page params */ 53815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 0 and NULL are as timeout and callback params because they are not used in security get name case */ 53825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC, 53835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, NULL)) != BTM_CMD_STARTED) 53845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = tempstate; 53865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 53875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 53905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 53915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 53935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_authentication 53955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start authentication 53975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 53995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec) 54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btsnd_hcic_auth_request (p_dev_rec->hci_handle)); 54065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_encryption 54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start encryption 54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec) 54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 54195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE)) 54205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 54215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 54235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 54245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_authorization 54305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start authorization 54325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 54345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 54365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec) 54375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 54385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 result; 54395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_service_name = NULL; 54405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 service_id; 54415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 54435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)) 54445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.api.p_authorize_callback) 54465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_MODE_UNSUPPORTED); 54475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_cur_service) 54495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 54515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->is_originator) 54525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name = p_dev_rec->p_cur_service->orig_service_name; 54535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 54545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name = p_dev_rec->p_cur_service->term_service_name; 54555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 54565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = p_dev_rec->p_cur_service->service_id; 54575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 54595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = 0; 54605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5461ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send authorization request if not already sent during this service connection */ 5462ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID 5463ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || p_dev_rec->last_author_service_id != service_id) 5464ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 5465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING; 5466ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr, 54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, 54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name, 54705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id, 54715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator); 5472ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5473ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5474ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else /* Already authorized once for this L2CAP bringup */ 5475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 54765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id); 5477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BTM_SUCCESS); 5478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == BTM_SUCCESS) 54815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED; 5483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Save the currently authorized service in case we are asked again by another multiplexer layer */ 5485ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_dev_rec->is_originator) 5486ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = service_id; 5487ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 54885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 54895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(result); 54915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_start_get_name (p_dev_rec); 54935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 54945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_are_all_trusted 54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called check if all services are trusted 55015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if all are trusted, otherwise FALSE 55035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]) 55065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5507ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT32 trusted_inx; 55085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++) 55095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL) 55115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 55125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 55155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_first_serv 55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the first record in the service database 55225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified PSM 55235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 55255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm) 55285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 55325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 55345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_ORIG_MASK ) 55365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 55375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm) 55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is outgoing connection and the PSM matches p_out_serv, 55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it as the current service */ 55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.p_out_serv; 55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, just find the first record with the specified PSM */ 55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) ) 55545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_next_serv 55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the next record in the service database 55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified PSM 55665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 55685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur) 55715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 55735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 55745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 55765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 55785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->psm == p_cur->psm) ) 55795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cur != p_serv_rec) 55815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 55835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 55875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_mx_serv 55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the service database with specified 55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PSM and multiplexor channel information 55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, 56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id) 56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv; 56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_find_mx_serv"); 56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && p_out_serv && p_out_serv->psm == psm 56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && p_out_serv->mx_proto_id == mx_proto_id 56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && p_out_serv->orig_mx_chan_id == mx_chan_id) 56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is outgoing connection and the parameters match p_out_serv, 56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it as the current service */ 56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.p_out_serv; 56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, the old way */ 56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->psm == psm) 56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->mx_proto_id == mx_proto_id) 56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( is_originator && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) 56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!is_originator && (p_serv_rec->term_mx_chan_id == mx_chan_id)))) 56255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 56275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 56305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_collision_timeout 56365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Encryption could not start because of the collision 56385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** try to do it again 56395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 56415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle) 56445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 56465cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 56475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_collision_timeout()"); 56495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = 0; 56505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec); 56525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If result is pending reply from the user or from the device is pending */ 56545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 56555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 56577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE); 56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_request 56645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests link key 56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec) 56715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_callback) 56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 56745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, p_dev_rec->link_key, 56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type); 56765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadTrustedMask 56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get trusted mask for the peer device 56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device 56855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL, if the device record is not found. 56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, the trusted mask 56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr) 56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec->trusted_mask); 56975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 56995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_restore_mode 57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the security mode to previous setting 57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if it was changed during bonding. 57105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void) 57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode_changed) 57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = FALSE; 57205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("btm_restore_mode: Authen Enable -> %d", (btm_cb.security_mode == BTM_SEC_MODE_LINK)); 57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK)); 57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_type_changed) 57255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_type_changed = FALSE; 57275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type); 57285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_dev_by_sec_state 57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the device 57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** which is being authenticated or encrypted 57385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 57405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state) 57435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 57455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 57505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state == state)) 57515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 57525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 57545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_snd_conn_encrypt 57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start/stop encryption 57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Used by JSR-82 57625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if request started 57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_snd_conn_encrypt (UINT16 handle, BOOLEAN enable) 57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 57695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57705344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_snd_conn_encrypt Security Manager: encrypt_change p_dev_rec : 0x%x, enable = %s", p_dev_rec, (enable == TRUE) ? "TRUE" : "FALSE"); 57715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_snd_conn_encrypt Error no p_dev_rec : 0x%x\n", p_dev_rec); 57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_dev_rec->sec_state == BTM_SEC_STATE_IDLE) 57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_set_conn_encrypt (handle, enable)) 57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 57865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 57885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 57895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_change_pairing_state 57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to change pairing state 57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state) 57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_change_pairing_state Old: %s", btm_pair_state_descr(btm_cb.pairing_state)); 58035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_change_pairing_state New: %s pairing_flags:0x%x",btm_pair_state_descr(new_state), btm_cb.pairing_flags); 58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_state = new_state; 58065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_state == BTM_PAIR_STATE_IDLE) 58085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&btm_cb.pairing_tle); 58105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = 0; 58125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = 0; 58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the the lcb shows we are not bonding */ 58155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE); 58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 58185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_pending_reqs(); 58195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_clear_ssp(); 58205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN); 58225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 58245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If transitionng out of idle, mark the lcb as bonding */ 58265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_state == BTM_PAIR_STATE_IDLE) 58275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE); 58285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_tle.param = (TIMER_PARAM_TYPE)btm_sec_pairing_timeout; 58305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BTM_SEC_TIMEOUT_VALUE); 58325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_pair_state_descr 58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return state description for tracing 58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 58445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state) 58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 58475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 58485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_IDLE: return("IDLE"); 58505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_GET_REM_NAME: return("GET_REM_NAME"); 58515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_PIN_REQ: return("WAIT_PIN_REQ"); 58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_PIN: return("WAIT_LOCAL_PIN"); 58535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: return("WAIT_NUM_CONFIRM"); 58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_KEY_ENTRY: return("KEY_ENTRY"); 58555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: return("WAIT_LOCAL_OOB_RSP"); 58565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: return("WAIT_LOCAL_IOCAPS"); 58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_INCOMING_SSP: return("INCOMING_SSP"); 58585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: return("WAIT_AUTH_COMPLETE"); 58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_DISCONNECT: return("WAIT_DISCONNECT"); 58605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return("???"); 58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5864104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer sprintf(btm_cb.state_temp_buffer,"%hhu",state); 58655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_cb.state_temp_buffer); 58675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 58685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 58705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dev_rec_cback_event 58755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function calls the callback function with the given 58775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** result and clear the callback function. 58785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 58805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 588232429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport) 58835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback = p_dev_rec->p_callback; 588532429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbach tBT_TRANSPORT transport = is_le_transport ? BT_TRANSPORT_LE : BT_TRANSPORT_BR_EDR; 58865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_callback) 58885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 58905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, res); 58925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_pending_reqs(); 58955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_queue_mx_request 59005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return state description for tracing 59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, 59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 59075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_QUEUE_ENTRY *p_e; 59095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf (sizeof(tBTM_SEC_QUEUE_ENTRY)); 59115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_e) 59135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->psm = psm; 59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->is_orig = is_orig; 59165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_callback = p_callback; 59175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_ref_data = p_ref_data; 59185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_proto_id = mx_proto_id; 59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_chan_id = mx_chan_id; 59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN); 59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_queue_mx_request() PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u", 59245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, is_orig, mx_proto_id, mx_chan_id); 59255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&btm_cb.sec_pending_q, p_e); 59275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 59325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec) 59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK); 59375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK); 59385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN rv = FALSE; 59395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((major == BTM_COD_MAJOR_AUDIO) 59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) ) 59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_check_prefetch_pin: Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x", major, minor); 59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode_changed == FALSE) 59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = TRUE; 59485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 59495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 59505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 59515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 59525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 59555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 59575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we got a PIN, use that, else try to get one */ 59595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len) 59605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PINCodeReply (p_dev_rec->bd_addr, BTM_SUCCESS, btm_cb.pin_code_len, btm_cb.pin_code, p_dev_rec->trusted_mask); 59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pin was not supplied - pre-fetch pin code now */ 59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0)) 59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("btm_sec_check_prefetch_pin: PIN code callback called"); 59697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL) 59705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 59715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name); 59725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rv = TRUE; 59765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return rv; 59795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE) 59825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 59835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_clear_ble_keys 59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to clear out the BLE keys. 59875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically when devices are removed in BTM_SecDeleteDevice, 59885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or when a new BT Link key is generated. 59895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 59915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 59935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC *p_dev_rec) 59945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_clear_ble_keys: Clearing BLE Keys"); 59975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE) 59985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.key_type = 0; 59995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS)); 60005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 60015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_delete_dev_from_srv_chg_clt_list(p_dev_rec->bd_addr); 60025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 60035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 60065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_is_a_bonded_dev 60085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Is the specified device is a bonded device 60105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - dev is bonded 60125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 60145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda) 60155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 60165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); 60185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_bonded= FALSE; 60195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec && 60215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE) 60227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))|| 60237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 60247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))) 60255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_bonded = TRUE; 60275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_is_a_bonded_dev is_bonded=%d", is_bonded); 60295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(is_bonded); 60305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 60315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 60335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6034ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_is_le_capable_dev 6035ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6036ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Is the specified device is dual mode or LE only device 6037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6038ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE - dev is a dual mode 6039ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6040ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 6041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda) 6042ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 6043ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); 6044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN le_capable = FALSE; 6045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE) 6047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec && ((p_dev_rec->device_type == BT_DEVICE_TYPE_DUMO) || 6048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_dev_rec->device_type == BT_DEVICE_TYPE_BLE) ) ) 6049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 6050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta le_capable = TRUE; 6051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 6052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 6053ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return le_capable; 6054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 6055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 6057ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 60585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_bonded_dev 60595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Find a bonded device starting from the specified index 60615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - found a bonded device 60635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6065e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. ChenBOOLEAN btm_sec_find_bonded_dev (UINT8 start_idx, UINT8 *p_found_idx, tBTM_SEC_DEV_REC **p_rec) 60665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 60675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN found= FALSE; 60685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE) 60705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 60715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 60725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS) 60735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("LE bonded device not found"); 60755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return found; 60765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[start_idx]; 60795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = start_idx; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 60805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 60825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_found_idx = i; 6084e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. Chen *p_rec = p_dev_rec; 60855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 60865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_find_bonded_dev=%d", found); 60895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 60905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(found); 60915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 60925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 60935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6094