btm_sec.c revision 1287166da9c34f041d54a78800b79cb2738675a9
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
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
3179ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h"
365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
3744802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE && BT_TRACE_VERBOSE == FALSE)
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* needed for sprintf() */
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "gatt_int.h"
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#define BTM_SEC_MAX_COLLISION_DELAY     (5000)
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
546975b4d711142b885af479721cada448952c6b41Andre Eisenbach
556975b4d711142b885af479721cada448952c6b41Andre Eisenbach/********************************************************************************
566975b4d711142b885af479721cada448952c6b41Andre Eisenbach**              L O C A L    F U N C T I O N     P R O T O T Y P E S            *
576975b4d711142b885af479721cada448952c6b41Andre Eisenbach*********************************************************************************/
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id,
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_chan_id);
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec);
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec);
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle);
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_restore_mode(void);
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle);
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state);
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char     *btm_pair_state_descr (tBTM_PAIRING_STATE state);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_check_pending_reqs(void);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 mx_proto_id, UINT32 mx_chan_id,
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tBTM_SEC_CALLBACK *p_callback, void *p_ref_data);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_bond_cancel_complete (void);
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec);
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8    btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN         btm_sec_are_all_trusted(UINT32 p_mask[]);
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle);
907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8           btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state);
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT32 mx_chan_id);
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec);
987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec);
997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec);
1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec);
101899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0 (UINT16 psm);
102899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16  btm_sec_set_serv_level4_flags (UINT16 cur_security, BOOLEAN is_originator);
1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request  (BD_ADDR bd_addr, tBT_TRANSPORT transport,
105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data);
106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT transport) ;
107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable);
109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_acceptor_rejects_bonding (tBTM_SEC_DEV_REC *p_dev_rec);
110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec);
112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec);
1137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE - authenticated link key is possible */
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] =
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*   OUT,    IO,     IN,     NONE */
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* OUT  */ {FALSE,  FALSE,  TRUE,   FALSE},
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IO   */ {FALSE,  TRUE,   TRUE,   FALSE},
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IN   */ {TRUE,   TRUE,   TRUE,   FALSE},
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* NONE */ {FALSE,  FALSE,  FALSE,  FALSE}
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_OUT      0   DisplayOnly */
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_IO       1   DisplayYesNo */
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_IN       2   KeyboardOnly */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_NONE     3   NoInputNoOutput */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_authenticated
1317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is authenticated
1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec)
1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)
1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_encrypted
1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is encrypted
1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec)
1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_authorized
1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is authorized
1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec)
1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_serv_trusted
1857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check service is trusted
1877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec)
1927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id))
1947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
2017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecRegister
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Application manager calls this function to register for
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  security services.  There can be one and only one application
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  saving link keys.  BTM allows only first registration.
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
211f8027005333c88a2f097cfd70d15c3d54c7764aeChris MantonBOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info)
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      temp_value = {0};
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
217f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s application registered", __func__);
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
220f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    LOG_INFO("%s p_cb_info->p_le_callback == 0x%p", __func__, p_cb_info->p_le_callback);
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb_info->p_le_callback)
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
223f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#if SMP_INCLUDED == TRUE
224f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__);
225f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      SMP_Register(btm_proc_smp_cback);
226f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#endif
227f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      /* if no IR is loaded, need to regenerate all the keys */
228f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0)
229f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      {
230f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton        btm_ble_reset_id();
231f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      }
232f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    }
233f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    else
234f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    {
235f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      LOG_WARN("%s p_cb_info->p_le_callback == NULL", __func__);
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.api = *p_cb_info;
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
241f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton     LOG_INFO("%s btm_cb.api.p_le_callback = 0x%p ", __func__, btm_cb.api.p_le_callback);
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
243f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s application registered", __func__);
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecAddRmtNameNotifyCallback
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can register to be notified when name of the
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote device is resolved.
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == NULL)
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = p_callback;
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecDeleteRmtNameNotifyCallback
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can deregister notification when a new Link Key
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is generated per connection.
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if OK, else FALSE
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == p_callback)
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = NULL;
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetSecurityFlags
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get security flags for the device
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BOOLEAN TRUE or FALSE is device found
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags)
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
3167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
3177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
3185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
3197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
3207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
3217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
3237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_GetSecurityFlagsByTransport
3257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Get security flags for the device on a particular transport
3277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE is device found
3297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
3317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags,
3327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                tBT_TRANSPORT transport)
3337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
3347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec;
3357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
3377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
3387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (transport == BT_TRANSPORT_BR_EDR)
3397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
3407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
3417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8);
3427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPinType
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set PIN type for the device.
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len)
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pin_type, (char *) pin_code, pin_code_len);
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If device is not up security mode will be set as a part of startup */
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.cfg.pin_type != pin_type)
36530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson         && controller_get_interface()->get_is_ready() )
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (pin_type);
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_type     = pin_type;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_code_len = pin_code_len;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPairableMode
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Enable or disable pairing
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       allow_pairing - (TRUE or FALSE) whether or not the device
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      allows pairing.
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connect_only_paired - (TRUE or FALSE) whether or not to
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      only allow paired devices to connect.
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired)
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPairableMode()  allow_pairing: %u   connect_only_paired: %u", allow_pairing, connect_only_paired);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_disabled    = !allow_pairing;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.connect_only_paired = connect_only_paired;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
398899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_SetSecureConnectionsOnly
400899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      Enable or disable default treatment for Mode 4 Level 0 services
402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameter        secure_connections_only_mode - (TRUE or FALSE) whether or not the device
404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  TRUE means that the device should treat Mode 4 Level 0 services as
405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  services of other levels. (Secure_connections_only_mode)
406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  FALSE means that the device should provide default treatment for
407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  Mode 4 Level 0 services.
408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
409899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
411899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode)
413899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: Mode : %u", __FUNCTION__,
415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                   secure_connections_only_mode);
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    btm_cb.devcb.secure_connections_only = secure_connections_only_mode;
418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES   ((UINT16) 0xffff)
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetSecurityLevel
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      is_originator - TRUE if originating the connection, FALSE if not
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id,
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT32 mx_chan_id)
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    CONNECTION_TYPE conn_type;
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_ORIG;
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_TERM;
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (conn_type, p_name, service_id,
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (is_originator, p_name, service_id,
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_set_security_level
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      conn_type   - TRUE if originating the connection, FALSE if not
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT32 mx_chan_id)
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               index;
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               first_unused_record = BTM_NO_AVAIL_SEC_SERVICES;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              record_allocated = FALSE;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_originator;
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_ucd;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_CONNLESS_MASK )
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = TRUE;
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = FALSE;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if the record can be reused (same service name, psm, mx_proto_id,
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       service_id, and mx_chan_id), or obtain the next unused record */
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec = &btm_cb.sec_serv_rec[0];
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++)
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if there is already a record for this service */
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_srec->security_flags & BTM_SEC_IN_USE)
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id    &&
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (!strncmp (p_name, (char *) p_srec->orig_service_name,
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN) ||
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 !strncmp (p_name, (char *) p_srec->term_service_name,
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN)))
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id)
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                record_allocated = TRUE;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark the first available service record */
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (!record_allocated)
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC));
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            record_allocated = TRUE;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            first_unused_record = index;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!record_allocated)
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)",  BTM_SEC_MAX_SERVICE_RECORDS);
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(record_allocated);
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Process the request if service record is valid */
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If a duplicate service wasn't found, use the first available */
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (index >= BTM_SEC_MAX_SERVICE_RECORDS)
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        index = first_unused_record;
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec = &btm_cb.sec_serv_rec[index];
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->psm         = psm;
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->service_id  = service_id;
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->mx_proto_id = mx_proto_id;
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->orig_mx_chan_id = mx_chan_id;
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S ((char *)p_srec->orig_service_name, sizeof(p_srec->orig_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Originator should not set requirements for incoming connections */
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM);
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
589899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
590899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
591899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_OUT_AUTHENTICATE)
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_OUT_MITM;
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_OUT_ENCRYPT)
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_OUT_AUTHENTICATE;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* outgoing connections usually set the security level right before
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * the connection is initiated.
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * set it to be the outgoing service */
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd == FALSE )
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_srec;
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->term_mx_chan_id = mx_chan_id;
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S ((char *)p_srec->term_service_name, sizeof(p_srec->term_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN);
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Acceptor should not set requirements for outgoing connections */
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM);
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
636899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
637899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
638899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_IN_AUTHENTICATE)
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_IN_MITM;
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_IN_ENCRYPT)
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_IN_AUTHENTICATE;
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_ucd )
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags     |= (UINT16)(BTM_SEC_IN_USE);
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, conn_type, psm, mx_proto_id, mx_chan_id);
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_srec->ucd_security_flags);
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
6675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : service name [%s] (up to %d chars saved)",
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_name, BTM_SEC_SERVICE_NAME_LEN);
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, is_originator, psm, mx_proto_id, mx_chan_id);
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
6775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : sec: 0x%x, service name [%s] (up to %d chars saved)",
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN);
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(record_allocated);
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecClrService
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record(s) from the security database.
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified name are removed.
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used only by devices with limited RAM so that it can
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  reuse an old security service record.
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Note: Unpredictable results may occur if a service is cleared
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      that is still in use by an application/profile.
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id)
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) &&
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (!service_id || (service_id == p_srec->service_id)))
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id);
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags = 0;
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clr_service_by_psm
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record from the security database.
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified psm are removed.
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used by L2CAP to free up the service record used
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by dynamic PSM clients when the channel is closed.
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The given psm must be a virtual psm.
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm)
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) )
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
767ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_clr_temp_auth_service
768ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
769ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Removes specified device record's temporary authorization
770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  flag from the security database.
771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters       Device address to be cleared
773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void.
775ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
776ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda)
778ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
779ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC   *p_dev_rec;
780ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
781ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bda)) == NULL)
782ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
7835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB");
784ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
786ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
787ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */
788ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service)
789ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
7905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
792ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID;
794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
798ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PINCodeReply
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after Security Manager submitted
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PIN code request to the UI.
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device for which PIN was requested
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res          - result of the operation BTM_SUCCESS if success
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s   PairFlags: 0x%02x  PinLen:%d  Result:%d",
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res);
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr");
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB");
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) )
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) ||
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) )
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (bd_addr);
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags   |= BTM_SEC_LINK_KEY_AUTHED;
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.security_mode_changed == FALSE) )
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is start of the dedicated bonding if local device is 2.0 */
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = TRUE;
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable (TRUE);
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = 0xff ;
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*  before originating  */
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we change state little bit early so btm_sec_connected() will originate connection */
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*   when existing ACL link is down completely */
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we already accepted incoming connection from pairing device */
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.api.p_auth_complete_callback)
9017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_SUCCESS;
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
9115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len);
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if this was not pre-fetched, save the PIN */
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len == 0)
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pin_code_len_saved = pin_len;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin);
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_sec_bond_by_transport
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      this is the bond function that will start either SSP or SMP.
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device to bond
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Note: After 2.1 parameters are not used and preserved here not to change API
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
9347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                       UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS      status;
9383aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            *p_features;
9393aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            ii;
9407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN        *p= btm_bda_to_acl(bd_addr, transport);
9415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x",
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport);
9457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Other security process is in progress */
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9546975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL)
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9566975b4d711142b885af479721cada448952c6b41Andre Eisenbach        return(BTM_NO_RESOURCES);
9577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Finished if connection is active and already paired */
9627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR
9637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
9647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
9657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE
9667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))
9677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
9687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         )
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9715344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SecBond -> Already Paired");
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell controller to get rid of the link key if it has one stored */
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS)
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the PIN code if we got a valid one */
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0))
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN);
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN);
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD;
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE;
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = TRUE;
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9956975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
9967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
998e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        btm_ble_init_pseudo_addr (p_dev_rec, bd_addr);
9997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK;
10007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1001ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (SMP_Pair(bd_addr) == SMP_STARTED)
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
10057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_CMD_STARTED;
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.pairing_flags = 0;
10107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(BTM_NO_RESOURCES);
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
10157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  | BTM_SEC_ROLE_SWITCHED  | BTM_SEC_LINK_KEY_AUTHED);
10167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
101930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing())
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* The special case when we authenticate keyboard.  Set pin type to fixed */
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* It would be probably better to do it from the application, but it is */
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* complicated */
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED))
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pin_type_changed = TRUE;
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED);
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10333aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++)
10343aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    {
10353aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        p_features = p_dev_rec->features[ii];
10365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("  remote_features page[%1d] = %02x-%02x-%02x-%02x",
10373aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                         ii, p_features[0], p_features[1], p_features[2], p_features[3]);
10385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("                              %02x-%02x-%02x-%02x",
10393aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                             p_features[4], p_features[5], p_features[6], p_features[7]);
10403aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    }
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x  HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN;
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection already exists... */
10497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE)
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark lcb as bonding */
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (bd_addr, TRUE);
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
106230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing()
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->sm4 == BTM_SM4_KNOWN))
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( btm_sec_check_prefetch_pin (p_dev_rec) )
1066899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1068899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
1069899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
1070899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
1071899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local is 2.1 and peer is unknown */
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0)
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we are not accepting connection request from peer
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * -> RNR (to learn if peer is 2.1)
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
10807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We are accepting connection request from peer */
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d",
10887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_CMD_STARTED;
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* both local and peer are 2.1  */
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_dd_create_conn(p_dev_rec);
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
11047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBondByTransport
11067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  transport    - doing SSP over BR/EDR or SMP over LE
11137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
11207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                    UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE
11237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_DEVICE_TYPE     dev_type;
11247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBLE_ADDR_TYPE      addr_type;
11257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
11267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
11277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* LE device, do SMP pairing */
11287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) ||
11297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0))
11307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
11317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_ILLEGAL_ACTION;
11327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
11337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
11347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
11357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBond
11407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
11557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (BTM_UseLeLink(bd_addr))
11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        transport = BT_TRANSPORT_LE;
11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecBondCancel
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to cancel ongoing bonding process
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with peer device.
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the peer device
11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                         transport    - FALSE for BR/EDR link; TRUE for LE link
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr)
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SecBondCancel()  State: %s flags:0x%x",
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags);
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_UNKNOWN_ADDR;
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
11847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE)
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING)
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("Cancel LE pairing");
11897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (SMP_PairCancel(bd_addr))
11907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
11917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return BTM_CMD_STARTED;
11927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_WRONG_MODE;
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags)
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* pre-fetching pin for dedicated bonding */
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_bond_cancel_complete();
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_SUCCESS;
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this BDA is in a bonding procedure */
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the HCI link is up */
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If some other thread disconnecting, we do not send second command */
1215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) ||
1216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH))
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_CMD_STARTED);
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link was set up by Bonding process */
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_update_lcb_4_bonding(bd_addr, FALSE);
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /*HCI link is not up */
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link creation was started by Bonding process */
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btsnd_hcic_create_conn_cancel(bd_addr))
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return BTM_CMD_STARTED;
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_NO_RESOURCES;
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1237ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
1238ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
1239ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                BTM_CancelRemoteDeviceName();
1240ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD;
1241ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return BTM_CMD_STARTED;
1242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_WRONG_MODE;
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecGetDeviceLinkKey
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to obtain link key for the device
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  it returns BTM_SUCCESS if link key is available, or
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the device or device record does not contain link key info
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  link_key     - Link Key is copied into this array
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key)
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN);
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_UNKNOWN_ADDR);
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         BTM_SecGetDeviceLinkKeyType
1279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to obtain link key type for the
1281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  device.
1282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  it returns BTM_SUCCESS if link key is available, or
1283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
1284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the device or device record does not contain link key info
1285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1286444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          BTM_LKEY_TYPE_IGNORE if link key is unknown, link type
1287444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  otherwise.
1288444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1290444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr)
1291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
1295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return p_dev_rec->link_key_type;
1297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return BTM_LKEY_TYPE_IGNORE;
1299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetEncryption
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to ensure that connection is
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  encrypted.  Should be called only on an open connection.
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically only needed for connections that first want to
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bring up unencrypted links, then later encrypt them.
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed.  Can be set to NULL
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  if status is not desired.
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - pointer to any data the caller wishes to receive
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  in the callback function upon completion.
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*                                   can be set to NULL if not used.
1318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  transport  -    TRUE to encryption the link over LE transport
1319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                                  or FALSE for BR/EDR transport
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS   - already encrypted
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_PENDING   - command will be returned in the callback
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE- connection not up.
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY      - security procedures are currently active
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MODE_UNSUPPORTED - if security manager not linked in.
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback,
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               void *p_ref_data)
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS rc = 0;
13327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
13347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!p_dev_rec ||
13357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
13367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
13377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)
13387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
13397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        )
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Connection should be up and runnning */
13425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected");
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
13457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE);
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_BR_EDR &&
13517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags &  BTM_SEC_ENCRYPTED))
13527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
13537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         || (transport == BT_TRANSPORT_LE &&
13547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta           (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED))
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta          )
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted");
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
13617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* enqueue security request if security is active */
1367444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE))
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request");
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1371444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data))
1372444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1373444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_CMD_STARTED;
1374444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1375444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1376444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (p_callback)
1378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES);
1379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_NO_RESOURCES;
1380444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = FALSE;
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->security_required);
13917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
13937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1395444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tACL_CONN *p = btm_bda_to_acl(bd_addr, transport);
1396444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p)
1397444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1398444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role);
1399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1400444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            rc = BTM_WRONG_MODE;
1403444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", __FUNCTION__);
1404444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = btm_sec_execute_procedure (p_dev_rec);
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (rc != BTM_CMD_STARTED && rc != BTM_BUSY)
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
14157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc);
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet.
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle)
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8       old_state = p_dev_rec->sec_state;
1428ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS status = BTM_CMD_STARTED;
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect:  handle:0x%x, reason=0x%x",
14317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                      conn_handle, reason);
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* send HCI_Disconnect on a transport only once */
1434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    switch (old_state)
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING:
1437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->hci_handle)
1438444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
14427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
1444444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BLE:
1445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->ble_hci_handle)
1446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
1447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
1450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BOTH:
1452444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return status;
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1454444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1455444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        default:
1456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ?
1457444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
1458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */
1463444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle)
1464444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
1466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji              p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
1467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        status = BTM_SUCCESS;
1468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Tear down the HCI link */
1470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else if (!btsnd_hcic_disconnect (conn_handle, reason))
1471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         /* could not send disconnect. restore old state */
1473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         p_dev_rec->sec_state = old_state;
1474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         status = BTM_NO_RESOURCES;
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return status;
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ConfirmReqReply
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to confirm the numeric value for
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_CFM_REQ_EVT
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res           - result of the operation BTM_SUCCESS if success
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr       - Address of the peer device
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr)
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14955344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s  Res: %u",
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM)
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) )
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (res == BTM_SUCCESS)
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, TRUE);
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, FALSE);
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**
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PasskeyReqReply
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the passkey for
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_KEY_REQ_EVT
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res     - result of the operation BTM_SUCCESS if success
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr - Address of the peer device
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey - numeric value in the range of
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey)
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s  res:%d",
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), res);
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) )
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1553444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1554444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec != NULL)
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
15597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_SecBondCancel(bd_addr);
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN);
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY)
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (passkey > BTM_MAX_PASSKEY_VAL)
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply (bd_addr);
1582444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_reply (bd_addr, passkey);
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SendKeypressNotif
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is used during the passkey entry model
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by a device with KeyboardOnly IO capabilities
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (very likely to be a HID Device).
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is called by a HID Device to inform the remote device when
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a key has been entered or erased.
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type - notification type
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type)
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This API only make sense between PASSKEY_REQ and SP complete */
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY)
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_send_keypress_notif (bd_addr, type);
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_IoCapRsp
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called in response to BTM_SP_IO_REQ_EVT
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by the tBTM_SP_CALLBACK implementation, this function is
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  called to provide the actual response
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  io_cap  - The IO capability of local device.
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  oob     - BTM_OOB_NONE or BTM_OOB_PRESENT.
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  auth_req- MITM protection required or not.
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req)
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s  oob: %d io_cap: %d",
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap);
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS)
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX)
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = auth_req;
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = io_cap;
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT));
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req);
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadLocalOobData
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local OOB data from
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  LM
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void)
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_SUCCESS;
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_read_local_oob_data() == FALSE)
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_NO_RESOURCES;
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_RemoteOobDataReply
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the remote OOB data for
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_RMT_OOB_EVT
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr     - Address of the peer device
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c           - simple pairing Hash C.
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r           - simple pairing Randomizer  C.
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r)
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1681444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() - State: %s res: %d", __func__,
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP)
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_neg_reply (bd_addr);
1695444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_reply (bd_addr, c, r);
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BuildOobData
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to build the OOB data payload to
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  be sent over OOB (non-Bluetooth) link
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_len - p_data size.
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c       - simple pairing Hash C.
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r       - simple pairing Randomizer  C.
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  name_len- 0, local device name would not be included.
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            otherwise, the local device name is included for
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            up to this specified length
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of bytes in p_data.
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c,
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BT_OCTET16 r, UINT8 name_len)
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len = 0;
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  name_size;
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE)
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mandatory part */
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
173330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson        BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address);
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = BTM_OOB_MANDATORY_SIZE;
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_len -= len;
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* now optional part */
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Hash C */
1741444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        UINT16 delta = BTM_OOB_HASH_C_SIZE + 2;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_HASH_C_SIZE + 1;
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE;
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE);
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Rand R */
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_RAND_R_SIZE + 2;
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_RAND_R_SIZE + 1;
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE;
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE);
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add class of device */
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_COD_SIZE + 2;
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_COD_SIZE + 1;
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_COD_TYPE;
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class);
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        name_size = name_len;
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (name_size > strlen(btm_cb.cfg.bd_name))
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_size = (UINT16)strlen(btm_cb.cfg.bd_name);
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = name_size + 2;
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_size + 1;
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_type;
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size);
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update len */
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p_data;
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1798899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_BothEndsSupportSecureConnections
1799444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1800899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if both the local device and the peer device
1801899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  specified by bd_addr support BR/EDR Secure Connections.
1802444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1803899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1804899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1805899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by both local
1806899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  and the remote device.
1807899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1810899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr)
1811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1812899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return ((controller_get_interface()->supports_secure_connections()) &&
1813899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_PeerSupportsSecureConnections(bd_addr)));
1814899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
1815899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1816899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
1817899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1818899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_PeerSupportsSecureConnections
1819899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1820899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the peer supports
1821899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  BR/EDR Secure Connections.
1822899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1823899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1824899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1825899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by the peer,
1826899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1827899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1828899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
1829899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr)
1830899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
1831899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    tBTM_SEC_DEV_REC    *p_dev_rec;
1832899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1833899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL)
1834899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
1835899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x", __FUNCTION__,
1836899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3],
1837899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[4]<< 8) + bd_addr[5]);
1838899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return FALSE;
1839899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
1840899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1841899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return (p_dev_rec->remote_supports_secure_connections);
1842444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadOobData
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to parse the OOB data payload
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received over OOB (non-Bluetooth) link
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  eir_tag - The associated EIR tag to read the data.
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  *p_len(output) - the length of the data with the given tag.
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the beginning of the data with the given tag.
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  NULL, if the tag is not found.
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len)
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  max_len;
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   len, type;
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_ret = NULL;
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   ret_len = 0;
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data)
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(max_len, p);
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= BTM_OOB_MANDATORY_SIZE)
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag)
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ret = p; /* the location for bd_addr */
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ret_len = BTM_OOB_BD_ADDR_SIZE;
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += BD_ADDR_LEN;
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                max_len -= BTM_OOB_MANDATORY_SIZE;
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* now the optional data in EIR format */
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                while (max_len > 0)
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len     = *p++; /* tag data len + 1 */
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    type    = *p++;
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (eir_tag == type)
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_ret = p;
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        ret_len = len - 1;
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* the data size of this tag is len + 1 (tag data len + 2) */
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (max_len > len)
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len -= len;
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len--;
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        len--;
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p += len;
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len = 0;
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_len)
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = ret_len;
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ret;
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetOutService
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the service for
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  outgoing connections.
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the profile/application calls BTM_SetSecurityLevel
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  before initiating a connection, this function does not
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  need to be called.
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id)
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_out_serv = p_serv_rec;
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (bd_addr);
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->service_id == service_id)
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->orig_mx_chan_id == mx_chan_id))
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
19435738f83aeb59361a0a2eda2460113f6dc919427The 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);
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_serv_rec;
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec)
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->p_cur_service = p_serv_rec;
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**              I N T E R N A L     F U N C T I O N S
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1957ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_upgrade_possible
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1959ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function returns TRUE if the existing link key
1960ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  can be upgraded or if the link key does not exist.
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1962ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          BOOLEAN
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1965ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM;
1968ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN             is_possible = TRUE;
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1972ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        is_possible = FALSE;
19737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if(p_dev_rec->p_cur_service)
19747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1975444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x",
1976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type,
1977444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags);
19787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
19797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
19807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x",
1982444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check);
19837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Already have a link key to the connected peer. Is the link key secure enough?
19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** Is a link key upgrade even possible?
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
1987899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & mtm_check)    /* needs MITM */
1988899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) ||
1989899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256))
1990899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* has unauthenticated
1991899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key */
1992899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX)  /* a valid peer IO cap */
1993899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps]))
1994899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* authenticated
1995899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key is possible */
19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* upgrade is possible: check if the application wants the upgrade.
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * If the application is configured to use a global MITM flag,
19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * it probably would not want to upgrade the link key based on the security level database */
2000ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            is_possible = TRUE;
2001ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2002ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, p_dev_rec->sec_flags);
2004ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return is_possible;
2005ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2007ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
2008ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2009ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_check_upgrade
2010ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2011ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function is called to check if the existing link key
2012ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  needs to be upgraded.
2013ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2014ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
2015ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2016ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
2017ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
2018ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
2021ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2022ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Only check if link key already exists */
2023ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
2024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
2025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2026ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE)
2027ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
20285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
2029ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* upgrade is possible: check if the application wants the upgrade.
2030ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * If the application is configured to use a global MITM flag,
2031ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * it probably would not want to upgrade the link key based on the security level database */
2032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SP_UPGRADE evt_data;
2033ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
2034ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_data.upgrade = TRUE;
2035ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btm_cb.api.p_sp_callback)
2036ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
2037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade);
2039ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (evt_data.upgrade)
2040ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* if the application confirms the upgrade, set the upgrade bit */
2042ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2043ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Clear the link key known to go through authentication/pairing again */
2045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
2046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED;
20475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags);
20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_l2cap_access_req
20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP to grant permission to
20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establish L2CAP connection to or from the peer device.
20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are complete. MUST NOT BE NULL.
20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tBTM_STATUS
20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_OUT_FLAGS   (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHORIZE)
20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_IN_FLAGS    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)
20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2073899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_OUT_LEVEL4_FLAGS   (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | \
2074899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                    BTM_SEC_OUT_MITM | BTM_SEC_MODE4_LEVEL4)
2075899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2076899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_IN_LEVEL4_FLAGS    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | \
2077899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                    BTM_SEC_IN_MITM | BTM_SEC_MODE4_LEVEL4)
2078899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle,
20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      CONNECTION_TYPE conn_type,
20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      tBTM_SEC_CALLBACK *p_callback,
20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      void *p_ref_data)
20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         security_required;
20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         old_security_required;
20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       old_is_originator;
20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS   rc = BTM_SUCCESS;
20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       chk_acp_auth_done = FALSE;
20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
20927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN     transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */
20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2100444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, p_ref_data);
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator:%d, 0x%x", __func__, is_originator, p_ref_data);
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_first_serv (conn_type, psm);
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("%s() PSM: %d no application registerd", __func__, psm);
21197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_MODE_UNSUPPORTED);
21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2123899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Services level0 by default have no security */
2124899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only))
21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY);
21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2132899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2133899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2134899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags,
2135899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                               is_originator);
2136899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2137899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2138899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2139899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->ucd_security_flags;
2140899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_originator)
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
21475738f83aeb59361a0a2eda2460113f6dc919427The 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))) ||
21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rc = BTM_SUCCESS;
21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
21575738f83aeb59361a0a2eda2460113f6dc919427The 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))) ||
21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rc = BTM_SUCCESS;
21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2164899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2165899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2166899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2167899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2168899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2169899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (rc == BTM_SUCCESS)
21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_callback)
21737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2184899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                                is_originator);
2185899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2186899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2187899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2188899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->security_flags;
2189899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2190899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2191899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2192899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm  0x%04x",
2193899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    __FUNCTION__, security_required, is_originator, psm);
2194899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2195899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4))
2196899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2197899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */
2199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d",
2202899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "rmt_support_for_sc : %d -> fail pairing", __FUNCTION__,
2203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc,
2204899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            p_dev_rec->remote_supports_secure_connections);
2205899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2206899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2207899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                    BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2208899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2209899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2210899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto KRZR) which connects to several services at the same time */
22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2217444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed  state: %s mode:%d, sm4:0x%x", __func__,
2218ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                          psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4);
22195344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
2221899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2222899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2223899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2224899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2225899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2226899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2228ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2229ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (is_originator)
22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
22337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
22347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) ||
22357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec)  && btm_dev_encrypted(p_dev_rec))) )
22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rc = BTM_SUCCESS;
22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
22437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) ||
22447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) ||
22457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))))
22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rc = BTM_SUCCESS;
22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2254899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2255899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2256899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2257899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2258899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2259899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (rc == BTM_SUCCESS)
22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_callback)
22637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_SUCCESS);
22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.sec_req_pending = TRUE;
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save pointer to service record */
22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service = p_serv_rec;
22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2275899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */
2276899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2277899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2278899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2280899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2282899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (is_originator)
22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT);
22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2287899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else /* acceptor */
22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */
22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                chk_acp_auth_done = TRUE;
22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
2293899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth           }
2294899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2295899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4))
2296899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2297899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the remote features are not known yet */
2298899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", __FUNCTION__,
2299899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags);
23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2301899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sm4 |= BTM_SM4_REQ_PEND;
2302899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()  sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__,
23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done);
23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_security_required        = p_dev_rec->security_required;
23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_is_originator            = p_dev_rec->is_originator;
23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = security_required;
23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = TRUE;
23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = FALSE;
23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are multiple service records used through the same PSM */
23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* leave security decision for the multiplexor on the top */
23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */
23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!BTM_SEC_IS_SM4(p_dev_rec->sm4))
23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pre-Lisbon: restore the old settings */
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = old_security_required;
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->is_originator     = old_is_originator;
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2345899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* if the originator is using dynamic PSM in legacy mode, do not start any security process now
2346899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * The layer above L2CAP needs to carry out the security requirement after L2CAP connect
2347899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * response is received */
2348899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (is_originator &&
2349899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2350899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2351899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2352899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2353899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001))
23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* restore the old settings */
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required = old_security_required;
23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_originator     = old_is_originator;
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (chk_acp_auth_done)
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED));
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SM4, but we do not know for sure which level of security we need.
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * as long as we have a link key, it's OK */
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rc = BTM_DELAY_CHECK;
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            because of data path issues. Delay this disconnect a little bit
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
2379f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            LOG_INFO("%s peer should have initiated security process by now (SM4 to SM4)", __func__);
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback        = p_callback;
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state         = BTM_SEC_STATE_DELAY_FOR_ENC;
23827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, rc);
23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_SUCCESS;
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2390ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
2391ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id)
2392ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2393ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Although authentication and encryption are per connection
2394ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** authorization is per access request.  For example when serial connection
2395ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** is up and authorized and client requests to read file (access to other
2396ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** scn), we need to request user's permission again.
2397ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        */
2398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED;
2399ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2409899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2411899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      BTM_SEC_AUTHENTICATED);
2413899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2416899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* If we already have a link key to the connected peer, is it secure enough? */
2418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_check_upgrade(p_dev_rec, is_originator);
2419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d",
2423444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2424444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
24297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc);
24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_mx_access_request
24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by all Multiplexing Protocols during
24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establishing connection to or from peer device to grant
24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  permission to establish application connection.
24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id   - protocol ID of the multiplexer
24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id    - multiplexer channel to reach application
24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed
24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - Pointer to any reference data needed by the
24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  the callback function.
24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED
24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator,
24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       UINT32 mx_proto_id, UINT32 mx_chan_id,
24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS        rc;
2465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16             security_required;
24667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN transport   = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */
24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator: %d", __func__, is_originator);
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id);
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
24797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id);
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NO_RESOURCES;
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2486899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm)))
2487899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2488899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2489899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                           is_originator);
2490899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2491899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
2492899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2493899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = p_serv_rec->security_flags;
2494899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2495899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto phone) which connects to several services at the same time */
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed  state: %s", __func__,
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state));
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2503ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rc = BTM_CMD_STARTED;
2504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2505899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2506899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2507899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2508899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2509899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2510899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
2511ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
2514ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (is_originator)
2515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2516ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
25177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2519ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2521ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    rc = BTM_SUCCESS;
2522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2523ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2524ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
2525ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
25277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2532ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2533ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2534ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    rc = BTM_SUCCESS;
2535ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2537899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2538899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2539899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2540899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2541899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2542899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2543899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2544899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (rc == BTM_SUCCESS)
2545899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2546899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __FUNCTION__);
2547899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */
2548899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* btm_sec_execute_procedure */
2549899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) ||
2550899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE)))
2551899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2552899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_EVENT("%s: still need authorization", __FUNCTION__);
2553899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2554899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2555899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2556899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2557899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Check whether there is a pending security procedure, if so we should always queue */
2558899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* the new security request */
2559899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)
2560899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: There is a pending security procedure", __FUNCTION__);
2562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (rc == BTM_CMD_STARTED)
2565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2566899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __FUNCTION__);
2567899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_queue_mx_request (bd_addr, psm,  is_originator, mx_proto_id,
2568899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      mx_chan_id, p_callback, p_ref_data);
2569899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2570899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else /* rc == BTM_SUCCESS */
2571899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2572899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* access granted */
2573899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             if (p_callback)
2574899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2575899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc);
2576899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2577899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2578899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2579899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __FUNCTION__, rc,
2580899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                          btm_pair_state_descr(btm_cb.pairing_state));
2581899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return rc;
2582899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2583899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2584899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) ||
2585899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (btm_cb.security_mode == BTM_SEC_MODE_SC)))
2586899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2587899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2588899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives service connection establishment Request for */
2589899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Secure Connections Only service */
2590899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2591899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2592899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,",
2593899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "remote_support_for_sc %d: fail pairing",__FUNCTION__,
2594899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
2595899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2596899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2597899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2598899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                               BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2599899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2600899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
26025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service     = p_serv_rec;
2605899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    p_dev_rec->security_required = security_required;
26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2609899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2613899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2614899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2615899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2616899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2617899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2618899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                {
2619899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2620899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                }
2621899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2622899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2623899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                          BTM_SEC_AUTHENTICATED);
2624899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2625899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2626899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
2627899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2628899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* If we already have a link key, check if that link key is good enough */
2629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                btm_sec_check_upgrade(p_dev_rec, is_originator);
2630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Although authentication and encryption are per connection */
26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization is per access request.  For example when serial connection */
26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* is up and authorized and client requests to read file (access to other */
26415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* scn, we need to request user's permission again. */
26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED);
26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2644444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
2645444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2646444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
26537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc);
26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rc;
26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_conn_req
26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when the peer device is requesting
26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc)
26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bda);
26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some device may request a connection before we are done with the HCI_Reset sequence */
267530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->get_is_ready())
26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: connect request when device not ready");
26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Security guys wants us not to allow connection from not paired devices */
26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection is allowed for only paired devices */
26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.connect_only_paired)
26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device");
26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE
26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If non-discoverable, only allow known devices to connect */
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE)
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from not paired device");
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN)))
27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27125344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device");
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* incoming connection from bonding device is rejected */
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT;
27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Host is not interested or approved connection.  Save BDA and DC and */
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* pass request to L2CAP */
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN);
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_dc,  dc,  DEV_CLASS_LEN);
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2c_link_hci_conn_req (bda))
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* accept the connection -> allocate a device record */
27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec)
27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 |= BTM_SM4_CONN_PEND;
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_bond_cancel_complete
27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to report bond cancel complete
27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void)
27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) ||
27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
2755ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) ||
2756ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME &&
2757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta          BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags))
27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* for dedicated bonding in legacy mode, authentication happens at "link level"
27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * btm_sec_connected is called with failed status.
27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * In theory, the code that handles is_pairing_device/TRUE should clean out security related code.
27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * However, this function may clean out the security related flags and btm_sec_connected would not know
27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * this function also needs to do proper clean up.
27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         */
27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL)
27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify application that the cancel succeeded */
27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_bond_cancel_cmpl_callback)
27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS);
27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_create_conn_cancel_complete
27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the command complete message
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the HCI for the create connection cancel
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command.
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p)
27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       status;
27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (status, p);
27915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s  status:%d",
27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), status);
27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if the create conn cancel cmd was issued by the bond cancel,
27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the application needs to be notified that bond cancel succeeded
27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (status)
27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_SUCCESS:
28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_CONNECTION_EXISTS:
28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_NO_CONNECTION:
28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify application of the error */
28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_bond_cancel_cmpl_callback)
28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING);
28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_check_pending_reqs
28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called at the end of the security procedure
28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to let L2CAP and RFCOMM know to re-submit any pending requests
28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void)
28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_QUEUE_ENTRY    *p_e;
28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BUFFER_Q                bq;
28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First, resubmit L2CAP requests */
28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.sec_req_pending)
28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.sec_req_pending = FALSE;
28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (NULL);
28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Now, re-submit anything in the mux queue */
28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bq = btm_cb.sec_pending_q;
28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_init_q (&btm_cb.sec_pending_q);
28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL)
28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check that the ACL is still up before starting security procedures */
2844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL)
28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_e->psm != 0)
2847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u",
2849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    __FUNCTION__, p_e->psm, p_e->is_orig,
2850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    p_e->mx_proto_id, p_e->mx_chan_id);
28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2852444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig,
28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->mx_proto_id, p_e->mx_chan_id,
28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->p_callback, p_e->p_ref_data);
2855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
2856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else
2857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback,
2859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                      p_e->p_ref_data);
2860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf (p_e);
28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
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_init
28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is on the SEC startup
28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_init (UINT8 sec_mode)
28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.security_mode = sec_mode;
28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN);
28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY;
28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_device_down
28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called when device is disabled or
28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  turned off
28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void)
28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2896444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() State: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_reset
29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called after device reset
29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void)
29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
291130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (controller_get_interface()->supports_simple_pairing())
29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set the default IO capabilities */
29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS;
29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mx service to use no security */
29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX,
29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0);
29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode = BTM_SEC_MODE_SERVICE;
29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_abort_access_req
29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP or RFCOMM to abort
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the pending operation.
29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr)
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING)
29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING))
29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback = NULL;
29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dd_create_conn
29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to create the ACL connection for
29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the dedicated boding process
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 Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec)
29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB         *p_lcb;
29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure an L2cap link control block is available */
29697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL)
29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29715344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up the control block to indicated dedicated bonding */
29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed create  [%02x%02x%02x%02x%02x%02x]",
29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_lcb(p_lcb);
29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_update_busy_level (BTM_BLI_PAGE_EVT);
29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_name_request_complete
30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when remote name was obtained from
30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer device
30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status)
30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int              i;
30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DEV_CLASS        dev_class;
30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sec_state;
30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30195344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete");
30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda))
30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr)))
30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_acl_resubmit_page();
30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If remote name request failed, p_bd_addr is null and we need to search */
30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* based on state assuming that we are doing 1 at a time */
30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bd_addr)
30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = btm_find_dev (p_bd_addr);
30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = &btm_cb.sec_dev_rec[0];
30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE)
30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME))
30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_bd_addr = p_dev_rec->bd_addr;
30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (i == BTM_SEC_MAX_DEVICE_RECORDS)
30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = NULL;
30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_bd_name)
30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bd_name = (UINT8 *)"";
30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d State:%d  p_dev_rec: 0x%08x ",
30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status, p_dev_rec->sec_state, p_dev_rec);
30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d",
30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status);
30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        old_sec_state = p_dev_rec->sec_state;
30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN);
30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
30765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */
30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_bd_name[0] = 0;
30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)
30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved */
30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3090831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class,
30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                 p_dev_rec->sec_bd_name);
30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[0] = 0;
30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[1] = 0;
30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[2] = 0;
31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved even if not found so clients can continue */
31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3104831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)"");
31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we were delaying asking UI for a PIN because name was not resolved, ask now */
31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr
31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) )
31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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);
31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) &&
31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) &&
31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_pin_callback)
31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback");
31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name);
31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the same state again to force the timer to be restarted */
31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we were delaying bonding because name was not resolved */
31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0)
31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status);
3137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD)
3138ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
3139ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_sec_bond_cancel_complete();
3140ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return;
3141ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
3142ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != HCI_SUCCESS)
31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_cb.api.p_auth_complete_callback)
31487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
31497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                            p_dev_rec->sec_bd_name, status);
31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */
31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
31567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/
31577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* If it is set, there may be a race condition */
31585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete  IS_SM4_UNKNOWN Flags:0x%04x",
31597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                   btm_cb.pairing_flags);
31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0)
31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 |= BTM_SM4_KNOWN;
31635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
31645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__,
31677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4),
31687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4));
31697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN.
31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed)
31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec))
31745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*  before originating  */
31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
31795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection");
31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
31815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Both we and the peer are 2.1 - continue to create connection */
31825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
31835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
31845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection");
31855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
31875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    if (btm_cb.api.p_auth_complete_callback)
31895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
31905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
31965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA");
31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR);
32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if we were delaying link_key_callback because name was not resolved */
32055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->link_key_not_sent)
32065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If HCI connection complete has not arrived, wait for it */
32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
32095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = FALSE;
32125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_send_link_key_notif(p_dev_rec);
32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If its not us who perform authentication, we should tell stackserver */
32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* that some authentication has been completed                          */
32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is required when different entities receive link notification and auth complete */
32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
32215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
32225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, HCI_SUCCESS);
32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)");
32325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE);
32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
32345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (old_sec_state != BTM_SEC_STATE_GETTING_NAME)
32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If get name failed, notify the waiting layer */
32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event  (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND)
32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("waiting for remote features!!");
32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remote Name succeeded, execute the next security procedure, if any */
32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_CMD_STARTED)
32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is no next procedure or start of procedure failed, notify the waiting layer */
32617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_sec_dev_rec_cback_event  (p_dev_rec, status, FALSE);
32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_host_support_feat_evt
32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the
32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received
32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p)
32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR         bd_addr;        /* peer address */
32785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_FEATURES     features;
32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (bd_addr, p);
32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt  sm4: 0x%x  p[0]: 0x%x", p_dev_rec->sm4, p[0]);
32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 = BTM_SM4_KNOWN;
32883aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE);
32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (HCI_SSP_HOST_SUPPORTED(features))
32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 = BTM_SM4_TRUE;
32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
32965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_req
33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when LM request for the IO
33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  capability of the local device and
33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if the OOB data is present for the device in the event
33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p)
33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_REQ  evt_data;
33115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           err_code = 0;
33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         is_orig = TRUE;
33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           callback_rc = BTM_SUCCESS;
33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* setup the default response according to compile options */
33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* assume that the local IO capability does not change
33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * loc_io_caps is initialized with the default value */
33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.io_cap = btm_cb.devcb.loc_io_caps;
33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.oob_data = BTM_OOB_NONE;
33235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.auth_req = BTM_DEFAULT_AUTH_REQ;
33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3325899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s", __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state));
33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
3328899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3329899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", __FUNCTION__,
3330899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                      btm_cb.security_mode, p_dev_rec->num_read_pages);
3331899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3332899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0))
3333899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3334899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Device security mode is SC only.",
3335899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         "To continue need to know remote features.", __FUNCTION__);
3336899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3337899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = TRUE;
3338899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return;
3339899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3340899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 |= BTM_SM4_TRUE;
33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3343899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s  Flags: 0x%04x  p_cur_service: 0x%08x",
3344899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state),
3345899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     btm_cb.pairing_flags, p_dev_rec->p_cur_service);
33465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3347899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->p_cur_service)
33485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3349899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x",
3350899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, p_dev_rec->p_cur_service->psm,
3351899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         p_dev_rec->p_cur_service->security_flags);
3352899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3353899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3354899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    switch (btm_cb.pairing_state)
3355899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3356899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator connecting */
3357899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_IDLE:
3358899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //TODO: Handle Idle pairing state
3359899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //security_required = p_dev_rec->security_required;
3360899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3361899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3362899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* received IO capability response already->acceptor */
3363899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_INCOMING_SSP:
33645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_orig = FALSE;
33655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD)
3367899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3368899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* acceptor in dedicated bonding */
33695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
3370899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3371899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3372899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3373899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator, at this point it is expected to be dedicated bonding
3374899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        initiated by local device */
3375899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_WAIT_PIN_REQ:
3376899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN))
33775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3378899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
33795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
33805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3382899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                err_code = HCI_ERR_HOST_BUSY_PAIRING;
33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3384899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3385899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3386899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* any other state is unexpected */
3387899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        default:
33885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err_code = HCI_ERR_HOST_BUSY_PAIRING;
3389899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __FUNCTION__,
3390899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             btm_cb.pairing_state);
3391899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
33925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_disabled)
3395899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3396899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* pairing is not allowed */
3397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __FUNCTION__);
33985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3400899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
3403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* device in Secure Connections Only mode */
3404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
3405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,",
3407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            " remote_support_for_sc 0x%02x -> fail pairing", __FUNCTION__,
3408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
3409899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3411899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
34135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (err_code != 0)
34155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
34175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
34185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
34195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
34205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code);
34215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
34225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.is_orig = is_orig;
34255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_orig)
34275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local device initiated the pairing non-bonding -> use p_cur_service */
34295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
34305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_cur_service &&
34315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE))
34325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* SC only mode device requires MITM protection */
3436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_AUTH_SP_YES;
3437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
3439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags &
3441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                     BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO;
3442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
34435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
34475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
34485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
34505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
34525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
34535738f83aeb59361a0a2eda2460113f6dc919427The 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);
34545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
34555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
34565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
34575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS);
34595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    callback_rc = BTM_SUCCESS;
34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_UPGRADE)
34625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE;
34645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */
34665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.auth_req = BTM_AUTH_SPGB_YES;
34675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.api.p_sp_callback)
34695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* the callback function implementation may change the IO capability... */
34715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
34725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
34755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data))
34765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
34775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (callback_rc == BTM_SUCCESS)
34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
34795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT));
34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3485899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3486899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3487899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* At this moment we know that both sides are SC capable, device in */
3488899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* SC only mode requires MITM for any service so let's set MITM bit */
3489899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            evt_data.auth_req |= BTM_AUTH_YN_BIT;
3490899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x",
3491899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             __FUNCTION__, evt_data.auth_req);
3492899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3493899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3494899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* if the user does not indicate "reply later" by setting the oob_data to unknown */
3495899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* send the response right now. Save the current IO capability in the control block */
34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = evt_data.auth_req;
34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = evt_data.io_cap;
34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3499899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: State: %s  IO_CAP:%d oob_data:%d auth_req:%d",
3500899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap,
3501899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         evt_data.oob_data, evt_data.auth_req);
35025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap,
35045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    evt_data.oob_data, evt_data.auth_req);
35055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_rsp
35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the IO capability of the
35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  specified device is received
35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p)
35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
35215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_RSP evt_data;
35225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
35245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.io_cap, p);
35255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.oob_data, p);
35265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.auth_req, p);
35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Allocate a new device record or reuse the oldest one */
35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
35305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no security is in progress, this indicates incoming security */
35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP);
35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* work around for FW bug */
35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_stop_on_ssp();
35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
35475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We must have a device record here.
35495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * Use the connecting device's CoD for the connection */
35505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
35515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
35525738f83aeb59361a0a2eda2460113f6dc919427The 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);
35535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
35545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
35555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
35565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */
35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */
35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (evt_data.auth_req & BTM_AUTH_DD_BOND) )            /* and dedicated bonding bit is set */
35605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD;
35625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save the IO capability in the device record */
35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_io_caps  = evt_data.io_cap;
35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_auth_req = evt_data.auth_req;
35675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
35695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_proc_sp_req_evt
35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_USER_CONFIRMATION_REQUEST_EVT
35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_REQUEST_EVT
35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_NOTIFY_EVT
35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p)
35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_ERR_PROCESSING;
35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_EVT_DATA evt_data;
35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p_bda = evt_data.cfm_req.bd_addr;
35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All events start with bd_addr */
35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
35955738f83aeb59361a0a2eda2460113f6dc919427The 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],
35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      event, btm_pair_state_descr(btm_cb.pairing_state));
35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL)
35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S ((char *)evt_data.cfm_req.bd_name, sizeof(evt_data.cfm_req.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN);
36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_CFM_REQ_EVT:
36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Numeric confirmation. Need user to conf the passkey */
36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM);
36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* The device record must be allocated in the "IO cap exchange" step */
36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p);
36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.just_works = TRUE;
36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* process user confirm req in association with the auth_req param */
36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO)
36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO)
36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO)
36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) )
36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Both devices are DisplayYesNo and one or both devices want to authenticate
36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       -> use authenticated link key */
36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    evt_data.cfm_req.just_works = FALSE;
36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_proc_sp_req_evt()  just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
36305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps,
36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req);
36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_auth_req   = btm_cb.devcb.loc_auth_req;
36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_auth_req   = p_dev_rec->rmt_auth_req;
36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_io_caps    = btm_cb.devcb.loc_io_caps;
36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_io_caps    = p_dev_rec->rmt_io_caps;
36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_NOTIF_EVT:
36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Passkey notification (other side is a keyboard) */
36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.key_notif.passkey, p);
36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT:  passkey: %u", evt_data.key_notif.passkey);
36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_REQ_EVT:
36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* HCI_USER_PASSKEY_REQUEST_EVT */
36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY);
36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_sp_callback)
36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data);
36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != BTM_NOT_AUTHORIZED)
36605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */
36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) )
36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* automatically reply with just works if no sp_cback */
36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_SUCCESS;
36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event == BTM_SP_CFM_REQ_EVT)
36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status);
36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_ConfirmReqReply (status, p_bda);
36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (event == BTM_SP_KEY_REQ_EVT)
36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_PasskeyReqReply(status, p_bda, 0);
36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Something bad. we can only fail this connection */
36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SP_CFM_REQ_EVT == event)
36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (p_bda, FALSE);
36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (BTM_SP_KEY_NOTIF_EVT == event)
36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do nothing -> it very unlikely to happen.
36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        This event is most likely to be received by a HID host when it first connects to a HID device.
36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        Usually the Host initiated the connection in this case.
36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        On Mobile platforms, if there's a security process happening,
36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        the host probably can not initiate another connection.
36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTW (PC) is another story.  */
37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (NULL != (p_dev_rec = btm_find_dev (p_bda)) )
37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE);
37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply(p_bda);
37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_keypress_notif_evt
37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a key press notification is
37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received
37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid  btm_keypress_notif_evt (UINT8 *p)
37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_KEYPRESS    evt_data;
37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse & report BTM_SP_KEYPRESS_EVT */
37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bda = evt_data.bd_addr;
37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_BDADDR (p_bda, p);
37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.notif_type = *p;
37355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_simple_pair_complete
37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when simple pairing process is
37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  complete
37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p)
37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_COMPLT  evt_data;
37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status;
37555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         disc = FALSE;
37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = *p++;
37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL)
37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
37635738f83aeb59361a0a2eda2460113f6dc919427The 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],
37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]);
37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_simple_pair_complete()  Pair State: %s  Status:%d  sec_state: %u",
37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),  status, p_dev_rec->sec_state);
37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.status = BTM_ERR_PROCESSING;
37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_PAIRING_NOT_ALLOWED)
37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The test spec wants the peer device to get this failure code. */
37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT);
37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Change the timer to 1 second */
37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT);
37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0)
37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop the timer */
37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&btm_cb.pairing_tle);
37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* the initiating side: will receive auth complete event. disconnect ACL at that time */
37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                disc = TRUE;
37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
37995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc = TRUE;
38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Let the pairing state stay active, p_auth_complete_callback will report the failure */
38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (disc)
38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* simple pairing failed */
3812db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        /* Avoid sending disconnect on HCI_ERR_PEER_USER */
3813db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))
3814db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
3815db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
3816db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_rem_oob_req
38245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_REMOTE_OOB_DATA_REQUEST_EVT
38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p)
38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_RMT_OOB  evt_data;
38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      c;
38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      r;
38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bda = evt_data.bd_addr;
38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) &&
38475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         btm_cb.api.p_sp_callback)
38485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
38515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S((char *)evt_data.bd_name, sizeof(evt_data.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN+1);
3852ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_data.bd_name[BTM_MAX_REM_BD_NAME_LEN] = 0;
38535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP);
38555738f83aeb59361a0a2eda2460113f6dc919427The 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)
38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_RemoteOobDataReply(TRUE, p_bda, c, r);
38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* something bad. we can only fail this connection */
38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_rem_oob_neg_reply (p_bda);
38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_read_local_oob_complete
38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when read local oob data is
38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p)
38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_LOC_OOB evt_data;
38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status = *p++;
38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status);
38835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.c, p);
38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.r, p);
38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_ERR_PROCESSING;
38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */
38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_collision
39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when authentication or encryption
39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  needs to be retried at a later time.
39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle)
39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btm_cb.collision_start_time)
3912c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati        btm_cb.collision_start_time = GKI_get_os_tick_count();
39135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3914c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    if ((GKI_get_os_tick_count() - btm_cb.collision_start_time) < btm_cb.max_collision_delay)
39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (handle == BTM_SEC_INVALID_HANDLE)
39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL)
39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING);
39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_find_dev_by_handle (handle);
39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec != NULL)
39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We will restart authentication after timeout */
39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
39295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_state = 0;
39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_collided_dev_rec = p_dev_rec;
39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.sec_collision_tle.param = (UINT32) btm_sec_collision_timeout;
39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT);
39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_complete
39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when authentication of the connection is
39435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
39445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status)
39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sm4;
39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state   = btm_cb.pairing_state;
39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             are_bonding = FALSE;
39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
39565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d  dev->sec_state: %u  Bda:%08x, RName:%s",
39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status,
39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_state,
39645738f83aeb59361a0a2eda2460113f6dc919427The 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],
39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39695344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d",
39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status);
39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
39745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection was made just to do bonding.  If we authenticate
39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       the connection that is up, this is the last event received.
39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec
39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))
39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
39945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* keep the old sm4 flag and clear the retry bit in control block */
40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_sm4 = p_dev_rec->sm4;
40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= ~BTM_SM4_RETRY;
40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        are_bonding = TRUE;
40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS)
40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             &&  (old_state != BTM_PAIR_STATE_IDLE) )
40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be a race condition, when we are starting authentication and
40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the peer device is doing encryption.
40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If first we receive encryption change up, then initiated authentication
40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** can not be performed.  According to the spec we can not do authentication
40285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** on the encrypted link, so device is correct.
40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_COMMAND_DISALLOWED)
40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) ==
40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)))
40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HCI_SUCCESS;
40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Currently we do not notify user if it is a keyboard which connects */
40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* User probably Disabled the keyboard while it was asleap.  Let her try */
40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_auth_complete_callback)
40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* report the suthentication status */
40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state != BTM_PAIR_STATE_IDLE)
40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
40435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (are_bonding)
40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != HCI_SUCCESS)
4055db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
4056db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)))
4057db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
4058db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4060444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4061444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL");
4062e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec))
4063e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* no LE keys are available, do deriving */
4064e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4065e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4066e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) &&
4067e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4069444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL");
40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4071444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (btm_sec_is_master(p_dev_rec))
4072444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
4073e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // Encryption is required to start SM over BR/EDR
4074e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // indicate that this is encryption after authentication
4075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL);
4076444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
4077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
4079444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4080e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
40815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If authentication failed, notify the waiting layer */
40855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
40865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((old_sm4 & BTM_SM4_RETRY) == 0)
40885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* allow retry only once */
40905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION)
40915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
40925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
40935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
40945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
40955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
40965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* this retry for missing key is for Lisbon or later only.
40975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * Legacy device do not need this. the controller will drive the retry automatically */
40985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4))
40995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
41035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* With BRCM controller, we do not need to delete the stored link key in controller.
41065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                If the stack may sit on top of other controller, we may need this
41075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_DeleteStoredLinkKey (bd_addr, NULL); */
41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sm4 & BTM_SM4_RETRY)
41115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_execute_procedure (p_dev_rec);
41135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
41205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
41225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
41275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Authentication succeeded, execute the next security procedure, if any */
41295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_execute_procedure (p_dev_rec);
41305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
41325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
41337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
41345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
41355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
41375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_encrypt_change
41395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when encryption of the connection is
41415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
41425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
41445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
41465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable)
41475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
41485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
4149ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
41507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN       *p_acl = NULL;
41517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8           acl_idx = btm_handle_to_acl_index(handle);
4152ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
41535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable);
41555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
4159e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) ||
4160e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
41665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
41685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && encr_enable)
41717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
41727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->hci_handle == handle)
41737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
41747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
41757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
41767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
41775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* It is possible that we decrypted the link to perform role switch */
41795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* mark link not to be encrypted, so that when we execute security next time it will kick in again */
41805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && !encr_enable)
41817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
41827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->hci_handle == handle)
41837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
41847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
41857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED;
41867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
4189ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
41905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4191e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (acl_idx != MAX_L2CAP_LINKS)
41927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_acl = &btm_cb.acl_db[acl_idx];
4193ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4194444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_sec_check_pending_enc_req (p_dev_rec, p_acl->transport, encr_enable);
4195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
41967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_acl && p_acl->transport == BT_TRANSPORT_LE)
41975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4198e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE ||
4199444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)
4200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4201d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN);
4202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
4203444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
42045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_link_encrypted(p_dev_rec->bd_addr, encr_enable);
42055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4208e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    {
42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* BR/EDR connection, update the encryption key size to be 16 as always */
42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->enc_key_size = 16;
4211e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    }
4212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4213e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun     BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d",
4214e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                       __func__, p_dev_rec->new_encryption_key_is_p256);
4215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle))
4217444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec->new_encryption_key_is_p256)
4219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_sec_use_smp_br_chnl(p_dev_rec) &&
4221e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                btm_sec_is_master(p_dev_rec) &&
4222e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* if LE key is not known, do deriving */
4223e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4224e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4225e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
4226e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* BR/EDR is encrypted with LK that can be used to derive LE LTK */
4229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                p_dev_rec->new_encryption_key_is_p256 = FALSE;
4230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4231e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                if (p_dev_rec->no_smp_on_br)
4232e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4233e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s NO SM over BR/EDR", __func__);
4234e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4235e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                else
4236e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4237e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s start SM over BR/EDR", __func__);
4238e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    SMP_BR_PairWith(p_dev_rec->bd_addr);
4239e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
4243e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        {
4244e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // BR/EDR is successfully encrypted. Correct LK type if needed
4245e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // (BR/EDR LK derived from LE LTK was used for encryption)
4246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((encr_enable == 1)  && /* encryption is ON for SSP */
4247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* LK type is for BR/EDR SC */
4248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 ||
4249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                 p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4251444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)
4252444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB;
4253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */
4254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB;
4255444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4256444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("updated link key type to %d", p_dev_rec->link_key_type);
4257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                btm_send_link_key_notif(p_dev_rec);
4258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else
4262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_sec_check_pending_enc_req (p_dev_rec, BT_TRANSPORT_BR_EDR, encr_enable);
4263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */
42645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this encryption was started by peer do not need to do anything */
42665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING)
42675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state)
42695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
42705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
42715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
42725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
42735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
42745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
42785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If encryption setup failed, notify the waiting layer */
42795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
42805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
42825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Encryption setup succeeded, execute the next security procedure, if any */
42865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
42875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
42885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
42897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
42905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
42915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
42935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connect_after_reject_timeout
42955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Connection for bonding could not start because of the collision
42975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Initiate outgoing connection
42985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
43005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
43025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_connect_after_reject_timeout (TIMER_LIST_ENT *p_tle)
43035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec;
43055cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
43065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_connect_after_reject_timeout()");
43085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.sec_collision_tle.param = 0;
43095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_collided_dev_rec = 0;
43105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
43125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection");
43145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
43165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (btm_cb.api.p_auth_complete_callback)
43185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
43195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
43205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connected
43265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
43285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establsihed
43295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
43315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
43335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode)
43345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda);
43365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            res;
43375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          is_pairing_device = FALSE;
43385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tACL_CONN        *p_acl_cb;
43397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8            bit_shift = 0;
43405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
43425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
43445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x RName:%s",
43495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
43525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x ",
43565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no device record for new connection.  Allocate one */
43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
43655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
43675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
43695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* can not find the device record and the status is error,
43715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * just ignore it */
43725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else    /* Update the timestamp for this device */
43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
43787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
43797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0;
43807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->timestamp = btm_cb.dev_rec_count++;
43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell L2CAP it's a bonding connection. */
43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if incoming connection failed while pairing, then try to connect and continue */
43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Motorola S9 disconnects without asking pin code */
43915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ))
43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
43935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
43965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
43975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* Start timer with 0 to initiate connection with new LCB */
43995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* because L2CAP will delete current LCB with this event  */
44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_cb.p_collided_dev_rec = p_dev_rec;
44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout;
44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0);
44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
44045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
44077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                        BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR);
44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return;
44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE);
44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
44185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
44195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* always clear the pending flag */
44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
44215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
44257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
44267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
44277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
44285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
44295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
44305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
44315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4433ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
44345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
44355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) )
44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection from bonding device */
44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((status == HCI_ERR_HOST_REJECT_DEVICE)
44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT))
44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
44425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags, p_dev_rec->sm4);
44435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT;
44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
44497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR);
44505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if we already have pin code */
44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
44555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Start timer with 0 to initiate connection with new LCB */
44575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* because L2CAP will delete current LCB with this event  */
44585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.p_collided_dev_rec = p_dev_rec;
44595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout;
44605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0);
44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
44645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* wait for incoming connection without resetting pairing state */
44665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (status == HCI_ERR_CONNECTION_EXISTS)
44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection");
44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
44705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_pairing_device = TRUE;
44735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
44765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if connection fails during pin request, notify application */
44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If connection failed because of during pairing, need to tell user */
44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_pairing_device)
44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
44857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift);
44865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required );
44875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
44895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
44915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
44955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
44965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /*
44997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta     Do not send authentication failure, if following conditions hold good
45007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      1.  BTM Sec Pairing state is idle
45017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      2.  Link key for the remote device is present.
45027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      3.  Remote is SSP capable.
45037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta  */
45047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else if  ((p_dev_rec->link_key_type  <= BTM_LKEY_TYPE_REMOTE_UNIT) &&
45057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (((status == HCI_ERR_AUTH_FAILURE)                      ||
45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_KEY_MISSING)                         ||
45075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_HOST_REJECT_SECURITY)                ||
45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_NOT_ALLOWED)                 ||
45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_UNIT_KEY_USED)                       ||
45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)           ||
45127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (status == HCI_ERR_REPEATED_ATTEMPTS))))
45135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift);
45167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
45177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
45187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE
45197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* If we rejected pairing, pass this special result code */
45207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY)
45217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
45227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                status = HCI_ERR_HOST_REJECT_SECURITY;
45237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
45247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
45275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
45325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT  ||
45365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status == HCI_ERR_UNSPECIFIED     || status == HCI_ERR_PAGE_TIMEOUT)
45377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE);
45385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
45397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
45405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
45425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If initiated dedicated bonding, return the link key now, and initiate disconnect */
45455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If dedicated bonding, and we now have a link key, we are all done */
45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_pairing_device
45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) )
45485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->link_key_not_sent)
45505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->link_key_not_sent = FALSE;
45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_send_link_key_notif(p_dev_rec);
45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remember flag before it is initialized */
45585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
45595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = TRUE;
45605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
45615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = FALSE;
45625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
45645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
45665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
45675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
45695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( res )
45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Let l2cap start bond timer */
45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE);
45745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
45775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
45805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* role may not be correct here, it will be updated by l2cap, but we need to */
45825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notify btm_acl that link is up, so starting of rmt name request will not */
45835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set paging flag up */
45847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR);
45855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_acl_cb)
45865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */
45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
45895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* For now there are a some devices that do not like sending */
45905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* commands events and data at the same time. */
45915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the packet types to the default allowed by the device */
45925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
45935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.btm_def_link_policy)
45955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
45965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
45975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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);
45995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize security flags.  We need to do that because some            */
46015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization complete could have come after the connection is dropped */
46025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* and that would set wrong flag that link has been authorized already    */
46037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
46047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift);
46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (enc_mode != HCI_ENCRYPT_MODE_DISABLED)
46077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift);
46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode == BTM_SEC_MODE_LINK)
46107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift);
46115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->link_key_changed = FALSE;
46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* After connection is established we perform security if we do not know */
46155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the name, or if we are originator because some procedure can have */
46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* been scheduled while connection was down */
46175344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator);
46185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator)
46195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
46217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
46275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnect
46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to disconnect HCI link
46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          btm status
46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason)
46365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* In some weird race condition we may not have a record */
46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_disconnect (handle, reason);
46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we are currently doing bonding.  Link will be disconnected when done */
46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_BUSY);
46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnected
46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  dropped
46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason)
46705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
46725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8             old_pairing_flags = btm_cb.pairing_flags;
46735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               result = HCI_ERR_AUTH_FAILURE;
4674ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    tBTM_SEC_CALLBACK   *p_callback = NULL;
46757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT      transport = BT_TRANSPORT_BR_EDR;
46765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If page was delayed for disc complete, can do it now */
46785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.discing = FALSE;
46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
46815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    transport  = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE;
46867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
4687ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4688ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
46895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
4690f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    LOG_INFO("%s clearing pending flag handle:%d reason:%d", __func__, handle, reason);
46915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
46925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
46935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear unused flags */
46955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= BTM_SM4_TRUE;
46965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4697f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr;
4698f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x"
4699f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            "  remote_name:%s", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state),
4700f8027005333c88a2f097cfd70d15c3d54c7764aeChris 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);
47015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4702f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
47035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
47055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
47065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0))
47075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
47095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
47115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the disconnection reason is REPEATED_ATTEMPTS,
47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               send this error message to complete callback function
47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               to display the error message of Repeated attempts.
47155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               All others, send HCI_ERR_AUTH_FAILURE. */
47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (reason == HCI_ERR_REPEATED_ATTEMPTS)
47175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_REPEATED_ATTEMPTS;
47195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
47215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_HOST_REJECT_SECURITY;
47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,     p_dev_rec->dev_class,
47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, result);
47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->enc_key_size = 0;
473124adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera    btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS);
47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* see sec_flags processing in btm_acl_removed */
47337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
47347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
47357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
47367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE;
47377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED);
47387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
47397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
47417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
47427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
47437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
47447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4746444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4747444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)
4748444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4749444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ?
4750444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
4751444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return;
4752444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4753444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
47547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
47555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_NONE;
4756ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4757ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    p_callback = p_dev_rec->p_callback;
4758ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4759ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    /* if security is pending, send callback to clean up the security state */
4760ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    if(p_callback)
4761ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    {
4762ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before
4763ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach                                         we do, this call back must be reset here */
47647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
4765ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    }
4766ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4767f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
47685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_notification
47735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a new connection link key is
47755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  generated
47765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
47785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type)
47815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
4783444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         we_are_bonding = FALSE;
4784444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         ltk_derived_lk  = FALSE;
47855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_notification()  BDA:%04x%08x, TYPE: %d",
47875738f83aeb59361a0a2eda2460113f6dc919427The 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],
47885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      key_type);
47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4790444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) &&
4791444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256))
4792444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4793444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        ltk_derived_lk = TRUE;
4794444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        key_type -= BTM_LTK_DERIVED_LKEY_OFFSET;
4795444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
47975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_type != BTM_LKEY_TYPE_CHANGED_COMB)
48005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_type = key_type;
48015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
4803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
4804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* BR/EDR connection, update the encryption key size to be 16 as always */
4805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->enc_key_size = 16;
4806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
48075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN);
48085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
48105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
48115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
48135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            we_are_bonding = TRUE;
48145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
48165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* save LTK derived LK no matter what */
4819444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (ltk_derived_lk)
4820444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4821444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (btm_cb.api.p_link_key_callback)
4822444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4823444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)",
4824444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                  __FUNCTION__, p_dev_rec->link_key_type);
4825444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4826444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_dev_rec->sec_bd_name,
4827444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_link_key, p_dev_rec->link_key_type);
4828444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4829444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4830444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else
4831444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4832444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) ||
4833444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4834444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4835e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun             p_dev_rec->new_encryption_key_is_p256 = TRUE;
4836444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji             BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d",
4837e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                               __func__, p_dev_rec->new_encryption_key_is_p256);
4838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4839444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
48415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If name is not known at this point delay calling callback until the name is   */
48425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* resolved. Unless it is a HID Device and we really need to send all link keys. */
48435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
4844e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        &&  ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL))
4845e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        && !ltk_derived_lk)
48465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_link_key_notification()  Delayed BDA: %08x%04x Type:%d",
4848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3],
4849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[4] << 8) + p_bda[5], key_type);
48505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = TRUE;
48525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If it is for bonding nothing else will follow, so we need to start name resolution */
48545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (we_are_bonding)
48555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
48565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0)))
48575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_inq_rmt_name_failed();
48585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
48595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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])
48615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
48625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If its not us who perform authentication, we should tell stackserver */
48655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* that some authentication has been completed                          */
48665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This is required when different entities receive link notification and auth complete */
4867e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)
4868e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        /* for derived key, always send authentication callback for BR channel */
4869e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun         || ltk_derived_lk)
48705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
48735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
48745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We will save link key only if the user authorized it - BTE report link key in all cases */
48775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE
48785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
48795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
48805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_link_key_callback)
48825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4883e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (ltk_derived_lk)
4884e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4885e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                BTM_TRACE_DEBUG ("btm_sec_link_key_notification()  LTK derived LK is saved already"
4886e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                    " (key_type = %d)", p_dev_rec->link_key_type);
4887e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
4888e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            else
4889e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4890e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4891e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_dev_rec->sec_bd_name,
4892e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_link_key, p_dev_rec->link_key_type);
4893e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
48945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
48955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
49015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
49035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
49055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
49075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda)
49085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
49095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
49105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_request()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
49125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
49135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4914b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
4915b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (btm_cb.collision_start_time != 0) &&
4916b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) )
4917b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    {
4918b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req "
4919b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta            "State: %d START_TIMEOUT : %d",
4920b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta             btm_cb.pairing_state, btm_cb.collision_start_time);
4921b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        btsnd_hcic_link_key_neg_reply (p_bda);
4922b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        return;
4923b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    }
49245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
49255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key);
49275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
49285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
49315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (p_bda);
49325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The link key is not in the database and it is not known to the manager */
49345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_link_key_neg_reply (p_bda);
49355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
49365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
49385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pairing_timeout
49405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when host does not provide PIN
49425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  within requested time
49435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
49455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
49475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle)
49485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
49495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
49505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
49515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE)
49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_NO;
49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_YES;
49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name[2];
49595cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
49605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->pairing_tle.param = 0;
49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */
49635738f83aeb59361a0a2eda2460113f6dc919427The 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.
49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
49655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (p_cb->pairing_bda);
49665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_pairing_timeout()  State: %s   Flags: %u",
49685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags);
49695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->pairing_state)
49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:
49735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
49745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:
49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0)
49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda);
49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
49805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that no longer need the PIN */
49815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
49825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
49835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
49845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
49865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
49875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
49885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
49895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
49905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
49915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
49925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
49935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
49945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
49955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
49965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:
49985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE);
49995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
50005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
50035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:
50045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda);
50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */
50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:
50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                auth_req |= BTM_AUTH_DD_BOND;
50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps,
50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         BTM_OOB_NONE, auth_req);
50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:
50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda);
50215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */
50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:
50265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* simple pairing failed. Started a 1-sec timer at simple pairing complete.
50275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * now it's time to tear down the ACL link*/
50285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec == NULL)
50295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3],
50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]);
50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:
50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that timeout has happened while waiting for authentication*/
50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
50455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
50595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state));
50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pin_code_request
50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests PIN code
50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda)
50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
50775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB          *p_cb = &btm_cb;
50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
507957bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#ifdef PORCHE_PAIRING_CONFLICT
508057bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath    UINT8 default_pin_code_len = 4;
508157bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath    PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30};
508257bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#endif
50835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_pin_code_request()  State: %s, BDA:%04x%08x",
50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),
50855738f83aeb59361a0a2eda2460113f6dc919427The 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] );
50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0)  &&
50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) )
50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* fake this out - porshe carkit issue - */
50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//            btm_cb.pairing_state = BTM_PAIR_STATE_IDLE;
50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             if(! btm_cb.pin_code_len_saved)
50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 btsnd_hcic_pin_code_neg_reply (p_bda);
50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 return;
50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             }
50995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             else
51005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
51015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code);
51025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      	         return;
51035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             }
51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
51055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ)
51065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
51085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s",
51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                btm_pair_state_descr(btm_cb.pairing_state));
51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reply pin code again due to counter in_rand when local initiates pairing */
51135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing");
51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(! btm_cb.pin_code_len_saved)
51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
511657bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
511757bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath                btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code);
51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code);
51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (p_bda);
51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
51285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (p_bda);
51325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* received PIN code request. must be non-sm4 */
51335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 = BTM_SM4_KNOWN;
51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
51365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN);
51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD;
51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED))
51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying");
51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code);
51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use the connecting device's CoD for the connection */
51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN))
51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) )
51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN);
51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We could have started connection after asking user for the PIN code */
51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len != 0)
51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply");
51615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code);
51625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len_saved = btm_cb.pin_code_len;
51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
51665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark that we forwarded received from the user PIN code */
51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = 0;
51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can change mode back right away, that other connection being established */
51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* is not forced to be secure - found a FW issue, so we can not do this
51725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode(); */
51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If pairing disabled OR (no PIN callback and not bonding) */
51785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* OR we could not allocate entry in the database reject pairing request */
51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_cb->pairing_disabled
51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (p_cb->api.p_pin_callback == NULL)
51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* OR Microsoft keyboard can for some reason try to establish connection */
51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  the only thing we can do here is to shut it up.  Normally we will be originator */
51845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  for keyboard bonding */
51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (!p_dev_rec->is_originator
51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) )
51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec);
51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_neg_reply (p_bda);
51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify upper layer of PIN request and start expiration timer */
51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len_saved = 0;
51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Pin code request can not come at the same time as connection request */
52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN);
52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if the name is known */
52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Even if name is not known we might not be able to get one */
52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this is the case when we are already getting something from the */
52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* device, so HCI level is flow controlled */
52075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Also cannot send remote name request while paging, i.e. connection is not completed */
52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
52095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback");
52115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb->api.p_pin_callback)
52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name);
52155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name");
52195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We received PIN code request for the device with unknown name */
52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* it is not user friendly just to ask for the PIN without name */
52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* try to get name at first */
52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr,
52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_PAGE_SCAN_REP_MODE_R1,
52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_MANDATARY_PAGE_SCAN_MODE, 0))
52265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
52285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[0] = 'f';
52295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[1] = '0';
52305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback");
52315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
52335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_cb->api.p_pin_callback)
52345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name);
52355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
52365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_update_clock_offset
52455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to update clock offset
52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
52495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
52515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset)
52525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
52535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
52545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO     *p_inq_info;
52555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL)
52575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
52585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
52605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL)
52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
52635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
52655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************
52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C     F U N C T I O N S
52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/
52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
52735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_execute_procedure
52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start required security
52775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  procedure.  There is a case when multiplexing protocol
52785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  calls this function on the originating side, connection to
52795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer will not be established.  This function in this
52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  case performs only authorization.
52815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS     - permission is granted
52835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED - in process
52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES  - permission declined
52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec)
52885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
52895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state);
52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is a chance that we are getting name.  Wait until done. */
52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != 0)
52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If any security is required, get the name first */
52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start get name");
53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_get_name (p_dev_rec))
53025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authenticated and authentication is required */
53095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authentication and return PENDING to the caller */
53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
53125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE)))
53135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
53145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
53165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
53175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
53185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
53205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start authentication");
53225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
53265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not encrypted and encryption is required */
53315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start encryption and return PENDING to the caller */
53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
53335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT))
53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT)))
53355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
53385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
53395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
53405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
53415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
53425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start encryption");
53445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_encryption (p_dev_rec))
53465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5352899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
5353899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
5354899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
5355899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -",
5356899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        "security failure", __FUNCTION__, p_dev_rec->link_key_type);
5357899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return (BTM_FAILED_ON_SECURITY);
5358899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
5359899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authorized and authorization is required */
53615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authorization and return PENDING to the caller */
53625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
53635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE))
53645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE))))
53655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("service id:%d, is trusted:%d",
53675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->p_cur_service->service_id,
53685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
53695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                      p_dev_rec->p_cur_service->service_id)));
53705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) &&
53715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) &&
53725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
53735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_dev_rec->p_cur_service->service_id) == FALSE))
53745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: Start authorization");
53765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(btm_sec_start_authorization (p_dev_rec));
53775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All required  security procedures already established */
53815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE |
53825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE |
53835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT |
53845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER |
53855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
53865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
53885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: access granted");
53895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_SUCCESS);
53915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
53925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
53955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_get_name
53975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start get name procedure
53995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec)
54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 tempstate = p_dev_rec->sec_state;
54065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME;
54085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Device should be connected, no need to provide correct page params */
54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* 0 and NULL are as timeout and callback params because they are not used in security get name case */
54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC,
54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                0, NULL)) != BTM_CMD_STARTED)
54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_state = tempstate;
54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
54165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
54195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authentication
54245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authentication
54265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec)
54315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
54335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btsnd_hcic_auth_request (p_dev_rec->hci_handle));
54355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_encryption
54405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start encryption
54425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec)
54475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE))
54495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
54505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
54525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
54535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authorization
54595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authorization
54615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec)
54665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    result;
54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_service_name = NULL;
54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    service_id;
54705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
54725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE))
54735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_cb.api.p_authorize_callback)
54755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_MODE_UNSUPPORTED);
54765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->p_cur_service)
54785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->is_originator)
54815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->orig_service_name;
54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
54835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->term_service_name;
54845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
54855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = p_dev_rec->p_cur_service->service_id;
54865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
54885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = 0;
54895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Send authorization request if not already sent during this service connection */
5491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
5492ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            || p_dev_rec->last_author_service_id != service_id)
5493ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
5494ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING;
5495ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr,
54965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->dev_class,
54975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->sec_bd_name,
54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_service_name,
54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     service_id,
55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->is_originator);
5501ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5502ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5503ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else    /* Already authorized once for this L2CAP bringup */
5504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
55055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
5506ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            return (BTM_SUCCESS);
5507ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
55095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (result == BTM_SUCCESS)
55105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
55115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED;
5512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Save the currently authorized service in case we are asked again by another multiplexer layer */
5514ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (!p_dev_rec->is_originator)
5515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_dev_rec->last_author_service_id = service_id;
5516ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
55195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(result);
55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_start_get_name (p_dev_rec);
55225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
55235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_are_all_trusted
55285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called check if all services are trusted
55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if all are trusted, otherwise FALSE
55325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[])
55355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT32 trusted_inx;
55375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++)
55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL)
55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(FALSE);
55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_first_serv
55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the first record in the service database
55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
55545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm)
55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
55615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_ORIG_MASK )
55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
55665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
55675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
55685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
55695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
55705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
55715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm)
55735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the PSM matches p_out_serv,
55755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
55765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
55775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, just find the first record with the specified PSM */
55805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
55815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) )
55835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
55845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
55865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_next_serv
55925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the next record in the service database
55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur)
56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec   = &btm_cb.sec_serv_rec[0];
56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               i;
56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
56075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == p_cur->psm) )
56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cur != p_serv_rec)
56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(p_serv_rec);
56125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_mx_serv
56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the service database with specified
56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PSM and multiplexor channel information
56255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
56275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
56305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id, UINT32 mx_chan_id)
56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv;
56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5636444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
56375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && p_out_serv && p_out_serv->psm == psm
56385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->mx_proto_id == mx_proto_id
56395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->orig_mx_chan_id == mx_chan_id)
56405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the parameters match p_out_serv,
56425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
56435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
56445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, the old way */
56475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
56485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
56505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == psm)
56515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->mx_proto_id == mx_proto_id)
56525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (( is_originator && (p_serv_rec->orig_mx_chan_id  == mx_chan_id))
56535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                || (!is_originator && (p_serv_rec->term_mx_chan_id  == mx_chan_id))))
56545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
56565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
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**
56645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_collision_timeout
56655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Encryption could not start because of the collision
56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  try to do it again
56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle)
56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56745cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5676444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()", __func__);
56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.sec_collision_tle.param = 0;
56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5679444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec);
56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no next procedure or start of procedure failed, notify the waiting layer */
56857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE);
56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
56945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
56965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec)
56995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_link_key_callback)
57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->sec_bd_name, p_dev_rec->link_key,
57035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->link_key_type);
57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadTrustedMask
57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get trusted mask for the peer device
57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr   - Address of the device
57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          NULL, if the device record is not found.
57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  otherwise, the trusted mask
57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr)
57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5720444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
5721444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec != NULL)
57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(p_dev_rec->trusted_mask);
5723444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return NULL;
57245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_restore_mode
57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the security mode to previous setting
57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if it was changed during bonding.
57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void)
57385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode_changed)
57405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = FALSE;
5742444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK));
57435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK));
57445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_type_changed)
57475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_type_changed = FALSE;
57495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type);
57505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
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**
57565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_dev_by_sec_state
57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the device database for the device
57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  which is being authenticated or encrypted
57605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state)
57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0];
57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5768444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    for (int i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
57695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE)
57715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_dev_rec->sec_state == state))
57725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_dev_rec);
57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_change_pairing_state
57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to change pairing state
57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state)
57855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state = btm_cb.pairing_state;
57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  Old: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
5789444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  New: %s pairing_flags:0x%x", __func__,
5790444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            btm_pair_state_descr(new_state), btm_cb.pairing_flags);
57915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_state = new_state;
57935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_state == BTM_PAIR_STATE_IDLE)
57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer (&btm_cb.pairing_tle);
57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = 0;
57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len  = 0;
58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the the lcb shows we are not bonding */
58025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE);
58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode();
58055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_check_pending_reqs();
58065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_clear_ssp();
58075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN);
58095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
58115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If transitionng out of idle, mark the lcb as bonding */
58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state == BTM_PAIR_STATE_IDLE)
58145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE);
58155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_tle.param = (TIMER_PARAM_TYPE)btm_sec_pairing_timeout;
58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BTM_SEC_TIMEOUT_VALUE);
58195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_pair_state_descr
58265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
58285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
58315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state)
58325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
58345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (state)
58355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_IDLE:                   return("IDLE");
58375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_GET_REM_NAME:           return("GET_REM_NAME");
58385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:           return("WAIT_PIN_REQ");
58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:         return("WAIT_LOCAL_PIN");
58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:   return("WAIT_NUM_CONFIRM");
58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:              return("KEY_ENTRY");
58425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:     return("WAIT_LOCAL_OOB_RSP");
58435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:      return("WAIT_LOCAL_IOCAPS");
58445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_INCOMING_SSP:           return("INCOMING_SSP");
58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:     return("WAIT_AUTH_COMPLETE");
58465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:        return("WAIT_DISCONNECT");
58475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return("???");
58505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5851104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer    sprintf(btm_cb.state_temp_buffer,"%hhu",state);
58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_cb.state_temp_buffer);
58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
58555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_rec_cback_event
58615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function calls the callback function with the given
58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  result and clear the callback function.
58645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
58665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
586832429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport)
58695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_CALLBACK   *p_callback = p_dev_rec->p_callback;
58715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->p_callback)
58735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
5875e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
58761287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE
5877e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (is_le_transport)
5878e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res);
5879e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        else
58801287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif
5881e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res);
58825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
58845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_check_pending_reqs();
58855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_queue_mx_request
58905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
58925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
58955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         UINT32 mx_proto_id, UINT32 mx_chan_id,
58965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
58975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5898444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf (sizeof(tBTM_SEC_QUEUE_ENTRY));
58995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_e)
59015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->psm            = psm;
59035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->is_orig        = is_orig;
59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->p_callback     = p_callback;
59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->p_ref_data     = p_ref_data;
59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->mx_proto_id    = mx_proto_id;
59075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->mx_chan_id     = mx_chan_id;
5908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->transport      = BT_TRANSPORT_BR_EDR;
59095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN);
59115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
5913444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, psm, is_orig, mx_proto_id, mx_chan_id);
59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_enqueue (&btm_cb.sec_pending_q, p_e);
59165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
59185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec)
59245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK);
59265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK);
59275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN rv = FALSE;
59285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((major == BTM_COD_MAJOR_AUDIO)
59305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&  ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) )
59315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5932444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x",
5933444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            __func__, major, minor);
59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.security_mode_changed == FALSE)
59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
59375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.security_mode_changed = TRUE;
59385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
59395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
59405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_write_auth_enable (TRUE);
59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
59435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
59455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
59475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If we got a PIN, use that, else try to get one */
59495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pin_code_len)
59505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
59515738f83aeb59361a0a2eda2460113f6dc919427The 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);
59525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
59535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
59545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
59555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pin was not supplied - pre-fetch pin code now */
59565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0))
59575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5958444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("%s() PIN code callback called", __func__);
59597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL)
59605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name);
59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rv = TRUE;
59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rv;
59695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5971444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
5972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
5973444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_auth_payload_tout
5974444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
5975444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      Processes the HCI Autheniticated Payload Timeout Event
5976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  indicating that a packet containing a valid MIC on the
5977444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  connection handle was not received within the programmed
5978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  timeout value. (Spec Default is 30 secs, but can be
5979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  changed via the BTM_SecSetAuthPayloadTimeout() function.
5980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
5981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
5982444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len)
5983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
5984444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT16 handle;
5985444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
5986444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    STREAM_TO_UINT16 (handle, p);
5987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    handle = HCID_GET_HANDLE (handle);
5988444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
5989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Will be exposed to upper layers in the future if/when determined necessary */
5990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_ERROR ("%s on handle 0x%02x", __func__, handle);
5991444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
5992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
5993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
5994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
5995444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_queue_encrypt_request
5996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
5997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      encqueue encryption request when device has active security
5998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  process pending.
5999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6000444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport,
6002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
6003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY  *p_e;
6005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1);
6006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6007444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_e)
6008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->psm  = 0;  /* if PSM 0, encryption request */
6010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->p_callback  = p_callback;
6011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->p_ref_data = (void *)(p_e + 1);
6012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        *(UINT8 *)p_e->p_ref_data = *(UINT8 *)(p_ref_data);
6013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->transport  = transport;
6014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN);
6015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        GKI_enqueue(&btm_cb.sec_pending_q, p_e);
6016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return TRUE;
6017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return FALSE;
6020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6021444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6023444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6024899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_peer_sec_caps
6025899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6026899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set sm4 and rmt_sec_caps fields
6027899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  based on the available peer device features.
6028899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6029899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
6030899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6031899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6032899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec)
6033899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6034899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BD_ADDR     rem_bd_addr;
6035899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT8       *p_rem_bd_addr;
6036899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6037899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
6038899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
6039899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
6040899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
6041899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6042899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_TRUE;
6043899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections =
6044899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]));
6045899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6046899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
6047899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6048899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_KNOWN;
6049899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections = FALSE;
6050899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6051899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6052899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", __FUNCTION__,
6053899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                  p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections);
6054899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6055899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6056899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->remote_features_needed)
6057899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6058899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!",
6059899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        __FUNCTION__);
6060899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6061899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr);
6062899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6063899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_io_capabilities_req(p_rem_bd_addr);
6064899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = FALSE;
6065899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6066899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6067899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6068899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6069899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6070444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_clean_pending_req_queue
6071444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6072444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function cleans up the pending security request when the
6073444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  link to the target device dropped.
6074444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          void
6076444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT transport)
6079444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6080444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY    *p_e;
6081444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BUFFER_Q                *bq = &btm_cb.sec_pending_q;
6082444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6083444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq);
6084444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6085444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_e != NULL)
6086444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6087444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (memcmp(p_e->bd_addr, remote_bda, BD_ADDR_LEN) == 0
6088444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6089444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            && p_e->transport == transport
6090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            )
6092444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
6093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            (*p_e->p_callback) (remote_bda, transport, p_e->p_ref_data, BTM_ERR_PROCESSING);
6094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            GKI_remove_from_queue(bq, (void *)p_e);
6095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
6096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e);
6097444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6098899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6099899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6100899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6101899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6102899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_is_serv_level0
6103899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6104899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the service corresponding
6105899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  to PSM is security mode 4 level 0 service.
6106899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6107899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if the service is security mode 4 level 0 service
6108899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6109899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6110899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0(UINT16 psm)
6111899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6112899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (psm == BT_PSM_SDP)
6113899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6114899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __FUNCTION__, psm);
6115899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return TRUE;
6116899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6117899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return FALSE;
6118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_check_pending_enc_req
6123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to send pending encryption callback if
6125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  waiting
6126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          void
6128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
6131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable)
6132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY    *p_e;
6134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BUFFER_Q                *bq = &btm_cb.sec_pending_q;
6135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT8                   res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING;
6136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq);
6138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    while (p_e != NULL)
6140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0
6142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            && p_e->transport == transport
6144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            )
6146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
61471287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE
61481287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach            UINT8 sec_act = *(UINT8 *)(p_e->p_ref_data);
61491287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif
6150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR
6152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                || (sec_act == BTM_BLE_SEC_ENCRYPT || sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM)
6154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                || (sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags
6155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    & BTM_SEC_LE_AUTHENTICATED)
6156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji               )
6158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
6159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res);
6160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                GKI_remove_from_queue(bq, (void *)p_e);
6161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
6162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
6163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e);
6164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6165899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6166899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6167899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6168899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6169899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_serv_level4_flags
6170899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6171899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set security mode 4 level 4 flags.
6172899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6173899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          service security requirements updated to include secure
6174899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  connections only mode.
6175899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6176899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6177899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags(UINT16 cur_security, BOOLEAN is_originator)
6178899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6179899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT16  sec_level4_flags = is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS;
6180899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return cur_security | sec_level4_flags;
6182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
61845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
61855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
61865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clear_ble_keys
61875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
61885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to clear out the BLE keys.
61895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically when devices are removed in BTM_SecDeleteDevice,
61905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or when a new BT Link key is generated.
61915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
61925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
61935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
61945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
61955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC  *p_dev_rec)
61965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
61975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6198444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() Clearing BLE Keys", __func__);
61995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE)
6200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
62015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS));
6202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6203444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE)
6204444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_ble_resolving_list_remove_dev(p_dev_rec);
6205444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
62065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
62075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
62085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_is_a_bonded_dev
62125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description       Is the specified device is a bonded device
62145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - dev is bonded
62165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
62185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda)
62195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
62205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
62225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_bonded= FALSE;
62235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_dev_rec &&
62251287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if (SMP_INCLUDED == TRUE)
62267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))||
62271287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#else
62281287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach        (
62297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
62307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
62315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
62325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_bonded = TRUE;
62335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_bonded=%d", __func__, is_bonded);
62355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(is_bonded);
62365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
62375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6240ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_le_capable_dev
6241ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description       Is the specified device is dual mode or LE only device
6243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE - dev is a dual mode
6245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
6247ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda)
6248ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
6249ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
6250ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN le_capable = FALSE;
6251ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE)
6253e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE)
6254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        le_capable  = TRUE;
6255ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
6256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return le_capable;
6257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
6258ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6259ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
6260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
62615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_bonded_dev
62625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Find a bonded device starting from the specified index
62645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - found a bonded device
62665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6268e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. ChenBOOLEAN btm_sec_find_bonded_dev (UINT8 start_idx, UINT8 *p_found_idx, tBTM_SEC_DEV_REC **p_rec)
62695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
62705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN found= FALSE;
62715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE)
62735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
62745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
62755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS)
62765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
62775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("LE bonded device not found");
62785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return found;
62795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
62805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = &btm_cb.sec_dev_rec[start_idx];
62825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = start_idx; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
62835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
62845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
62855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
62865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_found_idx = i;
6287e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. Chen            *p_rec = p_dev_rec;
62885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
62895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
62905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() found=%d", __func__, found);
62925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
62935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(found);
62945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_use_smp_br_chnl
6299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if SMP BR connection can be used with
6301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the peer.
6302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  Is called when authentication for dedicated bonding is
6303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  successfully completed.
6304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if SMP BR connection can be used (the link key is
6306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         generated from P-256 and the peer supports Security
6307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         Manager over BR).
6308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec)
6311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT32  ext_feat;
6313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT8   chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE];
6314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x", __func__,
6316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->link_key_type);
6317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) &&
6319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
6320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         return FALSE;
6321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask))
6323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT))
6326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return TRUE;
6329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_is_master
6334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if the device is BR/EDR master after
6336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  pairing is completed.
6337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if the device is master.
6339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec)
6342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
6344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return (p && (p->link_role == BTM_ROLE_MASTER));
6345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6347