btm_sec.c revision 5fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cd
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
2544802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#define LOG_TAG "bt_btm_sec"
2644802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati
27899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#include <stdarg.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
2930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
30d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "device/include/controller.h"
31d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/log.h"
32d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/time.h"
33d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
3549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "bt_utils.h"
3649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_int.h"
3749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btu.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h"
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE && BT_TRACE_VERBOSE == FALSE)
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* needed for sprintf() */
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "gatt_int.h"
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#define BTM_SEC_MAX_COLLISION_DELAY     (5000)
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue;
5378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr);
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
586975b4d711142b885af479721cada448952c6b41Andre Eisenbach/********************************************************************************
596975b4d711142b885af479721cada448952c6b41Andre Eisenbach**              L O C A L    F U N C T I O N     P R O T O T Y P E S            *
606975b4d711142b885af479721cada448952c6b41Andre Eisenbach*********************************************************************************/
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm);
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur);
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id,
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_chan_id);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec);
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec);
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec);
7178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void     btm_sec_collision_timeout(void *data);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_restore_mode(void);
7378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void     btm_sec_pairing_timeout(void *data);
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec);
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char     *btm_pair_state_descr (tBTM_PAIRING_STATE state);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_check_pending_reqs(void);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 mx_proto_id, UINT32 mx_chan_id,
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tBTM_SEC_CALLBACK *p_callback, void *p_ref_data);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_bond_cancel_complete (void);
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec);
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8    btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec);
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN         btm_sec_are_all_trusted(UINT32 p_mask[]);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle);
937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8           btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec);
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state);
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT32 mx_chan_id);
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec);
1017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec);
1027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec);
1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec);
104899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0 (UINT16 psm);
105899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16  btm_sec_set_serv_level4_flags (UINT16 cur_security, BOOLEAN is_originator);
1067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request  (BD_ADDR bd_addr, tBT_TRANSPORT transport,
108f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data,
109f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                         tBTM_BLE_SEC_ACT sec_act);
110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable);
112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec);
114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec);
1157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE - authenticated link key is possible */
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] =
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*   OUT,    IO,     IN,     NONE */
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* OUT  */ {FALSE,  FALSE,  TRUE,   FALSE},
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IO   */ {FALSE,  TRUE,   TRUE,   FALSE},
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IN   */ {TRUE,   TRUE,   TRUE,   FALSE},
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* NONE */ {FALSE,  FALSE,  FALSE,  FALSE}
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_OUT      0   DisplayOnly */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_IO       1   DisplayYesNo */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_IN       2   KeyboardOnly */
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_NONE     3   NoInputNoOutput */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_authenticated
1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is authenticated
1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec)
1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)
1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_encrypted
1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is encrypted
1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec)
1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_authorized
1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is authorized
1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec)
1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
186818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Function         btm_dev_16_digit_authenticated
187818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
188818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Description      check device is authenticated by using 16 digit pin or MITM
189818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
190818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Returns          BOOLEAN TRUE or FALSE
191818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
192818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde*******************************************************************************/
193818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bondestatic BOOLEAN btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC *p_dev_rec)
194818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde{
195818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    // BTM_SEC_16_DIGIT_PIN_AUTHED is set if MITM or 16 digit pin is used
196818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
197818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    {
198818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        return(TRUE);
199818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
200818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    return(FALSE);
201818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde}
202818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
203818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde/*******************************************************************************
204818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_serv_trusted
2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check service is trusted
2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec)
2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id))
2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
2207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
2227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecRegister
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Application manager calls this function to register for
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  security services.  There can be one and only one application
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  saving link keys.  BTM allows only first registration.
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
232f8027005333c88a2f097cfd70d15c3d54c7764aeChris MantonBOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      temp_value = {0};
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
238f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s application registered", __func__);
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
241db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_INFO(LOG_TAG, "%s p_cb_info->p_le_callback == 0x%p", __func__, p_cb_info->p_le_callback);
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb_info->p_le_callback)
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
244f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#if SMP_INCLUDED == TRUE
245f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__);
246f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      SMP_Register(btm_proc_smp_cback);
247f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#endif
248f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      /* if no IR is loaded, need to regenerate all the keys */
249f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0)
250f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      {
251f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton        btm_ble_reset_id();
252f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      }
253f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    }
254f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    else
255f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    {
256db554581079863974af8e1289646f5deea6fc044Marie Janssen      LOG_WARN(LOG_TAG, "%s p_cb_info->p_le_callback == NULL", __func__);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.api = *p_cb_info;
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
262db554581079863974af8e1289646f5deea6fc044Marie Janssen     LOG_INFO(LOG_TAG, "%s btm_cb.api.p_le_callback = 0x%p ", __func__, btm_cb.api.p_le_callback);
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
264f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s application registered", __func__);
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
270877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function         BTM_SecRegisterLinkKeyNotificationCallback
271877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
272877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description      Application manager calls this function to register for
273877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**                  link key notification.  When there is nobody registered
274877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**                  we should avoid changing link key
275877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
276877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns          TRUE if registered OK, else FALSE
277877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
278877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/
279877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback)
280877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{
281877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji    btm_cb.api.p_link_key_callback = p_callback;
282877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji    return TRUE;
283877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
284877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
285877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
286877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecAddRmtNameNotifyCallback
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can register to be notified when name of the
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote device is resolved.
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == NULL)
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = p_callback;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecDeleteRmtNameNotifyCallback
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can deregister notification when a new Link Key
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is generated per connection.
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if OK, else FALSE
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == p_callback)
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = NULL;
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
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_SetPinType
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set PIN type 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_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len)
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pin_type, (char *) pin_code, pin_code_len);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If device is not up security mode will be set as a part of startup */
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.cfg.pin_type != pin_type)
40230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson         && controller_get_interface()->get_is_ready() )
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (pin_type);
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_type     = pin_type;
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_code_len = pin_code_len;
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len);
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPairableMode
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Enable or disable pairing
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       allow_pairing - (TRUE or FALSE) whether or not the device
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      allows pairing.
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connect_only_paired - (TRUE or FALSE) whether or not to
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      only allow paired devices to connect.
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired)
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPairableMode()  allow_pairing: %u   connect_only_paired: %u", allow_pairing, connect_only_paired);
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_disabled    = !allow_pairing;
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.connect_only_paired = connect_only_paired;
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_SetSecureConnectionsOnly
437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      Enable or disable default treatment for Mode 4 Level 0 services
439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameter        secure_connections_only_mode - (TRUE or FALSE) whether or not the device
441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  TRUE means that the device should treat Mode 4 Level 0 services as
442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  services of other levels. (Secure_connections_only_mode)
443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  FALSE means that the device should provide default treatment for
444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  Mode 4 Level 0 services.
445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode)
450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: Mode : %u", __FUNCTION__,
452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                   secure_connections_only_mode);
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    btm_cb.devcb.secure_connections_only = secure_connections_only_mode;
455c5c741075fbc36e373f0bec4c3520188d2ba9a38Srinu Jella    btm_cb.security_mode = BTM_SEC_MODE_SC;
456899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES   ((UINT16) 0xffff)
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetSecurityLevel
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      is_originator - TRUE if originating the connection, FALSE if not
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id,
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT32 mx_chan_id)
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    CONNECTION_TYPE conn_type;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_ORIG;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_TERM;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (conn_type, p_name, service_id,
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (is_originator, p_name, service_id,
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_set_security_level
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      conn_type   - TRUE if originating the connection, FALSE if not
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT32 mx_chan_id)
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               index;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               first_unused_record = BTM_NO_AVAIL_SEC_SERVICES;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              record_allocated = FALSE;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_originator;
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_ucd;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_CONNLESS_MASK )
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = TRUE;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = FALSE;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
546818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    BTM_TRACE_API("%s : sec: 0x%x", __func__, sec_level);
547818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if the record can be reused (same service name, psm, mx_proto_id,
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       service_id, and mx_chan_id), or obtain the next unused record */
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec = &btm_cb.sec_serv_rec[0];
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++)
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if there is already a record for this service */
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_srec->security_flags & BTM_SEC_IN_USE)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id    &&
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (!strncmp (p_name, (char *) p_srec->orig_service_name,
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN) ||
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 !strncmp (p_name, (char *) p_srec->term_service_name,
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN)))
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id)
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                record_allocated = TRUE;
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark the first available service record */
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (!record_allocated)
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC));
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            record_allocated = TRUE;
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            first_unused_record = index;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!record_allocated)
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)",  BTM_SEC_MAX_SERVICE_RECORDS);
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(record_allocated);
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Process the request if service record is valid */
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If a duplicate service wasn't found, use the first available */
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (index >= BTM_SEC_MAX_SERVICE_RECORDS)
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        index = first_unused_record;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec = &btm_cb.sec_serv_rec[index];
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->psm         = psm;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->service_id  = service_id;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->mx_proto_id = mx_proto_id;
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->orig_mx_chan_id = mx_chan_id;
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
60766209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy ((char *)p_srec->orig_service_name, p_name, BTM_SEC_SERVICE_NAME_LEN);
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Originator should not set requirements for incoming connections */
626818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE
627818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                | BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN );
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_OUT_AUTHENTICATE)
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_OUT_MITM;
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_OUT_ENCRYPT)
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_OUT_AUTHENTICATE;
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* outgoing connections usually set the security level right before
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * the connection is initiated.
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * set it to be the outgoing service */
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd == FALSE )
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_srec;
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->term_mx_chan_id = mx_chan_id;
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
65566209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy ((char *)p_srec->term_service_name, p_name, BTM_SEC_SERVICE_NAME_LEN);
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
663818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE
664818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              | BTM_SEC_IN_MIN_16_DIGIT_PIN);
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
671818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE
672818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              | BTM_SEC_IN_MIN_16_DIGIT_PIN);
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Acceptor should not set requirements for outgoing connections */
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM);
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
678899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
679899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
680899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_IN_AUTHENTICATE)
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_IN_MITM;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_IN_ENCRYPT)
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_IN_AUTHENTICATE;
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_ucd )
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags     |= (UINT16)(BTM_SEC_IN_USE);
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, conn_type, psm, mx_proto_id, mx_chan_id);
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_srec->ucd_security_flags);
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
7095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : service name [%s] (up to %d chars saved)",
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_name, BTM_SEC_SERVICE_NAME_LEN);
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, is_originator, psm, mx_proto_id, mx_chan_id);
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
7195344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : sec: 0x%x, service name [%s] (up to %d chars saved)",
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN);
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(record_allocated);
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecClrService
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record(s) from the security database.
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified name are removed.
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used only by devices with limited RAM so that it can
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  reuse an old security service record.
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Note: Unpredictable results may occur if a service is cleared
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      that is still in use by an application/profile.
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id)
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) &&
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (!service_id || (service_id == p_srec->service_id)))
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id);
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags = 0;
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clr_service_by_psm
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record from the security database.
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified psm are removed.
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used by L2CAP to free up the service record used
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by dynamic PSM clients when the channel is closed.
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The given psm must be a virtual psm.
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm)
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) )
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_clr_temp_auth_service
809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Removes specified device record's temporary authorization
811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  flag from the security database.
812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters       Device address to be cleared
814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void.
816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda)
819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC   *p_dev_rec;
821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bda)) == NULL)
823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
8245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB");
825ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */
829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service)
830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
8315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
832ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
834ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID;
835ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
836ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PINCodeReply
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after Security Manager submitted
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PIN code request to the UI.
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device for which PIN was requested
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res          - result of the operation BTM_SUCCESS if success
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s   PairFlags: 0x%02x  PinLen:%d  Result:%d",
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res);
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr");
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB");
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) )
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) ||
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) )
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (bd_addr);
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags   |= BTM_SEC_LINK_KEY_AUTHED;
904818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (pin_len >= 16) {
905818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
906818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.security_mode_changed == FALSE) )
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is start of the dedicated bonding if local device is 2.0 */
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
914818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->pin_code_length = pin_len;
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = TRUE;
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable (TRUE);
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = 0xff ;
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*  before originating  */
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we change state little bit early so btm_sec_connected() will originate connection */
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*   when existing ACL link is down completely */
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we already accepted incoming connection from pairing device */
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.api.p_auth_complete_callback)
9467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE);
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_SUCCESS;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
9565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len);
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if this was not pre-fetched, save the PIN */
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len == 0)
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pin_code_len_saved = pin_len;
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin);
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_sec_bond_by_transport
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      this is the bond function that will start either SSP or SMP.
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device to bond
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Note: After 2.1 parameters are not used and preserved here not to change API
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
9797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                       UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS      status;
9833aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            *p_features;
9843aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            ii;
9857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN        *p= btm_bda_to_acl(bd_addr, transport);
9865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x",
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport);
9907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Other security process is in progress */
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9986975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL)
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10006975b4d711142b885af479721cada448952c6b41Andre Eisenbach        return(BTM_NO_RESOURCES);
10017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Finished if connection is active and already paired */
10067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR
10077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
10087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
10097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE
10107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))
10117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
10127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         )
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SecBond -> Already Paired");
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell controller to get rid of the link key if it has one stored */
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS)
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the PIN code if we got a valid one */
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0))
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
1027818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->pin_code_length = pin_len;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN);
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN);
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD;
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE;
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = TRUE;
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10406975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
10417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1043e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        btm_ble_init_pseudo_addr (p_dev_rec, bd_addr);
10447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK;
10457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (SMP_Pair(bd_addr) == SMP_STARTED)
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
10507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_CMD_STARTED;
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.pairing_flags = 0;
10557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(BTM_NO_RESOURCES);
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
10607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  | BTM_SEC_ROLE_SWITCHED  | BTM_SEC_LINK_KEY_AUTHED);
10617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
106330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing())
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* The special case when we authenticate keyboard.  Set pin type to fixed */
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* It would be probably better to do it from the application, but it is */
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* complicated */
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED))
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pin_type_changed = TRUE;
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED);
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10773aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++)
10783aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    {
10793aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        p_features = p_dev_rec->features[ii];
10805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("  remote_features page[%1d] = %02x-%02x-%02x-%02x",
10813aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                         ii, p_features[0], p_features[1], p_features[2], p_features[3]);
10825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("                              %02x-%02x-%02x-%02x",
10833aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                             p_features[4], p_features[5], p_features[6], p_features[7]);
10843aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    }
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x  HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN;
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection already exists... */
10937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE)
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark lcb as bonding */
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (bd_addr, TRUE);
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
110630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing()
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->sm4 == BTM_SM4_KNOWN))
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( btm_sec_check_prefetch_pin (p_dev_rec) )
1110899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1112899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
1113899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
1114899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
1115899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local is 2.1 and peer is unknown */
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0)
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we are not accepting connection request from peer
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * -> RNR (to learn if peer is 2.1)
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
11247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We are accepting connection request from peer */
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d",
11327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_CMD_STARTED;
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* both local and peer are 2.1  */
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_dd_create_conn(p_dev_rec);
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
11487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBondByTransport
11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  transport    - doing SSP over BR/EDR or SMP over LE
11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
11647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                    UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE
11677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_DEVICE_TYPE     dev_type;
11687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBLE_ADDR_TYPE      addr_type;
11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
11707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* LE device, do SMP pairing */
11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) ||
11737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0))
11747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
11757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_ILLEGAL_ACTION;
11767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
11777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
11787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
11797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBond
11847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
11997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
12007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (BTM_UseLeLink(bd_addr))
12017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        transport = BT_TRANSPORT_LE;
12027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
12037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
12047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
12057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
12067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecBondCancel
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to cancel ongoing bonding process
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with peer device.
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the peer device
12137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                         transport    - FALSE for BR/EDR link; TRUE for LE link
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr)
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SecBondCancel()  State: %s flags:0x%x",
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags);
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_UNKNOWN_ADDR;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
12287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE)
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING)
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("Cancel LE pairing");
12337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (SMP_PairCancel(bd_addr))
12347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
12357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return BTM_CMD_STARTED;
12367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_WRONG_MODE;
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags)
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* pre-fetching pin for dedicated bonding */
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_bond_cancel_complete();
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_SUCCESS;
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this BDA is in a bonding procedure */
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the HCI link is up */
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If some other thread disconnecting, we do not send second command */
1259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) ||
1260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH))
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_CMD_STARTED);
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link was set up by Bonding process */
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_update_lcb_4_bonding(bd_addr, FALSE);
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /*HCI link is not up */
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link creation was started by Bonding process */
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btsnd_hcic_create_conn_cancel(bd_addr))
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return BTM_CMD_STARTED;
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_NO_RESOURCES;
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
1282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
1283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                BTM_CancelRemoteDeviceName();
1284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD;
1285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return BTM_CMD_STARTED;
1286ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_WRONG_MODE;
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecGetDeviceLinkKey
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to obtain link key for the device
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  it returns BTM_SUCCESS if link key is available, or
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the device or device record does not contain link key info
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  link_key     - Link Key is copied into this array
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key)
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN);
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_UNKNOWN_ADDR);
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         BTM_SecGetDeviceLinkKeyType
1323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to obtain link key type for the
1325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  device.
1326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  it returns BTM_SUCCESS if link key is available, or
1327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the device or device record does not contain link key info
1329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          BTM_LKEY_TYPE_IGNORE if link key is unknown, link type
1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  otherwise.
1332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1334444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr)
1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
1339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return p_dev_rec->link_key_type;
1341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return BTM_LKEY_TYPE_IGNORE;
1343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetEncryption
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to ensure that connection is
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  encrypted.  Should be called only on an open connection.
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically only needed for connections that first want to
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bring up unencrypted links, then later encrypt them.
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
1355f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach**                  transport     - Link transport
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed.  Can be set to NULL
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  if status is not desired.
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - pointer to any data the caller wishes to receive
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  in the callback function upon completion.
1362f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach**                                  can be set to NULL if not used.
1363f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach**                  sec_act       - LE security action, unused for BR/EDR
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS   - already encrypted
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_PENDING   - command will be returned in the callback
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE- connection not up.
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY      - security procedures are currently active
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MODE_UNSUPPORTED - if security manager not linked in.
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback,
1373f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                               void *p_ref_data, tBTM_BLE_SEC_ACT sec_act)
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1375444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS rc = 0;
13767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
13787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!p_dev_rec ||
13797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
13807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
13817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)
13827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
13837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        )
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Connection should be up and runnning */
13865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected");
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
13897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE);
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_BR_EDR &&
13957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags &  BTM_SEC_ENCRYPTED))
13967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
13977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         || (transport == BT_TRANSPORT_LE &&
13987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta           (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED))
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta          )
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted");
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
14057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* enqueue security request if security is active */
1411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE))
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request");
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach        if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data, sec_act))
1416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_CMD_STARTED;
1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (p_callback)
1422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES);
1423444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_NO_RESOURCES;
1424444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = FALSE;
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->security_required);
14357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
14377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1439444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tACL_CONN *p = btm_bda_to_acl(bd_addr, transport);
1440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p)
1441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1442f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach           rc = btm_ble_set_encryption(bd_addr, sec_act, p->link_role);
1443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1444444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            rc = BTM_WRONG_MODE;
1447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", __FUNCTION__);
1448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = btm_sec_execute_procedure (p_dev_rec);
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (rc != BTM_CMD_STARTED && rc != BTM_BUSY)
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
14597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc);
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet.
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle)
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1471ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8       old_state = p_dev_rec->sec_state;
1472ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS status = BTM_CMD_STARTED;
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect:  handle:0x%x, reason=0x%x",
14757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                      conn_handle, reason);
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* send HCI_Disconnect on a transport only once */
1478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    switch (old_state)
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING:
1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->hci_handle)
1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
14867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
1488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BLE:
1489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->ble_hci_handle)
1490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
1491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
1494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BOTH:
1496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return status;
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1498444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1499444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        default:
1500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ?
1501444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
1502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1503444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1506444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */
1507444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle)
1508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
1510444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji              p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
1511444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        status = BTM_SUCCESS;
1512444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1513444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Tear down the HCI link */
1514444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else if (!btsnd_hcic_disconnect (conn_handle, reason))
1515444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1516444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         /* could not send disconnect. restore old state */
1517444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         p_dev_rec->sec_state = old_state;
1518444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         status = BTM_NO_RESOURCES;
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1520444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1521444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return status;
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ConfirmReqReply
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to confirm the numeric value for
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_CFM_REQ_EVT
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res           - result of the operation BTM_SUCCESS if success
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr       - Address of the peer device
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr)
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s  Res: %u",
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM)
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) )
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (res == BTM_SUCCESS)
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
1557818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, TRUE);
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, FALSE);
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PasskeyReqReply
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the passkey for
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_KEY_REQ_EVT
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res     - result of the operation BTM_SUCCESS if success
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr - Address of the peer device
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey - numeric value in the range of
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey)
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s  res:%d",
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), res);
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) )
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1598444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1599444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec != NULL)
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
16047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_SecBondCancel(bd_addr);
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN);
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY)
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (passkey > BTM_MAX_PASSKEY_VAL)
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply (bd_addr);
1627444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_reply (bd_addr, passkey);
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SendKeypressNotif
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is used during the passkey entry model
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by a device with KeyboardOnly IO capabilities
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (very likely to be a HID Device).
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is called by a HID Device to inform the remote device when
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a key has been entered or erased.
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type - notification type
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type)
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This API only make sense between PASSKEY_REQ and SP complete */
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY)
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_send_keypress_notif (bd_addr, type);
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_IoCapRsp
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called in response to BTM_SP_IO_REQ_EVT
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by the tBTM_SP_CALLBACK implementation, this function is
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  called to provide the actual response
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  io_cap  - The IO capability of local device.
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  oob     - BTM_OOB_NONE or BTM_OOB_PRESENT.
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  auth_req- MITM protection required or not.
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req)
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s  oob: %d io_cap: %d",
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap);
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS)
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX)
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = auth_req;
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = io_cap;
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT));
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req);
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadLocalOobData
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local OOB data from
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  LM
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void)
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_SUCCESS;
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_read_local_oob_data() == FALSE)
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_NO_RESOURCES;
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_RemoteOobDataReply
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the remote OOB data for
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_RMT_OOB_EVT
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr     - Address of the peer device
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c           - simple pairing Hash C.
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r           - simple pairing Randomizer  C.
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r)
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1725444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() - State: %s res: %d", __func__,
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP)
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_neg_reply (bd_addr);
1739444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_reply (bd_addr, c, r);
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BuildOobData
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to build the OOB data payload to
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  be sent over OOB (non-Bluetooth) link
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_len - p_data size.
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c       - simple pairing Hash C.
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r       - simple pairing Randomizer  C.
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  name_len- 0, local device name would not be included.
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            otherwise, the local device name is included for
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            up to this specified length
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of bytes in p_data.
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c,
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BT_OCTET16 r, UINT8 name_len)
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len = 0;
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  name_size;
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE)
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mandatory part */
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
177730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson        BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address);
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = BTM_OOB_MANDATORY_SIZE;
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_len -= len;
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* now optional part */
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Hash C */
1785444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        UINT16 delta = BTM_OOB_HASH_C_SIZE + 2;
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_HASH_C_SIZE + 1;
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE;
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE);
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Rand R */
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_RAND_R_SIZE + 2;
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_RAND_R_SIZE + 1;
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE;
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE);
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add class of device */
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_COD_SIZE + 2;
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_COD_SIZE + 1;
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_COD_TYPE;
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class);
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        name_size = name_len;
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (name_size > strlen(btm_cb.cfg.bd_name))
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_size = (UINT16)strlen(btm_cb.cfg.bd_name);
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = name_size + 2;
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_size + 1;
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_type;
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size);
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update len */
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p_data;
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1842899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_BothEndsSupportSecureConnections
1843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1844899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if both the local device and the peer device
1845899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  specified by bd_addr support BR/EDR Secure Connections.
1846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1847899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1848899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1849899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by both local
1850899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  and the remote device.
1851899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1852444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1854899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr)
1855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1856899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return ((controller_get_interface()->supports_secure_connections()) &&
1857899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_PeerSupportsSecureConnections(bd_addr)));
1858899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
1859899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1860899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
1861899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1862899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_PeerSupportsSecureConnections
1863899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1864899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the peer supports
1865899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  BR/EDR Secure Connections.
1866899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1867899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1868899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1869899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by the peer,
1870899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1871899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1872899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
1873899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr)
1874899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
1875899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    tBTM_SEC_DEV_REC    *p_dev_rec;
1876899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1877899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL)
1878899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
1879899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x", __FUNCTION__,
1880899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3],
1881899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[4]<< 8) + bd_addr[5]);
1882899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return FALSE;
1883899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
1884899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1885899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return (p_dev_rec->remote_supports_secure_connections);
1886444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1887444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1888444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadOobData
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to parse the OOB data payload
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received over OOB (non-Bluetooth) link
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  eir_tag - The associated EIR tag to read the data.
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  *p_len(output) - the length of the data with the given tag.
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the beginning of the data with the given tag.
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  NULL, if the tag is not found.
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len)
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  max_len;
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   len, type;
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_ret = NULL;
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   ret_len = 0;
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data)
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(max_len, p);
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= BTM_OOB_MANDATORY_SIZE)
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag)
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ret = p; /* the location for bd_addr */
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ret_len = BTM_OOB_BD_ADDR_SIZE;
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += BD_ADDR_LEN;
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                max_len -= BTM_OOB_MANDATORY_SIZE;
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* now the optional data in EIR format */
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                while (max_len > 0)
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len     = *p++; /* tag data len + 1 */
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    type    = *p++;
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (eir_tag == type)
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_ret = p;
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        ret_len = len - 1;
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* the data size of this tag is len + 1 (tag data len + 2) */
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (max_len > len)
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len -= len;
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len--;
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        len--;
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p += len;
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len = 0;
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_len)
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = ret_len;
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ret;
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetOutService
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the service for
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  outgoing connections.
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the profile/application calls BTM_SetSecurityLevel
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  before initiating a connection, this function does not
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  need to be called.
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id)
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_out_serv = p_serv_rec;
19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (bd_addr);
19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->service_id == service_id)
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->orig_mx_chan_id == mx_chan_id))
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
19865738f83aeb59361a0a2eda2460113f6dc919427The 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);
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_serv_rec;
19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec)
19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->p_cur_service = p_serv_rec;
19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************
19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**              I N T E R N A L     F U N C T I O N S
19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2000ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_upgrade_possible
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2002ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function returns TRUE if the existing link key
2003ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  can be upgraded or if the link key does not exist.
20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2005ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          BOOLEAN
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2008ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM;
2011ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN             is_possible = TRUE;
20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2015ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        is_possible = FALSE;
20167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if(p_dev_rec->p_cur_service)
20177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
2018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x",
2019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type,
2020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags);
20217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
20227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
20237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
2024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x",
2025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check);
20267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Already have a link key to the connected peer. Is the link key secure enough?
20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** Is a link key upgrade even possible?
20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
2030899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & mtm_check)    /* needs MITM */
2031899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) ||
2032899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256))
2033899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* has unauthenticated
2034899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key */
2035899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX)  /* a valid peer IO cap */
2036899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps]))
2037899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* authenticated
2038899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key is possible */
20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* upgrade is possible: check if the application wants the upgrade.
20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * If the application is configured to use a global MITM flag,
20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * it probably would not want to upgrade the link key based on the security level database */
2043ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            is_possible = TRUE;
2044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2046444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, p_dev_rec->sec_flags);
2047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return is_possible;
2048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
2051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_check_upgrade
2053ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function is called to check if the existing link key
2055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  needs to be upgraded.
2056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2057ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
2058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
2060ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
2061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2063444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
2064ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2065ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Only check if link key already exists */
2066ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
2067ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
2068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2069ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE)
2070ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
20715344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
2072ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* upgrade is possible: check if the application wants the upgrade.
2073ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * If the application is configured to use a global MITM flag,
2074ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * it probably would not want to upgrade the link key based on the security level database */
2075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SP_UPGRADE evt_data;
2076ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
2077ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_data.upgrade = TRUE;
2078ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btm_cb.api.p_sp_callback)
2079ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
2080ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade);
2082ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (evt_data.upgrade)
2083ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2084ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* if the application confirms the upgrade, set the upgrade bit */
2085ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2086ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2087ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Clear the link key known to go through authentication/pairing again */
2088ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
2089ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED;
20905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags);
20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_l2cap_access_req
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP to grant permission to
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establish L2CAP connection to or from the peer device.
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are complete. MUST NOT BE NULL.
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tBTM_STATUS
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_OUT_FLAGS   (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHORIZE)
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_IN_FLAGS    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2116899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_OUT_LEVEL4_FLAGS   (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | \
2117899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                    BTM_SEC_OUT_MITM | BTM_SEC_MODE4_LEVEL4)
2118899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2119899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_IN_LEVEL4_FLAGS    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | \
2120899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                    BTM_SEC_IN_MITM | BTM_SEC_MODE4_LEVEL4)
2121899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle,
21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      CONNECTION_TYPE conn_type,
21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      tBTM_SEC_CALLBACK *p_callback,
21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      void *p_ref_data)
21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         security_required;
21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         old_security_required;
21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       old_is_originator;
21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS   rc = BTM_SUCCESS;
21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       chk_acp_auth_done = FALSE;
21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
21357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN     transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */
21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, p_ref_data);
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator:%d, 0x%x", __func__, is_originator, p_ref_data);
21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_first_serv (conn_type, psm);
21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("%s() PSM: %d no application registerd", __func__, psm);
21627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_MODE_UNSUPPORTED);
21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2166899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Services level0 by default have no security */
2167899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only))
21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY);
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2175899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2176899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2177899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags,
2178899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                               is_originator);
2179899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2180899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->ucd_security_flags;
2183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_originator)
21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
21905738f83aeb59361a0a2eda2460113f6dc919427The 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))) ||
21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rc = BTM_SUCCESS;
21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
22005738f83aeb59361a0a2eda2460113f6dc919427The 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))) ||
22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2203818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                // Check for 16 digits (or MITM)
2204818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2205818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) &&
2206818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                     btm_dev_16_digit_authenticated(p_dev_rec))) {
2207818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    rc = BTM_SUCCESS;
2208818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                }
22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2212899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2213899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2215899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (rc == BTM_SUCCESS)
22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_callback)
22217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2229899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2230899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2231899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2232899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                                is_originator);
2233899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2234899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2235899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2236899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->security_flags;
2237899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2238899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2239899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2240899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm  0x%04x",
2241899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    __FUNCTION__, security_required, is_originator, psm);
2242899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2243899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4))
2244899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2245899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2246899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */
2247899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2248899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2249899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d",
2250899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "rmt_support_for_sc : %d -> fail pairing", __FUNCTION__,
2251899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc,
2252899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            p_dev_rec->remote_supports_secure_connections);
2253899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2254899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2255899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                    BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2256899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2257899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2258899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto KRZR) which connects to several services at the same time */
22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed  state: %s mode:%d, sm4:0x%x", __func__,
2266ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                          psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4);
22675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
2269899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2270899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2271899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2272899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2273899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2274899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (is_originator)
22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
22817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
22827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) ||
22837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec)  && btm_dev_encrypted(p_dev_rec))) )
22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rc = BTM_SUCCESS;
22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
22917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) ||
22927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) ||
22937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))))
22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2298818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    // Check for 16 digits (or MITM)
2299818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2300818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                       (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) {
2301818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        rc = BTM_SUCCESS;
2302818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    }
23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2306899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2307899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2308899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2309899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2310899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2311899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (rc == BTM_SUCCESS)
23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_callback)
23157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_SUCCESS);
23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.sec_req_pending = TRUE;
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save pointer to service record */
23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service = p_serv_rec;
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2327899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */
2328899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2329899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2330899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2332899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2334899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (is_originator)
23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT);
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2339899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else /* acceptor */
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                chk_acp_auth_done = TRUE;
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
2345899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth           }
2346899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2347899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4))
2348899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2349899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the remote features are not known yet */
2350899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", __FUNCTION__,
2351899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags);
23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2353899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sm4 |= BTM_SM4_REQ_PEND;
2354899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2358444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()  sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__,
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done);
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_security_required        = p_dev_rec->security_required;
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_is_originator            = p_dev_rec->is_originator;
23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = security_required;
23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = TRUE;
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = FALSE;
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are multiple service records used through the same PSM */
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* leave security decision for the multiplexor on the top */
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */
23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!BTM_SEC_IS_SM4(p_dev_rec->sm4))
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pre-Lisbon: restore the old settings */
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = old_security_required;
23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->is_originator     = old_is_originator;
23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* if the originator is using dynamic PSM in legacy mode, do not start any security process now
2398899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * The layer above L2CAP needs to carry out the security requirement after L2CAP connect
2399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * response is received */
2400899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (is_originator &&
2401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001))
24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* restore the old settings */
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required = old_security_required;
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_originator     = old_is_originator;
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (chk_acp_auth_done)
24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24195344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED));
24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SM4, but we do not know for sure which level of security we need.
24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * as long as we have a link key, it's OK */
24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rc = BTM_DELAY_CHECK;
24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*
24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence
24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            because of data path issues. Delay this disconnect a little bit
24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
2431db554581079863974af8e1289646f5deea6fc044Marie Janssen            LOG_INFO(LOG_TAG, "%s peer should have initiated security process by now (SM4 to SM4)", __func__);
24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback        = p_callback;
24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state         = BTM_SEC_STATE_DELAY_FOR_ENC;
24347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, rc);
24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_SUCCESS;
24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2442ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
2443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id)
2444ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Although authentication and encryption are per connection
2446ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** authorization is per access request.  For example when serial connection
2447ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** is up and authorized and client requests to read file (access to other
2448ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** scn), we need to request user's permission again.
2449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        */
2450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED;
2451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2455899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2456899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2457899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2458899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2459899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2460899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2461899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2462899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2463899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2464899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      BTM_SEC_AUTHENTICATED);
2465899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2466899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2467899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2468899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2469899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* If we already have a link key to the connected peer, is it secure enough? */
2470899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_check_upgrade(p_dev_rec, is_originator);
2471899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d",
2475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
24817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc);
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_mx_access_request
24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by all Multiplexing Protocols during
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establishing connection to or from peer device to grant
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  permission to establish application connection.
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id   - protocol ID of the multiplexer
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id    - multiplexer channel to reach application
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed
25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - Pointer to any reference data needed by the
25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  the callback function.
25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED
25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator,
25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       UINT32 mx_proto_id, UINT32 mx_chan_id,
25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS        rc;
2517ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16             security_required;
25187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN transport   = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2520444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator: %d", __func__, is_originator);
25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id);
25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
25317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id);
25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NO_RESOURCES;
25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2538899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm)))
2539899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2540899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2541899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                           is_originator);
2542899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2543899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
2544899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2545899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = p_serv_rec->security_flags;
2546899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2547899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto phone) which connects to several services at the same time */
25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
25515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2552444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed  state: %s", __func__,
25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state));
25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rc = BTM_CMD_STARTED;
2556899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2557899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2558899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2559899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2560899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
2563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
2566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (is_originator)
2567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
25697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    rc = BTM_SUCCESS;
2574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
2577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
25797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2585ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2586818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    // Check for 16 digits (or MITM)
2587818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2588818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                       (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) {
2589818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        rc = BTM_SUCCESS;
2590818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    }
2591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2593899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2594899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2595899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2596899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2597899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2598899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2599899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2600899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (rc == BTM_SUCCESS)
2601899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2602899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __FUNCTION__);
2603899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */
2604899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* btm_sec_execute_procedure */
2605899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) ||
2606899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE)))
2607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_EVENT("%s: still need authorization", __FUNCTION__);
2609899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2610899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2611899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2612899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2613899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Check whether there is a pending security procedure, if so we should always queue */
2614899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* the new security request */
2615899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)
2616899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2617899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: There is a pending security procedure", __FUNCTION__);
2618899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (rc == BTM_CMD_STARTED)
2621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2622899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __FUNCTION__);
2623899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_queue_mx_request (bd_addr, psm,  is_originator, mx_proto_id,
2624899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      mx_chan_id, p_callback, p_ref_data);
2625899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2626899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else /* rc == BTM_SUCCESS */
2627899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2628899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* access granted */
2629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             if (p_callback)
2630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc);
2632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2633899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2634899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2635899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __FUNCTION__, rc,
2636899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                          btm_pair_state_descr(btm_cb.pairing_state));
2637899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return rc;
2638899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2639899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2640899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) ||
2641899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (btm_cb.security_mode == BTM_SEC_MODE_SC)))
2642899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2643899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2644899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives service connection establishment Request for */
2645899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Secure Connections Only service */
2646899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2647899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2648899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,",
2649899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "remote_support_for_sc %d: fail pairing",__FUNCTION__,
2650899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
2651899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2652899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2653899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2654899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                               BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2655899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2656899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2657ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service     = p_serv_rec;
2661899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    p_dev_rec->security_required = security_required;
26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2663899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2664899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2665899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2669899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2670899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2671899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2672899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2673899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2674899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                {
2675899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2676899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                }
2677899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2678899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2679899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                          BTM_SEC_AUTHENTICATED);
2680899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2681899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2682899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
2683899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2684899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* If we already have a link key, check if that link key is good enough */
2685899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                btm_sec_check_upgrade(p_dev_rec, is_originator);
2686899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Although authentication and encryption are per connection */
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization is per access request.  For example when serial connection */
26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* is up and authorized and client requests to read file (access to other */
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* scn, we need to request user's permission again. */
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED);
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2700444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
2701444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2702444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
27097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc);
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rc;
27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_conn_req
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when the peer device is requesting
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc)
27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bda);
27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some device may request a connection before we are done with the HCI_Reset sequence */
273130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->get_is_ready())
27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: connect request when device not ready");
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    /* Security guys wants us not to allow connection from not paired devices */
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection is allowed for only paired devices */
27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.connect_only_paired)
27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))
27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device");
27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE
27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If non-discoverable, only allow known devices to connect */
27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE)
27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from not paired device");
27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN)))
27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device");
27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* incoming connection from bonding device is rejected */
27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT;
27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Host is not interested or approved connection.  Save BDA and DC and */
27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* pass request to L2CAP */
27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN);
27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_dc,  dc,  DEV_CLASS_LEN);
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2c_link_hci_conn_req (bda))
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* accept the connection -> allocate a device record */
27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec)
27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 |= BTM_SM4_CONN_PEND;
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/*******************************************************************************
27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_bond_cancel_complete
27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to report bond cancel complete
28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void)
28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) ||
28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
2811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) ||
2812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME &&
2813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta          BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags))
28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* for dedicated bonding in legacy mode, authentication happens at "link level"
28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * btm_sec_connected is called with failed status.
28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * In theory, the code that handles is_pairing_device/TRUE should clean out security related code.
28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * However, this function may clean out the security related flags and btm_sec_connected would not know
28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * this function also needs to do proper clean up.
28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         */
28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL)
28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify application that the cancel succeeded */
28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_bond_cancel_cmpl_callback)
28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS);
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**
28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_create_conn_cancel_complete
28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the command complete message
28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the HCI for the create connection cancel
28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command.
28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p)
28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       status;
28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (status, p);
28475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s  status:%d",
28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), status);
28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if the create conn cancel cmd was issued by the bond cancel,
28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the application needs to be notified that bond cancel succeeded
28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (status)
28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_SUCCESS:
28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_CONNECTION_EXISTS:
28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_NO_CONNECTION:
28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify application of the error */
28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_bond_cancel_cmpl_callback)
28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING);
28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_check_pending_reqs
28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called at the end of the security procedure
28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to let L2CAP and RFCOMM know to re-submit any pending requests
28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void)
28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First, resubmit L2CAP requests */
28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.sec_req_pending)
28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.sec_req_pending = FALSE;
28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (NULL);
28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Now, re-submit anything in the mux queue */
28901a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        fixed_queue_t *bq = btm_cb.sec_pending_q;
28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28921a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        btm_cb.sec_pending_q = fixed_queue_new(SIZE_MAX);
28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28941a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        tBTM_SEC_QUEUE_ENTRY *p_e;
28951a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)fixed_queue_try_dequeue(bq)) != NULL)
28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check that the ACL is still up before starting security procedures */
2898444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL)
28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2900444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_e->psm != 0)
2901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u",
2903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    __FUNCTION__, p_e->psm, p_e->is_orig,
2904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    p_e->mx_proto_id, p_e->mx_chan_id);
29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig,
29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->mx_proto_id, p_e->mx_chan_id,
29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->p_callback, p_e->p_ref_data);
2909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
2910444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else
2911444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback,
2913f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                      p_e->p_ref_data, p_e->sec_act);
2914444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2917abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov            osi_free(p_e);
29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
29191a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        fixed_queue_free(bq, NULL);
29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_init
29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is on the SEC startup
29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_init (UINT8 sec_mode)
29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.security_mode = sec_mode;
29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN);
29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY;
29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_device_down
29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called when device is disabled or
29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  turned off
29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void)
29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() State: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_reset
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called after device reset
29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void)
29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
296630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (controller_get_interface()->supports_simple_pairing())
29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set the default IO capabilities */
29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS;
29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mx service to use no security */
29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX,
29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0);
29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode = BTM_SEC_MODE_SERVICE;
29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_abort_access_req
29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP or RFCOMM to abort
29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the pending operation.
29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr)
29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING)
30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING))
30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback = NULL;
30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dd_create_conn
30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to create the ACL connection for
30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the dedicated boding process
30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec)
30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3021ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
3022ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    if (p_lcb && (p_lcb->link_state == LST_CONNECTED || p_lcb->link_state == LST_CONNECTING))
3023ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    {
3024ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella       BTM_TRACE_WARNING("%s Connection already exists", __func__);
3025ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella       return BTM_CMD_STARTED;
3026ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    }
30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure an L2cap link control block is available */
3029ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    if (!p_lcb && (p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL)
30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up the control block to indicated dedicated bonding */
30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed create  [%02x%02x%02x%02x%02x%02x]",
30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_lcb(p_lcb);
30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_update_busy_level (BTM_BLI_PAGE_EVT);
30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3062cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
3063cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_state_getting_name(void *data, void *context)
3064cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{
3065cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    tBTM_SEC_DEV_REC *p_dev_rec = data;
3066cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
3067cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) {
3068cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        return false;
3069cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    }
3070cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    return true;
3071cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski}
3072cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_name_request_complete
3076cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski*
30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when remote name was obtained from
30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer device
30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status)
30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int              i;
30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DEV_CLASS        dev_class;
30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sec_state;
30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete");
30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda))
30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr)))
30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_acl_resubmit_page();
30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If remote name request failed, p_bd_addr is null and we need to search */
30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* based on state assuming that we are doing 1 at a time */
30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bd_addr)
31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = btm_find_dev (p_bd_addr);
31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3103cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        list_node_t *node = list_foreach(btm_cb.sec_dev_rec, is_state_getting_name, NULL);
3104cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        if (node != NULL) {
3105cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski            p_dev_rec = list_node(node);
3106cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski            p_bd_addr = p_dev_rec->bd_addr;
3107cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        } else {
31087db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach            p_dev_rec = NULL;
3109cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        }
31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_bd_name)
31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bd_name = (UINT8 *)"";
31175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d State:%d  p_dev_rec: 0x%08x ",
31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status, p_dev_rec->sec_state, p_dev_rec);
31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d",
31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status);
31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        old_sec_state = p_dev_rec->sec_state;
31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
31365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
313766209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach            strlcpy((char *)p_dev_rec->sec_bd_name, (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN);
31385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
31395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
31405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
31425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */
31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_bd_name[0] = 0;
31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)
31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved */
31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3153831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class,
31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                 p_dev_rec->sec_bd_name);
31565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
31595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[0] = 0;
31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[1] = 0;
31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[2] = 0;
31635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved even if not found so clients can continue */
31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3167831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)"");
31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we were delaying asking UI for a PIN because name was not resolved, ask now */
31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr
31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) )
31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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);
31795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) &&
31815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) &&
31825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_pin_callback)
31835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback");
31855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
3186818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name,
3187818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (p_dev_rec->p_cur_service==NULL) ? FALSE
3188818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                     : (p_dev_rec->p_cur_service->security_flags & BTM_SEC_IN_MIN_16_DIGIT_PIN));
31895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the same state again to force the timer to be restarted */
31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we were delaying bonding because name was not resolved */
31975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0)
32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status);
3202ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD)
3203ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
3204ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_sec_bond_cancel_complete();
3205ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return;
3206ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
3207ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != HCI_SUCCESS)
32095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
32105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_cb.api.p_auth_complete_callback)
32137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
32147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                            p_dev_rec->sec_bd_name, status);
32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */
32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
32217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/
32227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* If it is set, there may be a race condition */
32235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete  IS_SM4_UNKNOWN Flags:0x%04x",
32247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                   btm_cb.pairing_flags);
32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0)
32265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
32275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 |= BTM_SM4_KNOWN;
32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__,
32327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4),
32337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4));
32347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN.
32365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed)
32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec))
32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*  before originating  */
32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
32445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection");
32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Both we and the peer are 2.1 - continue to create connection */
32475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
32495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection");
32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    if (btm_cb.api.p_auth_complete_callback)
32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
32615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA");
32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR);
32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if we were delaying link_key_callback because name was not resolved */
32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->link_key_not_sent)
32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If HCI connection complete has not arrived, wait for it */
32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = FALSE;
32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_send_link_key_notif(p_dev_rec);
32785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If its not us who perform authentication, we should tell stackserver */
32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* that some authentication has been completed                          */
32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is required when different entities receive link notification and auth complete */
32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
32835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, HCI_SUCCESS);
32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
32935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)");
32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE);
32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (old_sec_state != BTM_SEC_STATE_GETTING_NAME)
33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If get name failed, notify the waiting layer */
33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event  (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND)
33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33145344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("waiting for remote features!!");
33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remote Name succeeded, execute the next security procedure, if any */
33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_CMD_STARTED)
33235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is no next procedure or start of procedure failed, notify the waiting layer */
33267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_sec_dev_rec_cback_event  (p_dev_rec, status, FALSE);
33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
33285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_host_support_feat_evt
33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the
33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received
33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p)
33405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR         bd_addr;        /* peer address */
33435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_FEATURES     features;
33445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (bd_addr, p);
33465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
33475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt  sm4: 0x%x  p[0]: 0x%x", p_dev_rec->sm4, p[0]);
33495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
33515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 = BTM_SM4_KNOWN;
33533aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE);
33545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (HCI_SSP_HOST_SUPPORTED(features))
33555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
33565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 = BTM_SM4_TRUE;
33575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
33585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
33615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
33635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_req
33655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when LM request for the IO
33675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  capability of the local device and
33685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if the OOB data is present for the device in the event
33695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p)
33745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_REQ  evt_data;
33765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           err_code = 0;
33775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
33785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         is_orig = TRUE;
33795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           callback_rc = BTM_SUCCESS;
33805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
33825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* setup the default response according to compile options */
33845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* assume that the local IO capability does not change
33855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * loc_io_caps is initialized with the default value */
33865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.io_cap = btm_cb.devcb.loc_io_caps;
33875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.oob_data = BTM_OOB_NONE;
33885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.auth_req = BTM_DEFAULT_AUTH_REQ;
33895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3390899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s", __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state));
33915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
3393899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3394899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", __FUNCTION__,
3395899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                      btm_cb.security_mode, p_dev_rec->num_read_pages);
3396899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0))
3398899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Device security mode is SC only.",
3400899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         "To continue need to know remote features.", __FUNCTION__);
3401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = TRUE;
3403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return;
3404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
34065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 |= BTM_SM4_TRUE;
34075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s  Flags: 0x%04x  p_cur_service: 0x%08x",
3409899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state),
3410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     btm_cb.pairing_flags, p_dev_rec->p_cur_service);
34115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->p_cur_service)
34135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x",
3415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, p_dev_rec->p_cur_service->psm,
3416899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         p_dev_rec->p_cur_service->security_flags);
3417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    switch (btm_cb.pairing_state)
3420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator connecting */
3422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_IDLE:
3423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //TODO: Handle Idle pairing state
3424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //security_required = p_dev_rec->security_required;
3425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* received IO capability response already->acceptor */
3428899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_INCOMING_SSP:
34295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_orig = FALSE;
34305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD)
3432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* acceptor in dedicated bonding */
34345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
3435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator, at this point it is expected to be dedicated bonding
3439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        initiated by local device */
3440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_WAIT_PIN_REQ:
3441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN))
34425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
34445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
34455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
34465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                err_code = HCI_ERR_HOST_BUSY_PAIRING;
34485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* any other state is unexpected */
3452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        default:
34535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err_code = HCI_ERR_HOST_BUSY_PAIRING;
3454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __FUNCTION__,
3455899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             btm_cb.pairing_state);
3456899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
34575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_disabled)
3460899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3461899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* pairing is not allowed */
3462899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __FUNCTION__);
34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3464899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3465899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3466899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3467899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
3468899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* device in Secure Connections Only mode */
3469899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
3470899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3471899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,",
3472899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            " remote_support_for_sc 0x%02x -> fail pairing", __FUNCTION__,
3473899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
3474899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3475899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3476899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3477899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (err_code != 0)
34805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
34855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code);
34865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
34875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.is_orig = is_orig;
34905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_orig)
34925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local device initiated the pairing non-bonding -> use p_cur_service */
34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
34955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_cur_service &&
34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE))
34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3498899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3499899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3500899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* SC only mode device requires MITM protection */
3501899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_AUTH_SP_YES;
3502899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3503899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
3504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3505899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags &
3506899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                     BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO;
3507899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
35085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
35095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
35155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
35175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
35185738f83aeb59361a0a2eda2460113f6dc919427The 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);
35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
35215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
35225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS);
35245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    callback_rc = BTM_SUCCESS;
35265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_UPGRADE)
35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE;
35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */
35315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.auth_req = BTM_AUTH_SPGB_YES;
35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.api.p_sp_callback)
35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* the callback function implementation may change the IO capability... */
35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data))
35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT));
35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3546899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3547899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3548899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* At this moment we know that both sides are SC capable, device in */
3549899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* SC only mode requires MITM for any service so let's set MITM bit */
3550899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            evt_data.auth_req |= BTM_AUTH_YN_BIT;
3551899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x",
3552899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             __FUNCTION__, evt_data.auth_req);
3553899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3554899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3555899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* if the user does not indicate "reply later" by setting the oob_data to unknown */
3556899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* send the response right now. Save the current IO capability in the control block */
35575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = evt_data.auth_req;
35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = evt_data.io_cap;
35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3560899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: State: %s  IO_CAP:%d oob_data:%d auth_req:%d",
3561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap,
3562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         evt_data.oob_data, evt_data.auth_req);
35635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap,
35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    evt_data.oob_data, evt_data.auth_req);
35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_rsp
35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the IO capability of the
35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  specified device is received
35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p)
35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_RSP evt_data;
35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.io_cap, p);
35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.oob_data, p);
35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.auth_req, p);
35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Allocate a new device record or reuse the oldest one */
35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no security is in progress, this indicates incoming security */
35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP);
35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* work around for FW bug */
36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_stop_on_ssp();
36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We must have a device record here.
36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * Use the connecting device's CoD for the connection */
36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
36135738f83aeb59361a0a2eda2460113f6dc919427The 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);
36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */
36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */
36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (evt_data.auth_req & BTM_AUTH_DD_BOND) )            /* and dedicated bonding bit is set */
36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD;
36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save the IO capability in the device record */
36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_io_caps  = evt_data.io_cap;
36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_auth_req = evt_data.auth_req;
36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
36305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_proc_sp_req_evt
36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_USER_CONFIRMATION_REQUEST_EVT
36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_REQUEST_EVT
36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_NOTIFY_EVT
36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p)
36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_ERR_PROCESSING;
36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_EVT_DATA evt_data;
36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p_bda = evt_data.cfm_req.bd_addr;
36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All events start with bd_addr */
36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
36565738f83aeb59361a0a2eda2460113f6dc919427The 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],
36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      event, btm_pair_state_descr(btm_cb.pairing_state));
36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL)
36605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
366666209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy((char *)evt_data.cfm_req.bd_name, (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN);
36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_CFM_REQ_EVT:
36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Numeric confirmation. Need user to conf the passkey */
36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM);
36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* The device record must be allocated in the "IO cap exchange" step */
36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p);
36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.just_works = TRUE;
36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* process user confirm req in association with the auth_req param */
36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO)
36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO)
36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO)
36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) )
36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Both devices are DisplayYesNo and one or both devices want to authenticate
36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       -> use authenticated link key */
36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    evt_data.cfm_req.just_works = FALSE;
36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_proc_sp_req_evt()  just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps,
36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req);
36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_auth_req   = btm_cb.devcb.loc_auth_req;
36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_auth_req   = p_dev_rec->rmt_auth_req;
36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_io_caps    = btm_cb.devcb.loc_io_caps;
36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_io_caps    = p_dev_rec->rmt_io_caps;
36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_NOTIF_EVT:
37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Passkey notification (other side is a keyboard) */
37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.key_notif.passkey, p);
37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT:  passkey: %u", evt_data.key_notif.passkey);
37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_REQ_EVT:
37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* HCI_USER_PASSKEY_REQUEST_EVT */
37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY);
37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_sp_callback)
37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data);
37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != BTM_NOT_AUTHORIZED)
37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */
37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) )
37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* automatically reply with just works if no sp_cback */
37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_SUCCESS;
37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event == BTM_SP_CFM_REQ_EVT)
37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status);
37355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_ConfirmReqReply (status, p_bda);
37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (event == BTM_SP_KEY_REQ_EVT)
37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_PasskeyReqReply(status, p_bda, 0);
37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Something bad. we can only fail this connection */
37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SP_CFM_REQ_EVT == event)
37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (p_bda, FALSE);
37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (BTM_SP_KEY_NOTIF_EVT == event)
37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do nothing -> it very unlikely to happen.
37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        This event is most likely to be received by a HID host when it first connects to a HID device.
37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        Usually the Host initiated the connection in this case.
37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        On Mobile platforms, if there's a security process happening,
37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        the host probably can not initiate another connection.
37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTW (PC) is another story.  */
37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (NULL != (p_dev_rec = btm_find_dev (p_bda)) )
37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE);
37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply(p_bda);
37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_keypress_notif_evt
37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a key press notification is
37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received
37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid  btm_keypress_notif_evt (UINT8 *p)
37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_KEYPRESS    evt_data;
37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse & report BTM_SP_KEYPRESS_EVT */
37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bda = evt_data.bd_addr;
37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_BDADDR (p_bda, p);
37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.notif_type = *p;
37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_simple_pair_complete
38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when simple pairing process is
38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  complete
38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p)
38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_COMPLT  evt_data;
38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status;
38165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         disc = FALSE;
38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = *p++;
38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL)
38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
38245738f83aeb59361a0a2eda2460113f6dc919427The 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],
38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]);
38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_simple_pair_complete()  Pair State: %s  Status:%d  sec_state: %u",
38305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),  status, p_dev_rec->sec_state);
38315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.status = BTM_ERR_PROCESSING;
38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_PAIRING_NOT_ALLOWED)
38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The test spec wants the peer device to get this failure code. */
38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT);
38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Change the timer to 1 second */
384678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_set_on_queue(btm_cb.pairing_timer, BT_1SEC_TIMEOUT_MS,
384778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btm_sec_pairing_timeout, NULL,
384878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btu_general_alarm_queue);
38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0)
38515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop the timer */
385378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_cancel(btm_cb.pairing_timer);
38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* the initiating side: will receive auth complete event. disconnect ACL at that time */
38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                disc = TRUE;
38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc = TRUE;
38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Let the pairing state stay active, p_auth_complete_callback will report the failure */
38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (disc)
38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* simple pairing failed */
3875db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        /* Avoid sending disconnect on HCI_ERR_PEER_USER */
3876db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))
3877db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
3878db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
3879db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_rem_oob_req
38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_REMOTE_OOB_DATA_REQUEST_EVT
38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p)
38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_RMT_OOB  evt_data;
38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      c;
38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      r;
39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bda = evt_data.bd_addr;
39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) &&
39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         btm_cb.api.p_sp_callback)
39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
391366209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy((char *)evt_data.bd_name, (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN);
39145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP);
39165738f83aeb59361a0a2eda2460113f6dc919427The 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)
39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_RemoteOobDataReply(TRUE, p_bda, c, r);
39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* something bad. we can only fail this connection */
39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_rem_oob_neg_reply (p_bda);
39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_read_local_oob_complete
39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when read local oob data is
39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p)
39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_LOC_OOB evt_data;
39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status = *p++;
39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status);
39445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
39475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.c, p);
39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.r, p);
39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_ERR_PROCESSING;
39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_collision
39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when authentication or encryption
39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  needs to be retried at a later time.
39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle)
39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btm_cb.collision_start_time)
3972c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov        btm_cb.collision_start_time = time_get_os_boottime_ms();
39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3974c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov    if ((time_get_os_boottime_ms() - btm_cb.collision_start_time) < btm_cb.max_collision_delay)
39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (handle == BTM_SEC_INVALID_HANDLE)
39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL)
39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING);
39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_find_dev_by_handle (handle);
39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec != NULL)
39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We will restart authentication after timeout */
39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_state = 0;
39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_collided_dev_rec = p_dev_rec;
399278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_set_on_queue(btm_cb.sec_collision_timer, BT_1SEC_TIMEOUT_MS,
399378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btm_sec_collision_timeout, NULL,
399478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btu_general_alarm_queue);
39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_complete
40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when authentication of the connection is
40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status)
40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sm4;
40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state   = btm_cb.pairing_state;
40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             are_bonding = FALSE;
40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d  dev->sec_state: %u  Bda:%08x, RName:%s",
40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status,
40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_state,
40255738f83aeb59361a0a2eda2460113f6dc919427The 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],
40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d",
40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status);
40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection was made just to do bonding.  If we authenticate
40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       the connection that is up, this is the last event received.
40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec
40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))
40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* keep the old sm4 flag and clear the retry bit in control block */
40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_sm4 = p_dev_rec->sm4;
40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= ~BTM_SM4_RETRY;
40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        are_bonding = TRUE;
40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4071e11f228d1a18486cd00c36487812a763487a236fSrinu Jella    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
4072e11f228d1a18486cd00c36487812a763487a236fSrinu Jella          &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
4073e11f228d1a18486cd00c36487812a763487a236fSrinu Jella        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
40745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
40765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS)
40785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             &&  (old_state != BTM_PAIR_STATE_IDLE) )
40795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
40815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
40825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
40835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
40845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be a race condition, when we are starting authentication and
40885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the peer device is doing encryption.
40895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If first we receive encryption change up, then initiated authentication
40905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** can not be performed.  According to the spec we can not do authentication
40915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** on the encrypted link, so device is correct.
40925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_COMMAND_DISALLOWED)
40945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) ==
40955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)))
40965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HCI_SUCCESS;
40985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Currently we do not notify user if it is a keyboard which connects */
41005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* User probably Disabled the keyboard while it was asleap.  Let her try */
41015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_auth_complete_callback)
41025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* report the suthentication status */
41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state != BTM_PAIR_STATE_IDLE)
41055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
41065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
41075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
41115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
41135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (are_bonding)
41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != HCI_SUCCESS)
4118db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
4119db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)))
4120db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
4121db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
41225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL");
4125e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec))
4126e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* no LE keys are available, do deriving */
4127e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4128e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4129e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) &&
4130e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL");
41335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (btm_sec_is_master(p_dev_rec))
4135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
4136e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // Encryption is required to start SM over BR/EDR
4137e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // indicate that this is encryption after authentication
4138f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                    BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL, 0);
4139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
4140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
4142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4143e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
41445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If authentication failed, notify the waiting layer */
41485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
41495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((old_sm4 & BTM_SM4_RETRY) == 0)
41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* allow retry only once */
41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION)
41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* this retry for missing key is for Lisbon or later only.
41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * Legacy device do not need this. the controller will drive the retry automatically */
41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4))
41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
41665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* With BRCM controller, we do not need to delete the stored link key in controller.
41695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                If the stack may sit on top of other controller, we may need this
41705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_DeleteStoredLinkKey (bd_addr, NULL); */
41715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sm4 & BTM_SM4_RETRY)
41745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_execute_procedure (p_dev_rec);
41765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
41775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
41815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
41905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4191818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4192818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4193818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4194818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        // If we have MITM protection we have a higher level of security than
4195818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        // provided by 16 digits PIN
4196818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4197818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4198818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
41995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Authentication succeeded, execute the next security procedure, if any */
42005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_execute_procedure (p_dev_rec);
42015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
42035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
42047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
42055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
42065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
42085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_encrypt_change
42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when encryption of the connection is
42125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
42135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
42155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
42175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable)
42185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
42195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
4220ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
42217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN       *p_acl = NULL;
42227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8           acl_idx = btm_handle_to_acl_index(handle);
4223ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
42245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
42255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable);
42265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
42275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
42295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
4230e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) ||
4231e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
42325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
42345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
42375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
42395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && encr_enable)
42427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
4243818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        if (p_dev_rec->hci_handle == handle) {
42447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
4245818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            if (p_dev_rec->pin_code_length >= 16 ||
4246818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4247818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4248818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4249818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            }
4250818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
42517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
4252818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        {
42537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
4254818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
42557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
42565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* It is possible that we decrypted the link to perform role switch */
42585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* mark link not to be encrypted, so that when we execute security next time it will kick in again */
42595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && !encr_enable)
42607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
42617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->hci_handle == handle)
42627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
42637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
42647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED;
42657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
42665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
4268ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
42695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4270e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (acl_idx != MAX_L2CAP_LINKS)
42717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_acl = &btm_cb.acl_db[acl_idx];
4272ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4273efa5991fc7dc3b9b74b73966a4bf5cd5aad9f06aPavlin Radoslavov    if (p_acl != NULL)
4274efa5991fc7dc3b9b74b73966a4bf5cd5aad9f06aPavlin Radoslavov        btm_sec_check_pending_enc_req(p_dev_rec, p_acl->transport, encr_enable);
4275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
42767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_acl && p_acl->transport == BT_TRANSPORT_LE)
42775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4278e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE ||
4279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)
4280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4281d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN);
4282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
4283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4284dea4f9b42fd373d8a46565d933ec49a6583a9117Satya Calloji        btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable);
42855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4288e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    {
42895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* BR/EDR connection, update the encryption key size to be 16 as always */
42905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->enc_key_size = 16;
4291e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    }
4292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4293e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun     BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d",
4294e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                       __func__, p_dev_rec->new_encryption_key_is_p256);
4295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle))
4297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec->new_encryption_key_is_p256)
4299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_sec_use_smp_br_chnl(p_dev_rec) &&
4301e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                btm_sec_is_master(p_dev_rec) &&
4302e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* if LE key is not known, do deriving */
4303e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4304e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4305e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
4306e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* BR/EDR is encrypted with LK that can be used to derive LE LTK */
4309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                p_dev_rec->new_encryption_key_is_p256 = FALSE;
4310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4311e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                if (p_dev_rec->no_smp_on_br)
4312e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4313e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s NO SM over BR/EDR", __func__);
4314e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4315e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                else
4316e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4317e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s start SM over BR/EDR", __func__);
4318e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    SMP_BR_PairWith(p_dev_rec->bd_addr);
4319e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
4323e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        {
4324e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // BR/EDR is successfully encrypted. Correct LK type if needed
4325e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // (BR/EDR LK derived from LE LTK was used for encryption)
4326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((encr_enable == 1)  && /* encryption is ON for SSP */
4327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* LK type is for BR/EDR SC */
4328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 ||
4329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                 p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)
4332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB;
4333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */
4334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB;
4335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("updated link key type to %d", p_dev_rec->link_key_type);
4337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                btm_send_link_key_notif(p_dev_rec);
4338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else
4342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_sec_check_pending_enc_req (p_dev_rec, BT_TRANSPORT_BR_EDR, encr_enable);
4343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */
43445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this encryption was started by peer do not need to do anything */
43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING)
43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state)
43495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
43525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If encryption setup failed, notify the waiting layer */
43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Encryption setup succeeded, execute the next security procedure, if any */
43665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
43675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
43697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connect_after_reject_timeout
43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Connection for bonding could not start because of the collision
43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Initiate outgoing connection
43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
438278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_connect_after_reject_timeout(UNUSED_ATTR void *data)
43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec;
43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
438678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    BTM_TRACE_EVENT("%s", __func__);
43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_collided_dev_rec = 0;
43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
439178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        BTM_TRACE_WARNING("Security Manager: %s: failed to start connection",
439278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                          __func__);
43935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (btm_cb.api.p_auth_complete_callback)
43975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
43995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connected
44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establsihed
44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode)
44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda);
44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            res;
44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          is_pairing_device = FALSE;
44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tACL_CONN        *p_acl_cb;
44187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8            bit_shift = 0;
44195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
44215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
44245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
44255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
44265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x RName:%s",
44285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
44295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
44305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
44315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x ",
44355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
44415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no device record for new connection.  Allocate one */
44435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
44445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4449bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            /* If the device matches with stored paring address
4450bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella             * reset the paring state to idle */
4451bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
4452bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella                (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0))
4453bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            {
4454bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella                btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
4455bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            }
4456bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella
44575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* can not find the device record and the status is error,
44585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * just ignore it */
44595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
44605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else    /* Update the timestamp for this device */
44635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
44657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
44667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0;
44677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
44685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->timestamp = btm_cb.dev_rec_count++;
44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
44705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell L2CAP it's a bonding connection. */
44725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
44735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if incoming connection failed while pairing, then try to connect and continue */
44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Motorola S9 disconnects without asking pin code */
44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ))
44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
44805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
44845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
44855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* Start timer with 0 to initiate connection with new LCB */
44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* because L2CAP will delete current LCB with this event  */
44875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_cb.p_collided_dev_rec = p_dev_rec;
448878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                        alarm_set_on_queue(btm_cb.sec_collision_timer, 0,
448978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                           btm_sec_connect_after_reject_timeout,
449078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                           NULL, btu_general_alarm_queue);
44915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
44957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                        BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR);
44965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
44995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return;
45015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
45025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
45035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
45045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE);
45055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* always clear the pending flag */
45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
45137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
45147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
45157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
45165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
45175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
45185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
45195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4521ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
45225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
45235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) )
45245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection from bonding device */
45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((status == HCI_ERR_HOST_REJECT_DEVICE)
45275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT))
45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags, p_dev_rec->sm4);
45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT;
45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
45345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
45365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
45377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR);
45385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
45395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if we already have pin code */
45425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
45435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Start timer with 0 to initiate connection with new LCB */
45455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* because L2CAP will delete current LCB with this event  */
45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.p_collided_dev_rec = p_dev_rec;
454778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                alarm_set_on_queue(btm_cb.sec_collision_timer, 0,
454878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                   btm_sec_connect_after_reject_timeout,
454978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                   NULL, btu_general_alarm_queue);
45505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* wait for incoming connection without resetting pairing state */
45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (status == HCI_ERR_CONNECTION_EXISTS)
45565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection");
45585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
45595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_pairing_device = TRUE;
45625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
45655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
45665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if connection fails during pin request, notify application */
45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
45695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If connection failed because of during pairing, need to tell user */
45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_pairing_device)
45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift);
45755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required );
45765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
45785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
45805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
45815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
45845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
45855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /*
45887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta     Do not send authentication failure, if following conditions hold good
45897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      1.  BTM Sec Pairing state is idle
45907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      2.  Link key for the remote device is present.
45917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      3.  Remote is SSP capable.
45927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta  */
45937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else if  ((p_dev_rec->link_key_type  <= BTM_LKEY_TYPE_REMOTE_UNIT) &&
45947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (((status == HCI_ERR_AUTH_FAILURE)                      ||
45955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_KEY_MISSING)                         ||
45965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_HOST_REJECT_SECURITY)                ||
45975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_NOT_ALLOWED)                 ||
45985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_UNIT_KEY_USED)                       ||
45995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
46005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)           ||
46017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (status == HCI_ERR_REPEATED_ATTEMPTS))))
46025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
46035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
46047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift);
46057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
46067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE
46077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* If we rejected pairing, pass this special result code */
46087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY)
46097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
46107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                status = HCI_ERR_HOST_REJECT_SECURITY;
46117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
46127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
46155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
46175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
46185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
46195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
46205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
46215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT  ||
46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status == HCI_ERR_UNSPECIFIED     || status == HCI_ERR_PAGE_TIMEOUT)
46257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE);
46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
46277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If initiated dedicated bonding, return the link key now, and initiate disconnect */
46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If dedicated bonding, and we now have a link key, we are all done */
46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_pairing_device
46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) )
46365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->link_key_not_sent)
46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->link_key_not_sent = FALSE;
46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_send_link_key_notif(p_dev_rec);
46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remember flag before it is initialized */
46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = TRUE;
46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = FALSE;
46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( res )
46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Let l2cap start bond timer */
46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE);
46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* role may not be correct here, it will be updated by l2cap, but we need to */
46705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notify btm_acl that link is up, so starting of rmt name request will not */
46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set paging flag up */
46727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR);
46735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_acl_cb)
46745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */
46765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* For now there are a some devices that do not like sending */
46785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* commands events and data at the same time. */
46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the packet types to the default allowed by the device */
46805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
46815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.btm_def_link_policy)
46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
46855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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);
46875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize security flags.  We need to do that because some            */
46895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization complete could have come after the connection is dropped */
46905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* and that would set wrong flag that link has been authorized already    */
46917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
46927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift);
46935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (enc_mode != HCI_ENCRYPT_MODE_DISABLED)
46957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift);
46965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode == BTM_SEC_MODE_LINK)
46987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift);
46995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4700818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4701818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4702818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4703818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= (BTM_SEC_16_DIGIT_PIN_AUTHED << bit_shift);
4704818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4705818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
47065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->link_key_changed = FALSE;
47075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* After connection is established we perform security if we do not know */
47095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the name, or if we are originator because some procedure can have */
47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* been scheduled while connection was down */
47115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator);
47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator)
47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
47157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnect
47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to disconnect HCI link
47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          btm status
47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason)
47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* In some weird race condition we may not have a record */
47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_disconnect (handle, reason);
47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
47385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
47425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
47435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
47445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we are currently doing bonding.  Link will be disconnected when done */
47465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
47475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_BUSY);
47485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
47515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnected
47565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
47585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  dropped
47595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
47615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason)
47645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
47665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8             old_pairing_flags = btm_cb.pairing_flags;
47675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               result = HCI_ERR_AUTH_FAILURE;
4768ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    tBTM_SEC_CALLBACK   *p_callback = NULL;
47697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT      transport = BT_TRANSPORT_BR_EDR;
47705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If page was delayed for disc complete, can do it now */
47725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.discing = FALSE;
47735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
47755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
47775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
47785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    transport  = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE;
47807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
4781ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4782ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
47835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
4784db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_INFO(LOG_TAG, "%s clearing pending flag handle:%d reason:%d", __func__, handle, reason);
47855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
47865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
47875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear unused flags */
47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= BTM_SM4_TRUE;
47905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4791f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr;
4792f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x"
4793f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            "  remote_name:%s", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state),
4794f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            reason, bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5], p_dev_rec->sec_bd_name);
47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4796f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
47975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
47995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
48005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0))
48015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
48035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
48045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
48055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
48065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the disconnection reason is REPEATED_ATTEMPTS,
48075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               send this error message to complete callback function
48085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               to display the error message of Repeated attempts.
48095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               All others, send HCI_ERR_AUTH_FAILURE. */
48105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (reason == HCI_ERR_REPEATED_ATTEMPTS)
48115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
48125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_REPEATED_ATTEMPTS;
48135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
48145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
48165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_HOST_REJECT_SECURITY;
48175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
48185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,     p_dev_rec->dev_class,
48195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, result);
48205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
48215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
482424adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera    btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS);
48255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* see sec_flags processing in btm_acl_removed */
48267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
48277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
48287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
48297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE;
48307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED);
483182c8b9270ba962d5f271a833a3454baddbc063aaNitin Arora        p_dev_rec->enc_key_size = 0;
48327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
48337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
48345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
48357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
48367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
4837818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
4838818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                | BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED);
48397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
48405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4841444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4842444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)
4843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ?
4845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
4846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return;
4847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
48497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
48505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_NONE;
4851ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4852ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    p_callback = p_dev_rec->p_callback;
4853ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4854ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    /* if security is pending, send callback to clean up the security state */
4855ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    if(p_callback)
4856ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    {
4857ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before
4858ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach                                         we do, this call back must be reset here */
48597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
4860ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    }
4861ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4862f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
48635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_notification
48685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a new connection link key is
48705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  generated
48715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
48735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
48755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type)
48765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
4878444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         we_are_bonding = FALSE;
4879444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         ltk_derived_lk  = FALSE;
48805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_notification()  BDA:%04x%08x, TYPE: %d",
48825738f83aeb59361a0a2eda2460113f6dc919427The 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],
48835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      key_type);
48845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) &&
4886444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256))
4887444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4888444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        ltk_derived_lk = TRUE;
4889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        key_type -= BTM_LTK_DERIVED_LKEY_OFFSET;
4890444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
48915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
48925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
48935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_type != BTM_LKEY_TYPE_CHANGED_COMB)
48955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_type = key_type;
48965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
4898818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
4899818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    /*
4900818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     * Until this point in time, we do not know if MITM was enabled, hence we
4901818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     * add the extended security flag here.
4902818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     */
4903818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4904818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4905818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4906818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4907818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4908818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
4909ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
4910ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* BR/EDR connection, update the encryption key size to be 16 as always */
4911ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->enc_key_size = 16;
4912ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
49135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN);
49145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
49165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
49175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
49195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            we_are_bonding = TRUE;
49205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
49215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
49225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4924444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* save LTK derived LK no matter what */
4925444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (ltk_derived_lk)
4926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4927444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (btm_cb.api.p_link_key_callback)
4928444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4929444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)",
4930444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                  __FUNCTION__, p_dev_rec->link_key_type);
4931444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4932444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_dev_rec->sec_bd_name,
4933444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_link_key, p_dev_rec->link_key_type);
4934444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4935444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else
4937444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4938444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) ||
4939444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4940444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4941e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun             p_dev_rec->new_encryption_key_is_p256 = TRUE;
4942444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji             BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d",
4943e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                               __func__, p_dev_rec->new_encryption_key_is_p256);
4944444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4945444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
49475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If name is not known at this point delay calling callback until the name is   */
49485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* resolved. Unless it is a HID Device and we really need to send all link keys. */
49495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
4950e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        &&  ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL))
4951e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        && !ltk_derived_lk)
49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_link_key_notification()  Delayed BDA: %08x%04x Type:%d",
4954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3],
4955444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[4] << 8) + p_bda[5], key_type);
49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = TRUE;
49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If it is for bonding nothing else will follow, so we need to start name resolution */
49605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (we_are_bonding)
49615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0)))
49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_inq_rmt_name_failed();
49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
49655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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])
49675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
49685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If its not us who perform authentication, we should tell stackserver */
49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* that some authentication has been completed                          */
49725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This is required when different entities receive link notification and auth complete */
4973e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)
4974e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        /* for derived key, always send authentication callback for BR channel */
4975e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun         || ltk_derived_lk)
49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
49805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We will save link key only if the user authorized it - BTE report link key in all cases */
49835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE
49845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
49865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_link_key_callback)
49885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4989e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (ltk_derived_lk)
4990e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4991e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                BTM_TRACE_DEBUG ("btm_sec_link_key_notification()  LTK derived LK is saved already"
4992e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                    " (key_type = %d)", p_dev_rec->link_key_type);
4993e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
4994e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            else
4995e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4996e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4997e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_dev_rec->sec_bd_name,
4998e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_link_key, p_dev_rec->link_key_type);
4999e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
50005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
50015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
50095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda)
50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50175344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_request()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5020b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
5021b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (btm_cb.collision_start_time != 0) &&
5022b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) )
5023b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    {
5024b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req "
5025b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta            "State: %d START_TIMEOUT : %d",
5026b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta             btm_cb.pairing_state, btm_cb.collision_start_time);
5027b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        btsnd_hcic_link_key_neg_reply (p_bda);
5028b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        return;
5029b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    }
50305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key);
50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (p_bda);
50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The link key is not in the database and it is not known to the manager */
50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_link_key_neg_reply (p_bda);
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** Function         btm_sec_pairing_timeout
50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when host does not provide PIN
50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  within requested time
50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
505378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_pairing_timeout(UNUSED_ATTR void *data)
50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
50575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE)
50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_NO;
50595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_YES;
50615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name[2];
50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */
50655738f83aeb59361a0a2eda2460113f6dc919427The 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.
50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (p_cb->pairing_bda);
50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
506978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    BTM_TRACE_EVENT ("%s  State: %s   Flags: %u", __func__,
50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags);
50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->pairing_state)
50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:
50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:
50795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0)
50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda);
50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that no longer need the PIN */
50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:
51005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE);
51015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
51025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
51055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:
51065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda);
51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
51085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */
51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:
51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                auth_req |= BTM_AUTH_DD_BOND;
51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps,
51165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         BTM_OOB_NONE, auth_req);
51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:
51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda);
51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:
51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* simple pairing failed. Started a 1-sec timer at simple pairing complete.
51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * now it's time to tear down the ACL link*/
51285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec == NULL)
51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
513078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                BTM_TRACE_ERROR("%s BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
513178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                __func__,
513278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3],
513378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]);
51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
51375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:
514105bb84c66dc4813b5da13a7d2db27e80fb613293Srinu Jella        case BTM_PAIR_STATE_GET_REM_NAME:
51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that timeout has happened while waiting for authentication*/
51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
51525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
516178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            BTM_TRACE_WARNING("%s not processed state: %s", __func__,
516278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                              btm_pair_state_descr(btm_cb.pairing_state));
51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
51675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pin_code_request
51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests PIN code
51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda)
51785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB          *p_cb = &btm_cb;
51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
518257bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#ifdef PORCHE_PAIRING_CONFLICT
518357bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath    UINT8 default_pin_code_len = 4;
518457bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath    PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30};
518557bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#endif
51865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_pin_code_request()  State: %s, BDA:%04x%08x",
51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),
51885738f83aeb59361a0a2eda2460113f6dc919427The 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] );
51895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0)  &&
51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) )
51945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* fake this out - porshe carkit issue - */
51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//            btm_cb.pairing_state = BTM_PAIR_STATE_IDLE;
51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             if(! btm_cb.pin_code_len_saved)
51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 btsnd_hcic_pin_code_neg_reply (p_bda);
52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 return;
52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             }
52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             else
52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code);
5205818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                 return;
52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             }
52075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ)
52095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
52105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s",
52125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                btm_pair_state_descr(btm_cb.pairing_state));
52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
52155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reply pin code again due to counter in_rand when local initiates pairing */
52165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing");
52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(! btm_cb.pin_code_len_saved)
52185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
521957bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
522057bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath                btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code);
52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code);
52265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
52285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (p_bda);
52295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
52305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
52315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (p_bda);
52355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* received PIN code request. must be non-sm4 */
52365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 = BTM_SM4_KNOWN;
52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN);
52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD;
52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
52455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED))
52485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying");
52505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
52515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code);
52525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
52535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use the connecting device's CoD for the connection */
52565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN))
52575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) )
52585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN);
52595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We could have started connection after asking user for the PIN code */
52615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len != 0)
52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply");
52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code);
52655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len_saved = btm_cb.pin_code_len;
52685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark that we forwarded received from the user PIN code */
52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = 0;
52725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can change mode back right away, that other connection being established */
52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* is not forced to be secure - found a FW issue, so we can not do this
52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode(); */
52765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
52785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If pairing disabled OR (no PIN callback and not bonding) */
52815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* OR we could not allocate entry in the database reject pairing request */
52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_cb->pairing_disabled
52835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (p_cb->api.p_pin_callback == NULL)
52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* OR Microsoft keyboard can for some reason try to establish connection */
52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  the only thing we can do here is to shut it up.  Normally we will be originator */
52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  for keyboard bonding */
52885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (!p_dev_rec->is_originator
52895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) )
52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec);
52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_neg_reply (p_bda);
52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify upper layer of PIN request and start expiration timer */
52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len_saved = 0;
53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
53025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Pin code request can not come at the same time as connection request */
53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN);
53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if the name is known */
53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Even if name is not known we might not be able to get one */
53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this is the case when we are already getting something from the */
53095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* device, so HCI level is flow controlled */
53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Also cannot send remote name request while paging, i.e. connection is not completed */
53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
53125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback");
53145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
5316818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            if (p_cb->api.p_pin_callback) {
5317818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
5318818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        (p_dev_rec->p_cur_service == NULL) ? FALSE
5319818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                : (p_dev_rec->p_cur_service->security_flags
5320818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                   & BTM_SEC_IN_MIN_16_DIGIT_PIN));
5321818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            }
53225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name");
53265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We received PIN code request for the device with unknown name */
53285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* it is not user friendly just to ask for the PIN without name */
53295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* try to get name at first */
53305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr,
53315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_PAGE_SCAN_REP_MODE_R1,
53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_MANDATARY_PAGE_SCAN_MODE, 0))
53335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
53355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[0] = 'f';
53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[1] = '0';
53375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback");
53385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
53405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_cb->api.p_pin_callback)
5341818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class,
5342818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                            p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE
5343818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                    : (p_dev_rec->p_cur_service->security_flags
5344818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                       & BTM_SEC_IN_MIN_16_DIGIT_PIN));
53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
53465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
53515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
53535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_update_clock_offset
53555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to update clock offset
53575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
53595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
53615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset)
53625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
53635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
53645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO     *p_inq_info;
53655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL)
53675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
53685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
53705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL)
53725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
53735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
53755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
53765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************
53785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C     F U N C T I O N S
53795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/
53805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
53825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_execute_procedure
53845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start required security
53865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  procedure.  There is a case when multiplexing protocol
53875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  calls this function on the originating side, connection to
53885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer will not be established.  This function in this
53895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  case performs only authorization.
53905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS     - permission is granted
53925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED - in process
53935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES  - permission declined
53945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
53965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec)
53975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
53985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
53995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state);
54005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is a chance that we are getting name.  Wait until done. */
54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != 0)
54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If any security is required, get the name first */
54065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
54075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
54085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start get name");
54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_get_name (p_dev_rec))
54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authenticated and authentication is required */
54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authentication and return PENDING to the caller */
5419818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if ((((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
54205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
5421818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE))))
5422818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        || (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
5423818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            && (!p_dev_rec->is_originator
5424818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    && (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN))))
54255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
54265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5427818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        /*
5428818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * We rely on BTM_SEC_16_DIGIT_PIN_AUTHED being set if MITM is in use,
5429818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * as 16 DIGIT is only needed if MITM is not used. Unfortunately, the
5430818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * BTM_SEC_AUTHENTICATED is used for both MITM and non-MITM
5431818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * authenticated connections, hence we cannot distinguish here.
5432818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         */
5433818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
54345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
54355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
54365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
54375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
54385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
54395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54405344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start authentication");
54415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5442818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        /*
5443818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * If we do have a link-key, but we end up here because we need an
5444818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * upgrade, then clear the link-key known and authenticated flag before
5445818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * restarting authentication.
5446818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * WARNING: If the controller has link-key, it is optional and
5447818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * recommended for the controller to send a Link_Key_Request.
5448818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * In case we need an upgrade, the only alternative would be to delete
5449818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * the existing link-key. That could lead to very bad user experience
5450818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * or even IOP issues, if a reconnect causes a new connection that
5451818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * requires an upgrade.
5452818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         */
5453818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
5454818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                && (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
5455818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    && (!p_dev_rec->is_originator && (p_dev_rec->security_required
5456818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                            & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) {
5457818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED
5458818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    | BTM_SEC_AUTHENTICATED);
5459818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
5460818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
54615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
54625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
54645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not encrypted and encryption is required */
54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start encryption and return PENDING to the caller */
54705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
54715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT))
54725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT)))
54735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
54745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
54765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
54775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
54785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
54795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start encryption");
54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_encryption (p_dev_rec))
54845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
54865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5490899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
5491899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
5492899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
5493899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -",
5494899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        "security failure", __FUNCTION__, p_dev_rec->link_key_type);
5495899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return (BTM_FAILED_ON_SECURITY);
5496899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
5497899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authorized and authorization is required */
54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authorization and return PENDING to the caller */
55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
55015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE))
55025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE))))
55035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("service id:%d, is trusted:%d",
55055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->p_cur_service->service_id,
55065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
55075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                      p_dev_rec->p_cur_service->service_id)));
55085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) &&
55095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) &&
55105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
55115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_dev_rec->p_cur_service->service_id) == FALSE))
55125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
55135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: Start authorization");
55145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(btm_sec_start_authorization (p_dev_rec));
55155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
55165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All required  security procedures already established */
55195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE |
55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE |
55215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT |
55225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER |
55235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
55245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
55265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: access granted");
55275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_SUCCESS);
55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_get_name
55345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start get name procedure
55365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec)
55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 tempstate = p_dev_rec->sec_state;
55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME;
55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Device should be connected, no need to provide correct page params */
55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* 0 and NULL are as timeout and callback params because they are not used in security get name case */
55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC,
55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                0, NULL)) != BTM_CMD_STARTED)
55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_state = tempstate;
55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
55565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authentication
55615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authentication
55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec)
55685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
55705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btsnd_hcic_auth_request (p_dev_rec->hci_handle));
55725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_encryption
55775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start encryption
55795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec)
55845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE))
55865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
55875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authorization
55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authorization
55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec)
56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    result;
56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_service_name = NULL;
56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    service_id;
56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE))
56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_cb.api.p_authorize_callback)
56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_MODE_UNSUPPORTED);
56125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->p_cur_service)
56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->is_originator)
56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->orig_service_name;
56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->term_service_name;
56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = p_dev_rec->p_cur_service->service_id;
56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = 0;
56255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Send authorization request if not already sent during this service connection */
5627ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
5628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            || p_dev_rec->last_author_service_id != service_id)
5629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
5630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING;
5631ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr,
56325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->dev_class,
56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->sec_bd_name,
56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_service_name,
56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     service_id,
56365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->is_originator);
5637ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5638ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5639ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else    /* Already authorized once for this L2CAP bringup */
5640ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
56415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
5642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            return (BTM_SUCCESS);
5643ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5644ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (result == BTM_SUCCESS)
56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED;
5648ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5649ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Save the currently authorized service in case we are asked again by another multiplexer layer */
5650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (!p_dev_rec->is_originator)
5651ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_dev_rec->last_author_service_id = service_id;
5652ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
56535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
56545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(result);
56565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_start_get_name (p_dev_rec);
56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
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_are_all_trusted
56645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called check if all services are trusted
56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if all are trusted, otherwise FALSE
56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[])
56715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5672ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT32 trusted_inx;
56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++)
56745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL)
56765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(FALSE);
56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_first_serv
56855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the first record in the service database
56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm)
56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
56965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
56975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
56995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_ORIG_MASK )
57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
57035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
57055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm)
57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the PSM matches p_out_serv,
57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, just find the first record with the specified PSM */
57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) )
57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
57205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_next_serv
57275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the next record in the service database
57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur)
57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec   = &btm_cb.sec_serv_rec[0];
57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               i;
57385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
57405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
57425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == p_cur->psm) )
57435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
57445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cur != p_serv_rec)
57455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(p_serv_rec);
57475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
57495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
57515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_mx_serv
57565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the service database with specified
57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PSM and multiplexor channel information
57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id, UINT32 mx_chan_id)
57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv;
57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
57685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
57695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5770444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
57715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && p_out_serv && p_out_serv->psm == psm
57725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->mx_proto_id == mx_proto_id
57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->orig_mx_chan_id == mx_chan_id)
57745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the parameters match p_out_serv,
57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, the old way */
57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == psm)
57855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->mx_proto_id == mx_proto_id)
57865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (( is_originator && (p_serv_rec->orig_mx_chan_id  == mx_chan_id))
57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                || (!is_originator && (p_serv_rec->term_mx_chan_id  == mx_chan_id))))
57885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
57895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
57905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
57915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
57935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_collision_timeout
57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Encryption could not start because of the collision
58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  try to do it again
58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
580578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_collision_timeout(UNUSED_ATTR void *data)
58065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5807444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()", __func__);
58085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec);
58105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
58125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no next procedure or start of procedure failed, notify the waiting layer */
58157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE);
58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
58225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
58245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
58265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec)
58295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_link_key_callback)
58315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
58325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->sec_bd_name, p_dev_rec->link_key,
58335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->link_key_type);
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_ReadTrustedMask
58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get trusted mask for the peer device
58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr   - Address of the device
58435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          NULL, if the device record is not found.
58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  otherwise, the trusted mask
58465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr)
58495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
5851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec != NULL)
58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(p_dev_rec->trusted_mask);
5853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return NULL;
58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_restore_mode
58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the security mode to previous setting
58615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if it was changed during bonding.
58625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
58655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void)
58685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode_changed)
58705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = FALSE;
5872444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK));
58735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK));
58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_type_changed)
58775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_type_changed = FALSE;
58795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type);
58805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5883cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
5884cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_sec_state_equal(void *data, void *context)
5885cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{
5886cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    tBTM_SEC_DEV_REC *p_dev_rec = data;
5887cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    UINT8 *state = context;
5888cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
5889cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    if (p_dev_rec->sec_state == *state)
5890cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        return false;
5891cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
5892cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    return true;
5893cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski}
5894cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
58955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_dev_by_sec_state
58985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the device database for the device
59005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  which is being authenticated or encrypted
59015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
59035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state)
59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5907cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    list_node_t *n = list_foreach(btm_cb.sec_dev_rec, is_sec_state_equal, &state);
5908cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    if (n)
5909cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        return list_node(n);
59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5911cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    return NULL;
59125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_change_pairing_state
59175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to change pairing state
59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state)
59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state = btm_cb.pairing_state;
59245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5925444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  Old: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
5926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  New: %s pairing_flags:0x%x", __func__,
5927444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            btm_pair_state_descr(new_state), btm_cb.pairing_flags);
59285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_state = new_state;
59305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_state == BTM_PAIR_STATE_IDLE)
59325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
593378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(btm_cb.pairing_timer);
59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = 0;
59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len  = 0;
59375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the the lcb shows we are not bonding */
59395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE);
59405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode();
59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_check_pending_reqs();
59435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_clear_ssp();
59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN);
59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
59485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
594978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        /* If transitioning out of idle, mark the lcb as bonding */
59505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state == BTM_PAIR_STATE_IDLE)
59515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE);
59525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_set_on_queue(btm_cb.pairing_timer,
595478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           BTM_SEC_TIMEOUT_VALUE * 1000,
595578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btm_sec_pairing_timeout, NULL,
595678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btu_general_alarm_queue);
59575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_pair_state_descr
59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
59685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state)
59695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
59715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (state)
59725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_IDLE:                   return("IDLE");
59745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_GET_REM_NAME:           return("GET_REM_NAME");
59755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:           return("WAIT_PIN_REQ");
59765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:         return("WAIT_LOCAL_PIN");
59775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:   return("WAIT_NUM_CONFIRM");
59785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:              return("KEY_ENTRY");
59795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:     return("WAIT_LOCAL_OOB_RSP");
59805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:      return("WAIT_LOCAL_IOCAPS");
59815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_INCOMING_SSP:           return("INCOMING_SSP");
59825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:     return("WAIT_AUTH_COMPLETE");
59835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:        return("WAIT_DISCONNECT");
59845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return("???");
59875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5988104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer    sprintf(btm_cb.state_temp_buffer,"%hhu",state);
59895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_cb.state_temp_buffer);
59915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
59925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
59945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_rec_cback_event
59985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function calls the callback function with the given
60005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  result and clear the callback function.
60015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
60035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
600532429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport)
60065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
60075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_CALLBACK   *p_callback = p_dev_rec->p_callback;
60085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->p_callback)
60105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
60115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
6012e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
60131287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE
6014e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (is_le_transport)
6015e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res);
6016e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        else
60171287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif
6018e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res);
60195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
60215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_check_pending_reqs();
60225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
60235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
60255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_queue_mx_request
60275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
60295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
60315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
60325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         UINT32 mx_proto_id, UINT32 mx_chan_id,
60335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
60345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6035abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY));
60365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60375fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->psm            = psm;
60385fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->is_orig        = is_orig;
60395fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->p_callback     = p_callback;
60405fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->p_ref_data     = p_ref_data;
60415fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->mx_proto_id    = mx_proto_id;
60425fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->mx_chan_id     = mx_chan_id;
60435fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->transport      = BT_TRANSPORT_BR_EDR;
60445fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->sec_act        = 0;
60455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60465fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN);
60475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60485fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    BTM_TRACE_EVENT("%s() PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
60495fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                     __func__, psm, is_orig, mx_proto_id, mx_chan_id);
60505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60515fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    fixed_queue_enqueue(btm_cb.sec_pending_q, p_e);
60525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60535fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    return TRUE;
60545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
60555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec)
60575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
60585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK);
60595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK);
60605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN rv = FALSE;
60615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((major == BTM_COD_MAJOR_AUDIO)
60635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&  ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) )
60645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6065444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x",
6066444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            __func__, major, minor);
60675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.security_mode_changed == FALSE)
60695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
60705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.security_mode_changed = TRUE;
60715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
60725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
60735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
60745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_write_auth_enable (TRUE);
60755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
60765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
60775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
60785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
60795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
60805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If we got a PIN, use that, else try to get one */
60825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pin_code_len)
60835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
60845738f83aeb59361a0a2eda2460113f6dc919427The 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);
60855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
60865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
60875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
60885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pin was not supplied - pre-fetch pin code now */
60895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0))
60905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("%s() PIN code callback called", __func__);
60927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL)
60935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
6094818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
6095818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE
6096818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                : (p_dev_rec->p_cur_service->security_flags
6097818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                   & BTM_SEC_IN_MIN_16_DIGIT_PIN));
60985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
60995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
61005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
61015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rv = TRUE;
61025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
61035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
61045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rv;
61055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
61065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_auth_payload_tout
6110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      Processes the HCI Autheniticated Payload Timeout Event
6112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  indicating that a packet containing a valid MIC on the
6113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  connection handle was not received within the programmed
6114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  timeout value. (Spec Default is 30 secs, but can be
6115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  changed via the BTM_SecSetAuthPayloadTimeout() function.
6116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len)
6119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT16 handle;
6121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    STREAM_TO_UINT16 (handle, p);
6123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    handle = HCID_GET_HANDLE (handle);
6124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Will be exposed to upper layers in the future if/when determined necessary */
6126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_ERROR ("%s on handle 0x%02x", __func__, handle);
6127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_queue_encrypt_request
6132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      encqueue encryption request when device has active security
6134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  process pending.
6135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport,
6138f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data,
6139f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                         tBTM_BLE_SEC_ACT sec_act)
6140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
61415fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tBTM_SEC_QUEUE_ENTRY *p_e =
61425fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        (tBTM_SEC_QUEUE_ENTRY *)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1);
6143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
61445fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->psm        = 0;  /* if PSM 0, encryption request */
61455fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->p_callback = p_callback;
61465fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->p_ref_data = p_ref_data;
61475fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->transport  = transport;
61485fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->sec_act    = sec_act;
61495fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN);
61505fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    fixed_queue_enqueue(btm_cb.sec_pending_q, p_e);
6151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
61525fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    return TRUE;
6153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6157899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_peer_sec_caps
6158899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6159899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set sm4 and rmt_sec_caps fields
6160899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  based on the available peer device features.
6161899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6162899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
6163899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6164899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6165899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec)
6166899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6167899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BD_ADDR     rem_bd_addr;
6168899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT8       *p_rem_bd_addr;
6169899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6170899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
6171899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
6172899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
6173899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
6174899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6175899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_TRUE;
6176899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections =
6177899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]));
6178899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6179899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
6180899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_KNOWN;
6182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections = FALSE;
6183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6184899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6185899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", __FUNCTION__,
6186899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                  p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections);
6187899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6188899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->remote_features_needed)
6189899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6190899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!",
6191899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        __FUNCTION__);
6192899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6193899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr);
6194899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6195899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_io_capabilities_req(p_rem_bd_addr);
6196899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = FALSE;
6197899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6202899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_is_serv_level0
6203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6204899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the service corresponding
6205899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  to PSM is security mode 4 level 0 service.
6206899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6207899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if the service is security mode 4 level 0 service
6208899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6209899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6210899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0(UINT16 psm)
6211899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6212899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (psm == BT_PSM_SDP)
6213899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __FUNCTION__, psm);
6215899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return TRUE;
6216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return FALSE;
6218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_check_pending_enc_req
6223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to send pending encryption callback if
6225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  waiting
6226444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          void
6228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
6231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable)
6232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6233577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov    if (fixed_queue_is_empty(btm_cb.sec_pending_q))
6234577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov        return;
6235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6236577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov    UINT8 res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING;
62371a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    list_t *list = fixed_queue_get_list(btm_cb.sec_pending_q);
62381a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    for (const list_node_t *node = list_begin(list); node != list_end(list); ) {
62391a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)list_node(node);
62401a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        node = list_next(node);
6241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0
6243444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6244444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            && p_e->transport == transport
6245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            )
6247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
6248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR
6249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6250f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                || p_e->sec_act == BTM_BLE_SEC_ENCRYPT
6251f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                || p_e->sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM
6252f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                || (p_e->sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags
6253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    & BTM_SEC_LE_AUTHENTICATED)
6254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6255444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji               )
6256444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
6257f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                if (p_e->p_callback)
6258f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                    (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res);
6259f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                fixed_queue_try_remove_from_queue(btm_cb.sec_pending_q, (void *)p_e);
6260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
6261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
6262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6263899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6264899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6265899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6266899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6267899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_serv_level4_flags
6268899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6269899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set security mode 4 level 4 flags.
6270899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6271899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          service security requirements updated to include secure
6272899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  connections only mode.
6273899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6274899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6275899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags(UINT16 cur_security, BOOLEAN is_originator)
6276899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6277899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT16  sec_level4_flags = is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS;
6278899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6279899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return cur_security | sec_level4_flags;
6280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
62825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clear_ble_keys
62855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to clear out the BLE keys.
62875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically when devices are removed in BTM_SecDeleteDevice,
62885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or when a new BT Link key is generated.
62895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
62915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
62935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC  *p_dev_rec)
62945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
62955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() Clearing BLE Keys", __func__);
62975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE)
6298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
62995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS));
6300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE)
6302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_ble_resolving_list_remove_dev(p_dev_rec);
6303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
63045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
63055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
63065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
63085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_is_a_bonded_dev
63105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description       Is the specified device is a bonded device
63125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - dev is bonded
63145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
63165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda)
63175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
63185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
63205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_bonded= FALSE;
63215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_dev_rec &&
63231287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if (SMP_INCLUDED == TRUE)
63247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))||
63251287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#else
63261287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach        (
63277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
63287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
63295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
63305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_bonded = TRUE;
63315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_bonded=%d", __func__, is_bonded);
63335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(is_bonded);
63345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
63355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
63375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6338ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_le_capable_dev
6339ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6340ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description       Is the specified device is dual mode or LE only device
6341ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6342ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE - dev is a dual mode
6343ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6344ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
6345ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda)
6346ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
6347ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
6348ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN le_capable = FALSE;
6349ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6350ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE)
6351e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE)
6352ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        le_capable  = TRUE;
6353ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
6354ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return le_capable;
6355ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
6356ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6357ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
6358ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_use_smp_br_chnl
6360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6361444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if SMP BR connection can be used with
6362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the peer.
6363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  Is called when authentication for dedicated bonding is
6364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  successfully completed.
6365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if SMP BR connection can be used (the link key is
6367444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         generated from P-256 and the peer supports Security
6368444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         Manager over BR).
6369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6370444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6371444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec)
6372444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6373444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT32  ext_feat;
6374444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT8   chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE];
6375444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6376444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x", __func__,
6377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->link_key_type);
6378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) &&
6380444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
6381444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         return FALSE;
6382444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6383444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask))
6384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6385444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6386444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT))
6387444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return TRUE;
6390444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6391444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6392444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6393444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6394444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_is_master
6395444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6396444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if the device is BR/EDR master after
6397444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  pairing is completed.
6398444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if the device is master.
6400444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec)
6403444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6404444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
6405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return (p && (p->link_role == BTM_ROLE_MASTER));
6406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6408