btm_sec.c revision e11f228d1a18486cd00c36487812a763487a236f
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**
249877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function         BTM_SecRegisterLinkKeyNotificationCallback
250877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
251877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description      Application manager calls this function to register for
252877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**                  link key notification.  When there is nobody registered
253877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**                  we should avoid changing link key
254877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
255877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns          TRUE if registered OK, else FALSE
256877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
257877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/
258877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback)
259877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{
260877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji    btm_cb.api.p_link_key_callback = p_callback;
261877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji    return TRUE;
262877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
263877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
264877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
265877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecAddRmtNameNotifyCallback
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can register to be notified when name of the
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote device is resolved.
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == NULL)
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = p_callback;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecDeleteRmtNameNotifyCallback
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can deregister notification when a new Link Key
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is generated per connection.
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if OK, else FALSE
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == p_callback)
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = NULL;
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetSecurityFlags
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get security flags for the device
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BOOLEAN TRUE or FALSE is device found
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags)
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
3337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
3347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
3355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
3367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
3377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
3387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
3407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_GetSecurityFlagsByTransport
3427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Get security flags for the device on a particular transport
3447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE is device found
3467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
3487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags,
3497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                tBT_TRANSPORT transport)
3507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
3517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec;
3527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
3547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
3557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (transport == BT_TRANSPORT_BR_EDR)
3567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
3577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
3587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8);
3597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPinType
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set PIN type for the device.
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len)
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pin_type, (char *) pin_code, pin_code_len);
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If device is not up security mode will be set as a part of startup */
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.cfg.pin_type != pin_type)
38230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson         && controller_get_interface()->get_is_ready() )
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (pin_type);
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_type     = pin_type;
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_code_len = pin_code_len;
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len);
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPairableMode
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Enable or disable pairing
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       allow_pairing - (TRUE or FALSE) whether or not the device
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      allows pairing.
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connect_only_paired - (TRUE or FALSE) whether or not to
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      only allow paired devices to connect.
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired)
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPairableMode()  allow_pairing: %u   connect_only_paired: %u", allow_pairing, connect_only_paired);
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_disabled    = !allow_pairing;
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.connect_only_paired = connect_only_paired;
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
416899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_SetSecureConnectionsOnly
417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      Enable or disable default treatment for Mode 4 Level 0 services
419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameter        secure_connections_only_mode - (TRUE or FALSE) whether or not the device
421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  TRUE means that the device should treat Mode 4 Level 0 services as
422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  services of other levels. (Secure_connections_only_mode)
423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  FALSE means that the device should provide default treatment for
424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  Mode 4 Level 0 services.
425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
428899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode)
430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: Mode : %u", __FUNCTION__,
432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                   secure_connections_only_mode);
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    btm_cb.devcb.secure_connections_only = secure_connections_only_mode;
435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES   ((UINT16) 0xffff)
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetSecurityLevel
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      is_originator - TRUE if originating the connection, FALSE if not
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id,
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT32 mx_chan_id)
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    CONNECTION_TYPE conn_type;
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_ORIG;
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_TERM;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (conn_type, p_name, service_id,
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (is_originator, p_name, service_id,
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_set_security_level
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      conn_type   - TRUE if originating the connection, FALSE if not
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT32 mx_chan_id)
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec;
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               index;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               first_unused_record = BTM_NO_AVAIL_SEC_SERVICES;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              record_allocated = FALSE;
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_originator;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_ucd;
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_CONNLESS_MASK )
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = TRUE;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = FALSE;
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if the record can be reused (same service name, psm, mx_proto_id,
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       service_id, and mx_chan_id), or obtain the next unused record */
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec = &btm_cb.sec_serv_rec[0];
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++)
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if there is already a record for this service */
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_srec->security_flags & BTM_SEC_IN_USE)
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id    &&
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (!strncmp (p_name, (char *) p_srec->orig_service_name,
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN) ||
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 !strncmp (p_name, (char *) p_srec->term_service_name,
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN)))
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id)
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                record_allocated = TRUE;
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark the first available service record */
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (!record_allocated)
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC));
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            record_allocated = TRUE;
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            first_unused_record = index;
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!record_allocated)
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)",  BTM_SEC_MAX_SERVICE_RECORDS);
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(record_allocated);
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Process the request if service record is valid */
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If a duplicate service wasn't found, use the first available */
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (index >= BTM_SEC_MAX_SERVICE_RECORDS)
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        index = first_unused_record;
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec = &btm_cb.sec_serv_rec[index];
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->psm         = psm;
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->service_id  = service_id;
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->mx_proto_id = mx_proto_id;
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->orig_mx_chan_id = mx_chan_id;
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
5855738f83aeb59361a0a2eda2460113f6dc919427The 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);
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Originator should not set requirements for incoming connections */
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
606899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_OUT_AUTHENTICATE)
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_OUT_MITM;
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_OUT_ENCRYPT)
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_OUT_AUTHENTICATE;
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* outgoing connections usually set the security level right before
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * the connection is initiated.
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * set it to be the outgoing service */
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd == FALSE )
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_srec;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->term_mx_chan_id = mx_chan_id;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
6325738f83aeb59361a0a2eda2460113f6dc919427The 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);
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Acceptor should not set requirements for outgoing connections */
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM);
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
653899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
654899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
655899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_IN_AUTHENTICATE)
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_IN_MITM;
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_IN_ENCRYPT)
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_IN_AUTHENTICATE;
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_ucd )
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags     |= (UINT16)(BTM_SEC_IN_USE);
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, conn_type, psm, mx_proto_id, mx_chan_id);
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_srec->ucd_security_flags);
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
6845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : service name [%s] (up to %d chars saved)",
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_name, BTM_SEC_SERVICE_NAME_LEN);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, is_originator, psm, mx_proto_id, mx_chan_id);
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
6945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : sec: 0x%x, service name [%s] (up to %d chars saved)",
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN);
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(record_allocated);
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecClrService
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record(s) from the security database.
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified name are removed.
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used only by devices with limited RAM so that it can
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  reuse an old security service record.
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Note: Unpredictable results may occur if a service is cleared
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      that is still in use by an application/profile.
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id)
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) &&
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (!service_id || (service_id == p_srec->service_id)))
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id);
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags = 0;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clr_service_by_psm
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record from the security database.
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified psm are removed.
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used by L2CAP to free up the service record used
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by dynamic PSM clients when the channel is closed.
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The given psm must be a virtual psm.
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm)
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) )
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
784ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_clr_temp_auth_service
785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
786ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Removes specified device record's temporary authorization
787ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  flag from the security database.
788ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
789ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters       Device address to be cleared
790ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void.
792ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda)
795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC   *p_dev_rec;
797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
798ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bda)) == NULL)
799ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
8005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB");
801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */
805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service)
806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
8075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID;
811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PINCodeReply
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after Security Manager submitted
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PIN code request to the UI.
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device for which PIN was requested
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res          - result of the operation BTM_SUCCESS if success
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s   PairFlags: 0x%02x  PinLen:%d  Result:%d",
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res);
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr");
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB");
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) )
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) ||
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) )
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (bd_addr);
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags   |= BTM_SEC_LINK_KEY_AUTHED;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.security_mode_changed == FALSE) )
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is start of the dedicated bonding if local device is 2.0 */
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = TRUE;
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable (TRUE);
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = 0xff ;
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*  before originating  */
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we change state little bit early so btm_sec_connected() will originate connection */
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*   when existing ACL link is down completely */
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we already accepted incoming connection from pairing device */
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.api.p_auth_complete_callback)
9187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE);
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_SUCCESS;
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
9285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len);
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if this was not pre-fetched, save the PIN */
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len == 0)
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pin_code_len_saved = pin_len;
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin);
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_sec_bond_by_transport
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      this is the bond function that will start either SSP or SMP.
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device to bond
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Note: After 2.1 parameters are not used and preserved here not to change API
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
9517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                       UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS      status;
9553aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            *p_features;
9563aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            ii;
9577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN        *p= btm_bda_to_acl(bd_addr, transport);
9585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x",
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport);
9627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Other security process is in progress */
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9716975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL)
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9736975b4d711142b885af479721cada448952c6b41Andre Eisenbach        return(BTM_NO_RESOURCES);
9747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Finished if connection is active and already paired */
9797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR
9807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
9817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
9827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE
9837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))
9847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
9857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         )
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SecBond -> Already Paired");
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell controller to get rid of the link key if it has one stored */
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS)
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the PIN code if we got a valid one */
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0))
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN);
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN);
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD;
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE;
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = TRUE;
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10126975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
10137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1015e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        btm_ble_init_pseudo_addr (p_dev_rec, bd_addr);
10167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK;
10177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1018ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (SMP_Pair(bd_addr) == SMP_STARTED)
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
10227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_CMD_STARTED;
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.pairing_flags = 0;
10277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(BTM_NO_RESOURCES);
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
10327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  | BTM_SEC_ROLE_SWITCHED  | BTM_SEC_LINK_KEY_AUTHED);
10337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
103630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing())
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* The special case when we authenticate keyboard.  Set pin type to fixed */
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* It would be probably better to do it from the application, but it is */
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* complicated */
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED))
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pin_type_changed = TRUE;
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED);
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10503aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++)
10513aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    {
10523aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        p_features = p_dev_rec->features[ii];
10535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("  remote_features page[%1d] = %02x-%02x-%02x-%02x",
10543aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                         ii, p_features[0], p_features[1], p_features[2], p_features[3]);
10555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("                              %02x-%02x-%02x-%02x",
10563aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                             p_features[4], p_features[5], p_features[6], p_features[7]);
10573aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    }
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x  HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN;
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection already exists... */
10667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE)
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark lcb as bonding */
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (bd_addr, TRUE);
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
107930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing()
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->sm4 == BTM_SM4_KNOWN))
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( btm_sec_check_prefetch_pin (p_dev_rec) )
1083899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1085899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
1086899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
1087899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
1088899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local is 2.1 and peer is unknown */
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0)
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we are not accepting connection request from peer
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * -> RNR (to learn if peer is 2.1)
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
10977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We are accepting connection request from peer */
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d",
11057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_CMD_STARTED;
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* both local and peer are 2.1  */
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_dd_create_conn(p_dev_rec);
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
11217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBondByTransport
11237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  transport    - doing SSP over BR/EDR or SMP over LE
11307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
11377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                    UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE
11407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_DEVICE_TYPE     dev_type;
11417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBLE_ADDR_TYPE      addr_type;
11427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
11437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
11447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* LE device, do SMP pairing */
11457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) ||
11467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0))
11477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
11487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_ILLEGAL_ACTION;
11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
11517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
11527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBond
11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
11737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (BTM_UseLeLink(bd_addr))
11747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        transport = BT_TRANSPORT_LE;
11757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
11767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
11777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
11787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
11797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecBondCancel
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to cancel ongoing bonding process
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with peer device.
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the peer device
11867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                         transport    - FALSE for BR/EDR link; TRUE for LE link
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr)
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SecBondCancel()  State: %s flags:0x%x",
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags);
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_UNKNOWN_ADDR;
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
12017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE)
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING)
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("Cancel LE pairing");
12067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (SMP_PairCancel(bd_addr))
12077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
12087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return BTM_CMD_STARTED;
12097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_WRONG_MODE;
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags)
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* pre-fetching pin for dedicated bonding */
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_bond_cancel_complete();
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_SUCCESS;
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this BDA is in a bonding procedure */
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the HCI link is up */
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If some other thread disconnecting, we do not send second command */
1232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) ||
1233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH))
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_CMD_STARTED);
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link was set up by Bonding process */
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_update_lcb_4_bonding(bd_addr, FALSE);
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /*HCI link is not up */
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link creation was started by Bonding process */
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btsnd_hcic_create_conn_cancel(bd_addr))
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return BTM_CMD_STARTED;
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_NO_RESOURCES;
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
1255ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
1256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                BTM_CancelRemoteDeviceName();
1257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD;
1258ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return BTM_CMD_STARTED;
1259ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_WRONG_MODE;
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecGetDeviceLinkKey
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to obtain link key for the device
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  it returns BTM_SUCCESS if link key is available, or
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the device or device record does not contain link key info
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  link_key     - Link Key is copied into this array
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key)
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN);
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_UNKNOWN_ADDR);
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         BTM_SecGetDeviceLinkKeyType
1296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to obtain link key type for the
1298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  device.
1299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  it returns BTM_SUCCESS if link key is available, or
1300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
1301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the device or device record does not contain link key info
1302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          BTM_LKEY_TYPE_IGNORE if link key is unknown, link type
1304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  otherwise.
1305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1307444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr)
1308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
1312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return p_dev_rec->link_key_type;
1314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return BTM_LKEY_TYPE_IGNORE;
1316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetEncryption
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to ensure that connection is
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  encrypted.  Should be called only on an open connection.
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically only needed for connections that first want to
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bring up unencrypted links, then later encrypt them.
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed.  Can be set to NULL
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  if status is not desired.
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - pointer to any data the caller wishes to receive
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  in the callback function upon completion.
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*                                   can be set to NULL if not used.
1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  transport  -    TRUE to encryption the link over LE transport
1336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                                  or FALSE for BR/EDR transport
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS   - already encrypted
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_PENDING   - command will be returned in the callback
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE- connection not up.
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY      - security procedures are currently active
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MODE_UNSUPPORTED - if security manager not linked in.
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback,
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               void *p_ref_data)
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS rc = 0;
13497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
13517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!p_dev_rec ||
13527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
13537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
13547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)
13557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
13567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        )
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Connection should be up and runnning */
13595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected");
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
13627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE);
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_BR_EDR &&
13687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags &  BTM_SEC_ENCRYPTED))
13697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
13707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         || (transport == BT_TRANSPORT_LE &&
13717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta           (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED))
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta          )
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted");
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
13787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1383444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* enqueue security request if security is active */
1384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE))
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1386444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request");
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data))
1389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1390444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_CMD_STARTED;
1391444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1392444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1393444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1394444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (p_callback)
1395444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES);
1396444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_NO_RESOURCES;
1397444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = FALSE;
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->security_required);
14087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
14107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tACL_CONN *p = btm_bda_to_acl(bd_addr, transport);
1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p)
1414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role);
1416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            rc = BTM_WRONG_MODE;
1420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", __FUNCTION__);
1421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = btm_sec_execute_procedure (p_dev_rec);
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (rc != BTM_CMD_STARTED && rc != BTM_BUSY)
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
14327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc);
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1435444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet.
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle)
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1444ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8       old_state = p_dev_rec->sec_state;
1445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS status = BTM_CMD_STARTED;
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect:  handle:0x%x, reason=0x%x",
14487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                      conn_handle, reason);
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* send HCI_Disconnect on a transport only once */
1451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    switch (old_state)
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1453444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING:
1454444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->hci_handle)
1455444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1457444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
14597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1460444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
1461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BLE:
1462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->ble_hci_handle)
1463444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
1464444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
1467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BOTH:
1469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return status;
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        default:
1473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ?
1474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
1475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */
1480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle)
1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
1483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji              p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        status = BTM_SUCCESS;
1485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Tear down the HCI link */
1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else if (!btsnd_hcic_disconnect (conn_handle, reason))
1488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         /* could not send disconnect. restore old state */
1490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         p_dev_rec->sec_state = old_state;
1491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         status = BTM_NO_RESOURCES;
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return status;
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ConfirmReqReply
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to confirm the numeric value for
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_CFM_REQ_EVT
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res           - result of the operation BTM_SUCCESS if success
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr       - Address of the peer device
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr)
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15125344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s  Res: %u",
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM)
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) )
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (res == BTM_SUCCESS)
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, TRUE);
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, FALSE);
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PasskeyReqReply
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the passkey for
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_KEY_REQ_EVT
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res     - result of the operation BTM_SUCCESS if success
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr - Address of the peer device
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey - numeric value in the range of
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey)
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s  res:%d",
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), res);
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) )
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1570444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1571444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec != NULL)
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
15767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_SecBondCancel(bd_addr);
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN);
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY)
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (passkey > BTM_MAX_PASSKEY_VAL)
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply (bd_addr);
1599444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_reply (bd_addr, passkey);
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SendKeypressNotif
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is used during the passkey entry model
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by a device with KeyboardOnly IO capabilities
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (very likely to be a HID Device).
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is called by a HID Device to inform the remote device when
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a key has been entered or erased.
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type - notification type
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type)
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This API only make sense between PASSKEY_REQ and SP complete */
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY)
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_send_keypress_notif (bd_addr, type);
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_IoCapRsp
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called in response to BTM_SP_IO_REQ_EVT
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by the tBTM_SP_CALLBACK implementation, this function is
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  called to provide the actual response
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  io_cap  - The IO capability of local device.
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  oob     - BTM_OOB_NONE or BTM_OOB_PRESENT.
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  auth_req- MITM protection required or not.
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req)
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s  oob: %d io_cap: %d",
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap);
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS)
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX)
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = auth_req;
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = io_cap;
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT));
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req);
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadLocalOobData
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local OOB data from
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  LM
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void)
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_SUCCESS;
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_read_local_oob_data() == FALSE)
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_NO_RESOURCES;
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_RemoteOobDataReply
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the remote OOB data for
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_RMT_OOB_EVT
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr     - Address of the peer device
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c           - simple pairing Hash C.
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r           - simple pairing Randomizer  C.
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r)
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1698444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() - State: %s res: %d", __func__,
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP)
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_neg_reply (bd_addr);
1712444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_reply (bd_addr, c, r);
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BuildOobData
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to build the OOB data payload to
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  be sent over OOB (non-Bluetooth) link
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_len - p_data size.
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c       - simple pairing Hash C.
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r       - simple pairing Randomizer  C.
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  name_len- 0, local device name would not be included.
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            otherwise, the local device name is included for
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            up to this specified length
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of bytes in p_data.
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c,
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BT_OCTET16 r, UINT8 name_len)
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len = 0;
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  name_size;
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE)
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mandatory part */
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
175030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson        BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address);
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = BTM_OOB_MANDATORY_SIZE;
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_len -= len;
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* now optional part */
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Hash C */
1758444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        UINT16 delta = BTM_OOB_HASH_C_SIZE + 2;
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_HASH_C_SIZE + 1;
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE;
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE);
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Rand R */
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_RAND_R_SIZE + 2;
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_RAND_R_SIZE + 1;
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE;
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE);
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add class of device */
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_COD_SIZE + 2;
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_COD_SIZE + 1;
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_COD_TYPE;
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class);
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        name_size = name_len;
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (name_size > strlen(btm_cb.cfg.bd_name))
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_size = (UINT16)strlen(btm_cb.cfg.bd_name);
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = name_size + 2;
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_size + 1;
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_type;
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size);
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update len */
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p_data;
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_BothEndsSupportSecureConnections
1816444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1817899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if both the local device and the peer device
1818899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  specified by bd_addr support BR/EDR Secure Connections.
1819444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1820899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1821899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1822899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by both local
1823899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  and the remote device.
1824899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1825444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1826444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1827899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr)
1828444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1829899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return ((controller_get_interface()->supports_secure_connections()) &&
1830899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_PeerSupportsSecureConnections(bd_addr)));
1831899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
1832899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1833899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
1834899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1835899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_PeerSupportsSecureConnections
1836899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1837899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the peer supports
1838899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  BR/EDR Secure Connections.
1839899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1840899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1841899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1842899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by the peer,
1843899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1844899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1845899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
1846899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr)
1847899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
1848899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    tBTM_SEC_DEV_REC    *p_dev_rec;
1849899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1850899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL)
1851899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
1852899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x", __FUNCTION__,
1853899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3],
1854899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[4]<< 8) + bd_addr[5]);
1855899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return FALSE;
1856899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
1857899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1858899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return (p_dev_rec->remote_supports_secure_connections);
1859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1862444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadOobData
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to parse the OOB data payload
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received over OOB (non-Bluetooth) link
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  eir_tag - The associated EIR tag to read the data.
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  *p_len(output) - the length of the data with the given tag.
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the beginning of the data with the given tag.
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  NULL, if the tag is not found.
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len)
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  max_len;
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   len, type;
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_ret = NULL;
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   ret_len = 0;
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data)
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(max_len, p);
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= BTM_OOB_MANDATORY_SIZE)
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag)
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ret = p; /* the location for bd_addr */
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ret_len = BTM_OOB_BD_ADDR_SIZE;
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += BD_ADDR_LEN;
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                max_len -= BTM_OOB_MANDATORY_SIZE;
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* now the optional data in EIR format */
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                while (max_len > 0)
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len     = *p++; /* tag data len + 1 */
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    type    = *p++;
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (eir_tag == type)
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_ret = p;
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        ret_len = len - 1;
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* the data size of this tag is len + 1 (tag data len + 2) */
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (max_len > len)
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len -= len;
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len--;
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        len--;
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p += len;
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len = 0;
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_len)
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = ret_len;
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ret;
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetOutService
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the service for
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  outgoing connections.
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the profile/application calls BTM_SetSecurityLevel
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  before initiating a connection, this function does not
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  need to be called.
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id)
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_out_serv = p_serv_rec;
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (bd_addr);
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1953444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->service_id == service_id)
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->orig_mx_chan_id == mx_chan_id))
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
19605738f83aeb59361a0a2eda2460113f6dc919427The 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);
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_serv_rec;
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec)
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->p_cur_service = p_serv_rec;
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**              I N T E R N A L     F U N C T I O N S
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1974ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_upgrade_possible
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1976ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function returns TRUE if the existing link key
1977ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  can be upgraded or if the link key does not exist.
19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1979ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          BOOLEAN
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1982ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM;
1985ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN             is_possible = TRUE;
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1989ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        is_possible = FALSE;
19907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if(p_dev_rec->p_cur_service)
19917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x",
1993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type,
1994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags);
19957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
19967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
19977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x",
1999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check);
20007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Already have a link key to the connected peer. Is the link key secure enough?
20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** Is a link key upgrade even possible?
20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
2004899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & mtm_check)    /* needs MITM */
2005899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) ||
2006899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256))
2007899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* has unauthenticated
2008899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key */
2009899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX)  /* a valid peer IO cap */
2010899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps]))
2011899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* authenticated
2012899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key is possible */
20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* upgrade is possible: check if the application wants the upgrade.
20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * If the application is configured to use a global MITM flag,
20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * it probably would not want to upgrade the link key based on the security level database */
2017ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            is_possible = TRUE;
2018ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2019ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, p_dev_rec->sec_flags);
2021ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return is_possible;
2022ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
2025ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2026ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_check_upgrade
2027ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2028ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function is called to check if the existing link key
2029ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  needs to be upgraded.
2030ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2031ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
2032ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2033ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
2034ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
2035ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2037444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
2038ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2039ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Only check if link key already exists */
2040ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
2041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
2042444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2043ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE)
2044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
20455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
2046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* upgrade is possible: check if the application wants the upgrade.
2047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * If the application is configured to use a global MITM flag,
2048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * it probably would not want to upgrade the link key based on the security level database */
2049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SP_UPGRADE evt_data;
2050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
2051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_data.upgrade = TRUE;
2052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btm_cb.api.p_sp_callback)
2053ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
2054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade);
2056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (evt_data.upgrade)
2057ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* if the application confirms the upgrade, set the upgrade bit */
2059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2060ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Clear the link key known to go through authentication/pairing again */
2062ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
2063ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED;
20645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags);
20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_l2cap_access_req
20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP to grant permission to
20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establish L2CAP connection to or from the peer device.
20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are complete. MUST NOT BE NULL.
20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tBTM_STATUS
20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_OUT_FLAGS   (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHORIZE)
20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_IN_FLAGS    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)
20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2090899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_OUT_LEVEL4_FLAGS   (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | \
2091899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                    BTM_SEC_OUT_MITM | BTM_SEC_MODE4_LEVEL4)
2092899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2093899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_IN_LEVEL4_FLAGS    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | \
2094899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                    BTM_SEC_IN_MITM | BTM_SEC_MODE4_LEVEL4)
2095899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle,
20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      CONNECTION_TYPE conn_type,
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      tBTM_SEC_CALLBACK *p_callback,
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      void *p_ref_data)
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         security_required;
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         old_security_required;
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       old_is_originator;
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS   rc = BTM_SUCCESS;
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       chk_acp_auth_done = FALSE;
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
21097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN     transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, p_ref_data);
21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator:%d, 0x%x", __func__, is_originator, p_ref_data);
21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_first_serv (conn_type, psm);
21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("%s() PSM: %d no application registerd", __func__, psm);
21367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_MODE_UNSUPPORTED);
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2140899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Services level0 by default have no security */
2141899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only))
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY);
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2149899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2150899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2151899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags,
2152899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                               is_originator);
2153899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2154899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2155899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2156899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->ucd_security_flags;
2157899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_originator)
21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
21645738f83aeb59361a0a2eda2460113f6dc919427The 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))) ||
21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rc = BTM_SUCCESS;
21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
21745738f83aeb59361a0a2eda2460113f6dc919427The 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))) ||
21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rc = BTM_SUCCESS;
21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2184899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2185899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2186899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (rc == BTM_SUCCESS)
21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_callback)
21907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                                is_originator);
2202899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2204899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2205899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->security_flags;
2206899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2207899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2208899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2209899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm  0x%04x",
2210899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    __FUNCTION__, security_required, is_originator, psm);
2211899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2212899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4))
2213899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2215899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */
2216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2218899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d",
2219899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "rmt_support_for_sc : %d -> fail pairing", __FUNCTION__,
2220899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc,
2221899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            p_dev_rec->remote_supports_secure_connections);
2222899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2223899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2224899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                    BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2225899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2226899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2227899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto KRZR) which connects to several services at the same time */
22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed  state: %s mode:%d, sm4:0x%x", __func__,
2235ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                          psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4);
22365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
2238899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2239899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2240899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2241899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2242899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2243899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (is_originator)
22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
22507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
22517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) ||
22527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec)  && btm_dev_encrypted(p_dev_rec))) )
22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rc = BTM_SUCCESS;
22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
22607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) ||
22617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) ||
22627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
22657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))))
22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rc = BTM_SUCCESS;
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2271899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2272899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2273899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2274899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2275899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2276899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (rc == BTM_SUCCESS)
22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_callback)
22807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_SUCCESS);
22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.sec_req_pending = TRUE;
22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save pointer to service record */
22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service = p_serv_rec;
22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2292899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */
2293899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2294899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2295899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2297899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2299899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (is_originator)
23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT);
23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2304899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else /* acceptor */
23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */
23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                chk_acp_auth_done = TRUE;
23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
2310899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth           }
2311899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2312899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4))
2313899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2314899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the remote features are not known yet */
2315899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", __FUNCTION__,
2316899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags);
23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2318899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sm4 |= BTM_SM4_REQ_PEND;
2319899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()  sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__,
23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done);
23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_security_required        = p_dev_rec->security_required;
23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_is_originator            = p_dev_rec->is_originator;
23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = security_required;
23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = TRUE;
23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = FALSE;
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are multiple service records used through the same PSM */
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* leave security decision for the multiplexor on the top */
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!BTM_SEC_IS_SM4(p_dev_rec->sm4))
23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pre-Lisbon: restore the old settings */
23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = old_security_required;
23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->is_originator     = old_is_originator;
23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2362899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* if the originator is using dynamic PSM in legacy mode, do not start any security process now
2363899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * The layer above L2CAP needs to carry out the security requirement after L2CAP connect
2364899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * response is received */
2365899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (is_originator &&
2366899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2367899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2368899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2369899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2370899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001))
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* restore the old settings */
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required = old_security_required;
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_originator     = old_is_originator;
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (chk_acp_auth_done)
23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED));
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SM4, but we do not know for sure which level of security we need.
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * as long as we have a link key, it's OK */
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rc = BTM_DELAY_CHECK;
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            because of data path issues. Delay this disconnect a little bit
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
2396f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            LOG_INFO("%s peer should have initiated security process by now (SM4 to SM4)", __func__);
23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback        = p_callback;
23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state         = BTM_SEC_STATE_DELAY_FOR_ENC;
23997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, rc);
24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_SUCCESS;
24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
2408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id)
2409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Although authentication and encryption are per connection
2411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** authorization is per access request.  For example when serial connection
2412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** is up and authorized and client requests to read file (access to other
2413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** scn), we need to request user's permission again.
2414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        */
2415ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED;
2416ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2428899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      BTM_SEC_AUTHENTICATED);
2430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* If we already have a link key to the connected peer, is it secure enough? */
2435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_check_upgrade(p_dev_rec, is_originator);
2436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2439444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d",
2440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
24467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc);
24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_mx_access_request
24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by all Multiplexing Protocols during
24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establishing connection to or from peer device to grant
24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  permission to establish application connection.
24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id   - protocol ID of the multiplexer
24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id    - multiplexer channel to reach application
24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - Pointer to any reference data needed by the
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  the callback function.
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator,
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       UINT32 mx_proto_id, UINT32 mx_chan_id,
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS        rc;
2482ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16             security_required;
24837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN transport   = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator: %d", __func__, is_originator);
24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id);
24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
24967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id);
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NO_RESOURCES;
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2503899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm)))
2504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2505899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2506899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                           is_originator);
2507899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2508899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
2509899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2510899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = p_serv_rec->security_flags;
2511899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2512899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto phone) which connects to several services at the same time */
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2517444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed  state: %s", __func__,
25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state));
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rc = BTM_CMD_STARTED;
2521899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2522899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2523899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2524899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2525899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2526899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2527899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
2528ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2529ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2530ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
2531ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (is_originator)
2532ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2533ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
25347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2537ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2538ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    rc = BTM_SUCCESS;
2539ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2540ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2541ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
2542ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2543ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
25447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) ||
25487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2549ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2550ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    rc = BTM_SUCCESS;
2552ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2554899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2555899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2556899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2557899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2558899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2559899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2560899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (rc == BTM_SUCCESS)
2562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2563899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __FUNCTION__);
2564899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */
2565899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* btm_sec_execute_procedure */
2566899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) ||
2567899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE)))
2568899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2569899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_EVENT("%s: still need authorization", __FUNCTION__);
2570899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2571899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2572899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2573899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2574899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Check whether there is a pending security procedure, if so we should always queue */
2575899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* the new security request */
2576899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)
2577899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2578899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: There is a pending security procedure", __FUNCTION__);
2579899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (rc == BTM_CMD_STARTED)
2582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2583899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __FUNCTION__);
2584899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_queue_mx_request (bd_addr, psm,  is_originator, mx_proto_id,
2585899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      mx_chan_id, p_callback, p_ref_data);
2586899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2587899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else /* rc == BTM_SUCCESS */
2588899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2589899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* access granted */
2590899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             if (p_callback)
2591899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2592899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc);
2593899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2594899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2595899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2596899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __FUNCTION__, rc,
2597899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                          btm_pair_state_descr(btm_cb.pairing_state));
2598899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return rc;
2599899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2600899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2601899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) ||
2602899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (btm_cb.security_mode == BTM_SEC_MODE_SC)))
2603899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2604899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2605899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives service connection establishment Request for */
2606899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Secure Connections Only service */
2607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2609899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,",
2610899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "remote_support_for_sc %d: fail pairing",__FUNCTION__,
2611899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
2612899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2613899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2614899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2615899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                               BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2616899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2617899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2618ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service     = p_serv_rec;
2622899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    p_dev_rec->security_required = security_required;
26235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2624899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2625899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2626899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2633899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2634899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2635899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                {
2636899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2637899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                }
2638899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2639899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2640899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                          BTM_SEC_AUTHENTICATED);
2641899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2642899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2643899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
2644899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2645899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* If we already have a link key, check if that link key is good enough */
2646899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                btm_sec_check_upgrade(p_dev_rec, is_originator);
2647899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Although authentication and encryption are per connection */
26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization is per access request.  For example when serial connection */
26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* is up and authorized and client requests to read file (access to other */
26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* scn, we need to request user's permission again. */
26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED);
26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2661444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
2662444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2663444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
26707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc);
26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rc;
26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_conn_req
26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when the peer device is requesting
26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection
26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc)
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bda);
26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some device may request a connection before we are done with the HCI_Reset sequence */
269230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->get_is_ready())
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: connect request when device not ready");
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Security guys wants us not to allow connection from not paired devices */
27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection is allowed for only paired devices */
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.connect_only_paired)
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))
27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device");
27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If non-discoverable, only allow known devices to connect */
27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE)
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from not paired device");
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN)))
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device");
27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* incoming connection from bonding device is rejected */
27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT;
27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Host is not interested or approved connection.  Save BDA and DC and */
27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* pass request to L2CAP */
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN);
27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_dc,  dc,  DEV_CLASS_LEN);
27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2c_link_hci_conn_req (bda))
27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* accept the connection -> allocate a device record */
27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec)
27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 |= BTM_SM4_CONN_PEND;
27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_bond_cancel_complete
27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to report bond cancel complete
27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void)
27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) ||
27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
2772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) ||
2773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME &&
2774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta          BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags))
27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* for dedicated bonding in legacy mode, authentication happens at "link level"
27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * btm_sec_connected is called with failed status.
27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * In theory, the code that handles is_pairing_device/TRUE should clean out security related code.
27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * However, this function may clean out the security related flags and btm_sec_connected would not know
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * this function also needs to do proper clean up.
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         */
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL)
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify application that the cancel succeeded */
27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_bond_cancel_cmpl_callback)
27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS);
27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_create_conn_cancel_complete
27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the command complete message
27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the HCI for the create connection cancel
27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command.
27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p)
28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       status;
28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (status, p);
28085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s  status:%d",
28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), status);
28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if the create conn cancel cmd was issued by the bond cancel,
28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the application needs to be notified that bond cancel succeeded
28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (status)
28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_SUCCESS:
28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_CONNECTION_EXISTS:
28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_NO_CONNECTION:
28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify application of the error */
28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_bond_cancel_cmpl_callback)
28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING);
28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_check_pending_reqs
28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called at the end of the security procedure
28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to let L2CAP and RFCOMM know to re-submit any pending requests
28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void)
28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_QUEUE_ENTRY    *p_e;
28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BUFFER_Q                bq;
28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First, resubmit L2CAP requests */
28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.sec_req_pending)
28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.sec_req_pending = FALSE;
28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (NULL);
28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Now, re-submit anything in the mux queue */
28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bq = btm_cb.sec_pending_q;
28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_init_q (&btm_cb.sec_pending_q);
28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL)
28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check that the ACL is still up before starting security procedures */
2861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL)
28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_e->psm != 0)
2864444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u",
2866444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    __FUNCTION__, p_e->psm, p_e->is_orig,
2867444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    p_e->mx_proto_id, p_e->mx_chan_id);
28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2869444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig,
28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->mx_proto_id, p_e->mx_chan_id,
28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->p_callback, p_e->p_ref_data);
2872444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
2873444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else
2874444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2875444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback,
2876444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                      p_e->p_ref_data);
2877444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf (p_e);
28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
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**
28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_init
28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is on the SEC startup
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_init (UINT8 sec_mode)
28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.security_mode = sec_mode;
28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN);
28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY;
28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_device_down
29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called when device is disabled or
29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  turned off
29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void)
29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2913444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() State: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_reset
29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called after device reset
29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void)
29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
292830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (controller_get_interface()->supports_simple_pairing())
29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set the default IO capabilities */
29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS;
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mx service to use no security */
29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX,
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0);
29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode = BTM_SEC_MODE_SERVICE;
29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_abort_access_req
29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP or RFCOMM to abort
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the pending operation.
29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr)
29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING)
29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING))
29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback = NULL;
29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dd_create_conn
29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to create the ACL connection for
29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the dedicated boding process
29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec)
29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB         *p_lcb;
29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure an L2cap link control block is available */
29867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL)
29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up the control block to indicated dedicated bonding */
29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed create  [%02x%02x%02x%02x%02x%02x]",
30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_lcb(p_lcb);
30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_update_busy_level (BTM_BLI_PAGE_EVT);
30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_name_request_complete
30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when remote name was obtained from
30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer device
30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status)
30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int              i;
30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DEV_CLASS        dev_class;
30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sec_state;
30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete");
30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda))
30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr)))
30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_acl_resubmit_page();
30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If remote name request failed, p_bd_addr is null and we need to search */
30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* based on state assuming that we are doing 1 at a time */
30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bd_addr)
30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = btm_find_dev (p_bd_addr);
30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = &btm_cb.sec_dev_rec[0];
30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE)
30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME))
30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_bd_addr = p_dev_rec->bd_addr;
30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (i == BTM_SEC_MAX_DEVICE_RECORDS)
30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = NULL;
30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_bd_name)
30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bd_name = (UINT8 *)"";
30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d State:%d  p_dev_rec: 0x%08x ",
30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status, p_dev_rec->sec_state, p_dev_rec);
30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d",
30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status);
30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        old_sec_state = p_dev_rec->sec_state;
30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30915738f83aeb59361a0a2eda2460113f6dc919427The 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);
30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
30935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */
30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_bd_name[0] = 0;
30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)
31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved */
31055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3107831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class,
31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                 p_dev_rec->sec_bd_name);
31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[0] = 0;
31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[1] = 0;
31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[2] = 0;
31175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved even if not found so clients can continue */
31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3121831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)"");
31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we were delaying asking UI for a PIN because name was not resolved, ask now */
31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr
31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) )
31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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);
31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) &&
31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) &&
31365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_pin_callback)
31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback");
31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
31405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name);
31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the same state again to force the timer to be restarted */
31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we were delaying bonding because name was not resolved */
31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0)
31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status);
3154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD)
3155ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
3156ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_sec_bond_cancel_complete();
3157ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return;
3158ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
3159ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != HCI_SUCCESS)
31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
31635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_cb.api.p_auth_complete_callback)
31657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
31667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                            p_dev_rec->sec_bd_name, status);
31675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */
31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
31737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/
31747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* If it is set, there may be a race condition */
31755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete  IS_SM4_UNKNOWN Flags:0x%04x",
31767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                   btm_cb.pairing_flags);
31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0)
31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
31795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 |= BTM_SM4_KNOWN;
31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
31815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
31825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__,
31847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4),
31857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4));
31867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN.
31885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed)
31895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
31905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec))
31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*  before originating  */
31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
31965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection");
31975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Both we and the peer are 2.1 - continue to create connection */
31995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
32015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection");
32025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
32045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    if (btm_cb.api.p_auth_complete_callback)
32065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
32075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32145344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA");
32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR);
32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if we were delaying link_key_callback because name was not resolved */
32225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->link_key_not_sent)
32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If HCI connection complete has not arrived, wait for it */
32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
32265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = FALSE;
32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_send_link_key_notif(p_dev_rec);
32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If its not us who perform authentication, we should tell stackserver */
32325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* that some authentication has been completed                          */
32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is required when different entities receive link notification and auth complete */
32345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, HCI_SUCCESS);
32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
32465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
32475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)");
32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE);
32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (old_sec_state != BTM_SEC_STATE_GETTING_NAME)
32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If get name failed, notify the waiting layer */
32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event  (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
32615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND)
32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("waiting for remote features!!");
32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remote Name succeeded, execute the next security procedure, if any */
32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_CMD_STARTED)
32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is no next procedure or start of procedure failed, notify the waiting layer */
32787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_sec_dev_rec_cback_event  (p_dev_rec, status, FALSE);
32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_host_support_feat_evt
32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the
32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received
32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p)
32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
32935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR         bd_addr;        /* peer address */
32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_FEATURES     features;
32965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (bd_addr, p);
32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt  sm4: 0x%x  p[0]: 0x%x", p_dev_rec->sm4, p[0]);
33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 = BTM_SM4_KNOWN;
33053aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE);
33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (HCI_SSP_HOST_SUPPORTED(features))
33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
33085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 = BTM_SM4_TRUE;
33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
33105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
33115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_req
33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when LM request for the IO
33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  capability of the local device and
33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if the OOB data is present for the device in the event
33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p)
33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_REQ  evt_data;
33285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           err_code = 0;
33295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         is_orig = TRUE;
33315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           callback_rc = BTM_SUCCESS;
33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* setup the default response according to compile options */
33365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* assume that the local IO capability does not change
33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * loc_io_caps is initialized with the default value */
33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.io_cap = btm_cb.devcb.loc_io_caps;
33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.oob_data = BTM_OOB_NONE;
33405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.auth_req = BTM_DEFAULT_AUTH_REQ;
33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3342899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s", __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state));
33435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
3345899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3346899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", __FUNCTION__,
3347899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                      btm_cb.security_mode, p_dev_rec->num_read_pages);
3348899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3349899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0))
3350899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3351899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Device security mode is SC only.",
3352899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         "To continue need to know remote features.", __FUNCTION__);
3353899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3354899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = TRUE;
3355899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return;
3356899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3357899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
33585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 |= BTM_SM4_TRUE;
33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3360899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s  Flags: 0x%04x  p_cur_service: 0x%08x",
3361899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state),
3362899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     btm_cb.pairing_flags, p_dev_rec->p_cur_service);
33635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3364899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->p_cur_service)
33655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3366899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x",
3367899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, p_dev_rec->p_cur_service->psm,
3368899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         p_dev_rec->p_cur_service->security_flags);
3369899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3370899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3371899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    switch (btm_cb.pairing_state)
3372899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3373899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator connecting */
3374899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_IDLE:
3375899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //TODO: Handle Idle pairing state
3376899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //security_required = p_dev_rec->security_required;
3377899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3378899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3379899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* received IO capability response already->acceptor */
3380899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_INCOMING_SSP:
33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_orig = FALSE;
33825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD)
3384899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3385899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* acceptor in dedicated bonding */
33865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
3387899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3388899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3389899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3390899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator, at this point it is expected to be dedicated bonding
3391899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        initiated by local device */
3392899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_WAIT_PIN_REQ:
3393899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN))
33945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3395899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
33965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
33975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
33985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                err_code = HCI_ERR_HOST_BUSY_PAIRING;
34005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* any other state is unexpected */
3404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        default:
34055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err_code = HCI_ERR_HOST_BUSY_PAIRING;
3406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __FUNCTION__,
3407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             btm_cb.pairing_state);
3408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
34095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_disabled)
3412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3413899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* pairing is not allowed */
3414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __FUNCTION__);
34155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3416899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
3420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* device in Secure Connections Only mode */
3421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
3422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,",
3424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            " remote_support_for_sc 0x%02x -> fail pairing", __FUNCTION__,
3425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
3426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3428899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
34305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (err_code != 0)
34325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
34345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
34355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
34365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
34375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code);
34385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
34395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.is_orig = is_orig;
34425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_orig)
34445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local device initiated the pairing non-bonding -> use p_cur_service */
34465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
34475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_cur_service &&
34485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE))
34495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* SC only mode device requires MITM protection */
3453899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_AUTH_SP_YES;
3454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3455899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
3456899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3457899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags &
3458899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                     BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO;
3459899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
34645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
34655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
34675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
34695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
34705738f83aeb59361a0a2eda2460113f6dc919427The 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);
34715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
34725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
34735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
34745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS);
34765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    callback_rc = BTM_SUCCESS;
34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_UPGRADE)
34795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE;
34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */
34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.auth_req = BTM_AUTH_SPGB_YES;
34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.api.p_sp_callback)
34865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* the callback function implementation may change the IO capability... */
34885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
34925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data))
34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (callback_rc == BTM_SUCCESS)
34955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT));
35005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
35015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3502899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3503899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* At this moment we know that both sides are SC capable, device in */
3505899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* SC only mode requires MITM for any service so let's set MITM bit */
3506899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            evt_data.auth_req |= BTM_AUTH_YN_BIT;
3507899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x",
3508899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             __FUNCTION__, evt_data.auth_req);
3509899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3510899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3511899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* if the user does not indicate "reply later" by setting the oob_data to unknown */
3512899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* send the response right now. Save the current IO capability in the control block */
35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = evt_data.auth_req;
35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = evt_data.io_cap;
35155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3516899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: State: %s  IO_CAP:%d oob_data:%d auth_req:%d",
3517899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap,
3518899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         evt_data.oob_data, evt_data.auth_req);
35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap,
35215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    evt_data.oob_data, evt_data.auth_req);
35225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_rsp
35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the IO capability of the
35305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  specified device is received
35315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p)
35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_RSP evt_data;
35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.io_cap, p);
35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.oob_data, p);
35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.auth_req, p);
35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Allocate a new device record or reuse the oldest one */
35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
35475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no security is in progress, this indicates incoming security */
35495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
35505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
35525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP);
35545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
35565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
35575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* work around for FW bug */
35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_stop_on_ssp();
35605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
35635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We must have a device record here.
35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * Use the connecting device's CoD for the connection */
35675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
35695738f83aeb59361a0a2eda2460113f6dc919427The 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);
35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */
35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */
35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (evt_data.auth_req & BTM_AUTH_DD_BOND) )            /* and dedicated bonding bit is set */
35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD;
35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save the IO capability in the device record */
35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_io_caps  = evt_data.io_cap;
35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_auth_req = evt_data.auth_req;
35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_proc_sp_req_evt
35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_USER_CONFIRMATION_REQUEST_EVT
35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_REQUEST_EVT
35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_NOTIFY_EVT
35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p)
36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_ERR_PROCESSING;
36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_EVT_DATA evt_data;
36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p_bda = evt_data.cfm_req.bd_addr;
36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All events start with bd_addr */
36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
36125738f83aeb59361a0a2eda2460113f6dc919427The 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],
36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      event, btm_pair_state_descr(btm_cb.pairing_state));
36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL)
36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36225738f83aeb59361a0a2eda2460113f6dc919427The 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);
36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_CFM_REQ_EVT:
36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Numeric confirmation. Need user to conf the passkey */
36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM);
36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* The device record must be allocated in the "IO cap exchange" step */
36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p);
36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.just_works = TRUE;
36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* process user confirm req in association with the auth_req param */
36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO)
36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO)
36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO)
36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) )
36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Both devices are DisplayYesNo and one or both devices want to authenticate
36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       -> use authenticated link key */
36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    evt_data.cfm_req.just_works = FALSE;
36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_proc_sp_req_evt()  just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps,
36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req);
36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_auth_req   = btm_cb.devcb.loc_auth_req;
36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_auth_req   = p_dev_rec->rmt_auth_req;
36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_io_caps    = btm_cb.devcb.loc_io_caps;
36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_io_caps    = p_dev_rec->rmt_io_caps;
36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_NOTIF_EVT:
36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Passkey notification (other side is a keyboard) */
36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.key_notif.passkey, p);
36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT:  passkey: %u", evt_data.key_notif.passkey);
36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_REQ_EVT:
36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* HCI_USER_PASSKEY_REQUEST_EVT */
36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY);
36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_sp_callback)
36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data);
36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != BTM_NOT_AUTHORIZED)
36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */
36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) )
36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* automatically reply with just works if no sp_cback */
36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_SUCCESS;
36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event == BTM_SP_CFM_REQ_EVT)
36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status);
36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_ConfirmReqReply (status, p_bda);
36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (event == BTM_SP_KEY_REQ_EVT)
36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_PasskeyReqReply(status, p_bda, 0);
36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Something bad. we can only fail this connection */
37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
37045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SP_CFM_REQ_EVT == event)
37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (p_bda, FALSE);
37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (BTM_SP_KEY_NOTIF_EVT == event)
37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do nothing -> it very unlikely to happen.
37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        This event is most likely to be received by a HID host when it first connects to a HID device.
37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        Usually the Host initiated the connection in this case.
37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        On Mobile platforms, if there's a security process happening,
37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        the host probably can not initiate another connection.
37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTW (PC) is another story.  */
37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (NULL != (p_dev_rec = btm_find_dev (p_bda)) )
37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE);
37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply(p_bda);
37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_keypress_notif_evt
37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a key press notification is
37355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received
37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid  btm_keypress_notif_evt (UINT8 *p)
37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_KEYPRESS    evt_data;
37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse & report BTM_SP_KEYPRESS_EVT */
37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bda = evt_data.bd_addr;
37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_BDADDR (p_bda, p);
37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.notif_type = *p;
37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_simple_pair_complete
37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when simple pairing process is
37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  complete
37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p)
37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_COMPLT  evt_data;
37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status;
37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         disc = FALSE;
37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = *p++;
37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL)
37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
37805738f83aeb59361a0a2eda2460113f6dc919427The 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],
37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]);
37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_simple_pair_complete()  Pair State: %s  Status:%d  sec_state: %u",
37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),  status, p_dev_rec->sec_state);
37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.status = BTM_ERR_PROCESSING;
37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_PAIRING_NOT_ALLOWED)
37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The test spec wants the peer device to get this failure code. */
37995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT);
38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Change the timer to 1 second */
38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT);
38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0)
38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop the timer */
38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&btm_cb.pairing_tle);
38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* the initiating side: will receive auth complete event. disconnect ACL at that time */
38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                disc = TRUE;
38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
38165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc = TRUE;
38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Let the pairing state stay active, p_auth_complete_callback will report the failure */
38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
38245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (disc)
38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* simple pairing failed */
3829db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        /* Avoid sending disconnect on HCI_ERR_PEER_USER */
3830db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))
3831db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
3832db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
3833db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_rem_oob_req
38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_REMOTE_OOB_DATA_REQUEST_EVT
38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p)
38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
38515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_RMT_OOB  evt_data;
38525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
38535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      c;
38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      r;
38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bda = evt_data.bd_addr;
38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) &&
38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         btm_cb.api.p_sp_callback)
38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        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);
3869ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_data.bd_name[BTM_MAX_REM_BD_NAME_LEN] = 0;
38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP);
38725738f83aeb59361a0a2eda2460113f6dc919427The 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)
38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_RemoteOobDataReply(TRUE, p_bda, c, r);
38755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
38775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* something bad. we can only fail this connection */
38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_rem_oob_neg_reply (p_bda);
38825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_read_local_oob_complete
38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when read local oob data is
38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p)
38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_LOC_OOB evt_data;
38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status = *p++;
38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status);
39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.c, p);
39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.r, p);
39055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_ERR_PROCESSING;
39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */
39135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_collision
39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when authentication or encryption
39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  needs to be retried at a later time.
39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle)
39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btm_cb.collision_start_time)
3929c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati        btm_cb.collision_start_time = GKI_get_os_tick_count();
39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3931c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    if ((GKI_get_os_tick_count() - btm_cb.collision_start_time) < btm_cb.max_collision_delay)
39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (handle == BTM_SEC_INVALID_HANDLE)
39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL)
39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING);
39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_find_dev_by_handle (handle);
39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec != NULL)
39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
39445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We will restart authentication after timeout */
39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_state = 0;
39475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_collided_dev_rec = p_dev_rec;
39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.sec_collision_tle.param = (UINT32) btm_sec_collision_timeout;
39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT);
39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_complete
39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when authentication of the connection is
39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status)
39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sm4;
39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state   = btm_cb.pairing_state;
39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             are_bonding = FALSE;
39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
39745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d  dev->sec_state: %u  Bda:%08x, RName:%s",
39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status,
39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_state,
39815738f83aeb59361a0a2eda2460113f6dc919427The 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],
39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d",
39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status);
39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
39945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection was made just to do bonding.  If we authenticate
40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       the connection that is up, this is the last event received.
40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec
40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))
40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* keep the old sm4 flag and clear the retry bit in control block */
40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_sm4 = p_dev_rec->sm4;
40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= ~BTM_SM4_RETRY;
40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        are_bonding = TRUE;
40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4027e11f228d1a18486cd00c36487812a763487a236fSrinu Jella    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
4028e11f228d1a18486cd00c36487812a763487a236fSrinu Jella          &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
4029e11f228d1a18486cd00c36487812a763487a236fSrinu Jella        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS)
40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             &&  (old_state != BTM_PAIR_STATE_IDLE) )
40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be a race condition, when we are starting authentication and
40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the peer device is doing encryption.
40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If first we receive encryption change up, then initiated authentication
40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** can not be performed.  According to the spec we can not do authentication
40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** on the encrypted link, so device is correct.
40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_COMMAND_DISALLOWED)
40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) ==
40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)))
40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HCI_SUCCESS;
40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Currently we do not notify user if it is a keyboard which connects */
40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* User probably Disabled the keyboard while it was asleap.  Let her try */
40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_auth_complete_callback)
40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* report the suthentication status */
40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state != BTM_PAIR_STATE_IDLE)
40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
40625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (are_bonding)
40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
40725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != HCI_SUCCESS)
4074db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
4075db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)))
4076db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
4077db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
40785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4079444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4080444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL");
4081e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec))
4082e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* no LE keys are available, do deriving */
4083e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4084e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4085e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) &&
4086e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4087444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4088444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL");
40895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (btm_sec_is_master(p_dev_rec))
4091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
4092e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // Encryption is required to start SM over BR/EDR
4093e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // indicate that this is encryption after authentication
4094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL);
4095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
4096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4097444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
4098444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4099e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
41005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If authentication failed, notify the waiting layer */
41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
41055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((old_sm4 & BTM_SM4_RETRY) == 0)
41075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* allow retry only once */
41095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION)
41105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* this retry for missing key is for Lisbon or later only.
41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * Legacy device do not need this. the controller will drive the retry automatically */
41175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4))
41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
41225344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* With BRCM controller, we do not need to delete the stored link key in controller.
41255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                If the stack may sit on top of other controller, we may need this
41265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_DeleteStoredLinkKey (bd_addr, NULL); */
41275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sm4 & BTM_SM4_RETRY)
41305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_execute_procedure (p_dev_rec);
41325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
41335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
41375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
41395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
41415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
41465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Authentication succeeded, execute the next security procedure, if any */
41485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_execute_procedure (p_dev_rec);
41495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
41527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_encrypt_change
41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when encryption of the connection is
41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable)
41665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
41675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
4168ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
41697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN       *p_acl = NULL;
41707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8           acl_idx = btm_handle_to_acl_index(handle);
4171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
41725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
41735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable);
41745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
41775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
4178e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) ||
4179e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
41805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
41825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && encr_enable)
41907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
41917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->hci_handle == handle)
41927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
41937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
41947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
41957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
41965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* It is possible that we decrypted the link to perform role switch */
41985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* mark link not to be encrypted, so that when we execute security next time it will kick in again */
41995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && !encr_enable)
42007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
42017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->hci_handle == handle)
42027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
42037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
42047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED;
42057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
42065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
4208ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4210e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (acl_idx != MAX_L2CAP_LINKS)
42117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_acl = &btm_cb.acl_db[acl_idx];
4212ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_sec_check_pending_enc_req (p_dev_rec, p_acl->transport, encr_enable);
4214444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
42157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_acl && p_acl->transport == BT_TRANSPORT_LE)
42165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4217e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE ||
4218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)
4219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4220d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN);
4221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
4222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4223dea4f9b42fd373d8a46565d933ec49a6583a9117Satya Calloji        btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable);
42245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4227e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    {
42285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* BR/EDR connection, update the encryption key size to be 16 as always */
42295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->enc_key_size = 16;
4230e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    }
4231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4232e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun     BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d",
4233e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                       __func__, p_dev_rec->new_encryption_key_is_p256);
4234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle))
4236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec->new_encryption_key_is_p256)
4238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4239444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_sec_use_smp_br_chnl(p_dev_rec) &&
4240e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                btm_sec_is_master(p_dev_rec) &&
4241e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* if LE key is not known, do deriving */
4242e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4243e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4244e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
4245e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* BR/EDR is encrypted with LK that can be used to derive LE LTK */
4248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                p_dev_rec->new_encryption_key_is_p256 = FALSE;
4249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4250e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                if (p_dev_rec->no_smp_on_br)
4251e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4252e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s NO SM over BR/EDR", __func__);
4253e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4254e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                else
4255e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4256e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s start SM over BR/EDR", __func__);
4257e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    SMP_BR_PairWith(p_dev_rec->bd_addr);
4258e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
4262e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        {
4263e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // BR/EDR is successfully encrypted. Correct LK type if needed
4264e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // (BR/EDR LK derived from LE LTK was used for encryption)
4265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((encr_enable == 1)  && /* encryption is ON for SSP */
4266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* LK type is for BR/EDR SC */
4267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 ||
4268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                 p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)
4271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB;
4272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */
4273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB;
4274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("updated link key type to %d", p_dev_rec->link_key_type);
4276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                btm_send_link_key_notif(p_dev_rec);
4277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else
4281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_sec_check_pending_enc_req (p_dev_rec, BT_TRANSPORT_BR_EDR, encr_enable);
4282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */
42835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this encryption was started by peer do not need to do anything */
42855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING)
42865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state)
42885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
42895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
42905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
42915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
42925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
42935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
42975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If encryption setup failed, notify the waiting layer */
42985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
42995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
43015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
43025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Encryption setup succeeded, execute the next security procedure, if any */
43055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
43065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
43075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
43087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
43095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connect_after_reject_timeout
43145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Connection for bonding could not start because of the collision
43165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Initiate outgoing connection
43175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
43195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
43215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_connect_after_reject_timeout (TIMER_LIST_ENT *p_tle)
43225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec;
43245cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
43255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_connect_after_reject_timeout()");
43275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.sec_collision_tle.param = 0;
43285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_collided_dev_rec = 0;
43295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
43315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection");
43335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
43355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (btm_cb.api.p_auth_complete_callback)
43375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
43385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
43395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connected
43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establsihed
43485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
43525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode)
43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda);
43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            res;
43565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          is_pairing_device = FALSE;
43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tACL_CONN        *p_acl_cb;
43587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8            bit_shift = 0;
43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
43615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
43655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
43665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x RName:%s",
43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
43695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
43715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x ",
43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
43795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no device record for new connection.  Allocate one */
43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* can not find the device record and the status is error,
43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * just ignore it */
43915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
43935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else    /* Update the timestamp for this device */
43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
43977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
43987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0;
43997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->timestamp = btm_cb.dev_rec_count++;
44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell L2CAP it's a bonding connection. */
44045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if incoming connection failed while pairing, then try to connect and continue */
44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Motorola S9 disconnects without asking pin code */
44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ))
44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
44125344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* Start timer with 0 to initiate connection with new LCB */
44185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* because L2CAP will delete current LCB with this event  */
44195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_cb.p_collided_dev_rec = p_dev_rec;
44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout;
44215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0);
44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
44245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
44255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
44267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                        BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR);
44275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
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                    return;
44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
44345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
44355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE);
44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* always clear the pending flag */
44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
44447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
44457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
44467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
44495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
44505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4452ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) )
44555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection from bonding device */
44575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((status == HCI_ERR_HOST_REJECT_DEVICE)
44585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT))
44595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags, p_dev_rec->sm4);
44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT;
44645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
44655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
44687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR);
44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
44705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
44715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if we already have pin code */
44735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Start timer with 0 to initiate connection with new LCB */
44765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* because L2CAP will delete current LCB with this event  */
44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.p_collided_dev_rec = p_dev_rec;
44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout;
44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0);
44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* wait for incoming connection without resetting pairing state */
44855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (status == HCI_ERR_CONNECTION_EXISTS)
44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection");
44885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
44895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_pairing_device = TRUE;
44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
44955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
44965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if connection fails during pin request, notify application */
44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
44995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If connection failed because of during pairing, need to tell user */
45015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_pairing_device)
45025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift);
45055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required );
45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
45155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /*
45187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta     Do not send authentication failure, if following conditions hold good
45197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      1.  BTM Sec Pairing state is idle
45207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      2.  Link key for the remote device is present.
45217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      3.  Remote is SSP capable.
45227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta  */
45237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else if  ((p_dev_rec->link_key_type  <= BTM_LKEY_TYPE_REMOTE_UNIT) &&
45247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (((status == HCI_ERR_AUTH_FAILURE)                      ||
45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_KEY_MISSING)                         ||
45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_HOST_REJECT_SECURITY)                ||
45275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_NOT_ALLOWED)                 ||
45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_UNIT_KEY_USED)                       ||
45295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)           ||
45317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (status == HCI_ERR_REPEATED_ATTEMPTS))))
45325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift);
45357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
45367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
45377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE
45387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* If we rejected pairing, pass this special result code */
45397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY)
45407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
45417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                status = HCI_ERR_HOST_REJECT_SECURITY;
45427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
45437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
45445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
45505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT  ||
45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status == HCI_ERR_UNSPECIFIED     || status == HCI_ERR_PAGE_TIMEOUT)
45567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE);
45575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
45587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
45595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
45615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If initiated dedicated bonding, return the link key now, and initiate disconnect */
45645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If dedicated bonding, and we now have a link key, we are all done */
45655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_pairing_device
45665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) )
45675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->link_key_not_sent)
45695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->link_key_not_sent = FALSE;
45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_send_link_key_notif(p_dev_rec);
45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remember flag before it is initialized */
45775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
45785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = TRUE;
45795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
45805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = FALSE;
45815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
45835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
45855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
45865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( res )
45905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Let l2cap start bond timer */
45925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE);
45935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
45965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
45995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* role may not be correct here, it will be updated by l2cap, but we need to */
46015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notify btm_acl that link is up, so starting of rmt name request will not */
46025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set paging flag up */
46037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR);
46045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_acl_cb)
46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */
46075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* For now there are a some devices that do not like sending */
46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* commands events and data at the same time. */
46105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the packet types to the default allowed by the device */
46115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.btm_def_link_policy)
46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
46155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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);
46185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize security flags.  We need to do that because some            */
46205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization complete could have come after the connection is dropped */
46215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* and that would set wrong flag that link has been authorized already    */
46227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
46237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift);
46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (enc_mode != HCI_ENCRYPT_MODE_DISABLED)
46267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift);
46275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode == BTM_SEC_MODE_LINK)
46297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift);
46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->link_key_changed = FALSE;
46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* After connection is established we perform security if we do not know */
46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the name, or if we are originator because some procedure can have */
46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* been scheduled while connection was down */
46365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator);
46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator)
46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
46407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnect
46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to disconnect HCI link
46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          btm status
46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason)
46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
46565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* In some weird race condition we may not have a record */
46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_disconnect (handle, reason);
46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we are currently doing bonding.  Link will be disconnected when done */
46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
46725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_BUSY);
46735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
46765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnected
46815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  dropped
46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
46865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
46885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason)
46895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
46905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
46915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8             old_pairing_flags = btm_cb.pairing_flags;
46925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               result = HCI_ERR_AUTH_FAILURE;
4693ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    tBTM_SEC_CALLBACK   *p_callback = NULL;
46947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT      transport = BT_TRANSPORT_BR_EDR;
46955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If page was delayed for disc complete, can do it now */
46975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.discing = FALSE;
46985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
47005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
47025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
47035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    transport  = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE;
47057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
4706ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4707ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
47085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
4709f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    LOG_INFO("%s clearing pending flag handle:%d reason:%d", __func__, handle, reason);
47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
47115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear unused flags */
47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= BTM_SM4_TRUE;
47155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4716f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr;
4717f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x"
4718f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            "  remote_name:%s", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state),
4719f8027005333c88a2f097cfd70d15c3d54c7764aeChris 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);
47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4721f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0))
47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the disconnection reason is REPEATED_ATTEMPTS,
47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               send this error message to complete callback function
47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               to display the error message of Repeated attempts.
47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               All others, send HCI_ERR_AUTH_FAILURE. */
47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (reason == HCI_ERR_REPEATED_ATTEMPTS)
47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_REPEATED_ATTEMPTS;
47385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
47395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_HOST_REJECT_SECURITY;
47425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
47435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,     p_dev_rec->dev_class,
47445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, result);
47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
47465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
47495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->enc_key_size = 0;
475024adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera    btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS);
47515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* see sec_flags processing in btm_acl_removed */
47527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
47537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
47547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
47557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE;
47567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED);
47577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
47587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
47595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
47607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
47617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
47627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
47637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
47645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4765444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4766444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)
4767444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4768444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ?
4769444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
4770444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return;
4771444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4772444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
47737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
47745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_NONE;
4775ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4776ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    p_callback = p_dev_rec->p_callback;
4777ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4778ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    /* if security is pending, send callback to clean up the security state */
4779ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    if(p_callback)
4780ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    {
4781ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before
4782ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach                                         we do, this call back must be reset here */
47837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
4784ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    }
4785ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4786f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
47875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_notification
47925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a new connection link key is
47945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  generated
47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
47975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type)
48005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
4802444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         we_are_bonding = FALSE;
4803444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         ltk_derived_lk  = FALSE;
48045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_notification()  BDA:%04x%08x, TYPE: %d",
48065738f83aeb59361a0a2eda2460113f6dc919427The 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],
48075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      key_type);
48085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) &&
4810444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256))
4811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4812444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        ltk_derived_lk = TRUE;
4813444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        key_type -= BTM_LTK_DERIVED_LKEY_OFFSET;
4814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
48165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
48175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_type != BTM_LKEY_TYPE_CHANGED_COMB)
48195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_type = key_type;
48205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
4822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
4823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* BR/EDR connection, update the encryption key size to be 16 as always */
4824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->enc_key_size = 16;
4825ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
48265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN);
48275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
48295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
48305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
48325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            we_are_bonding = TRUE;
48335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
48345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
48355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4837444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* save LTK derived LK no matter what */
4838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (ltk_derived_lk)
4839444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (btm_cb.api.p_link_key_callback)
4841444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4842444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)",
4843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                  __FUNCTION__, p_dev_rec->link_key_type);
4844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_dev_rec->sec_bd_name,
4846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_link_key, p_dev_rec->link_key_type);
4847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else
4850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) ||
4852444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4854e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun             p_dev_rec->new_encryption_key_is_p256 = TRUE;
4855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji             BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d",
4856e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                               __func__, p_dev_rec->new_encryption_key_is_p256);
4857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
48605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If name is not known at this point delay calling callback until the name is   */
48615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* resolved. Unless it is a HID Device and we really need to send all link keys. */
48625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
4863e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        &&  ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL))
4864e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        && !ltk_derived_lk)
48655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_link_key_notification()  Delayed BDA: %08x%04x Type:%d",
4867444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3],
4868444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[4] << 8) + p_bda[5], key_type);
48695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = TRUE;
48715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If it is for bonding nothing else will follow, so we need to start name resolution */
48735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (we_are_bonding)
48745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
48755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0)))
48765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_inq_rmt_name_failed();
48775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
48785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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])
48805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
48815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If its not us who perform authentication, we should tell stackserver */
48845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* that some authentication has been completed                          */
48855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This is required when different entities receive link notification and auth complete */
4886e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)
4887e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        /* for derived key, always send authentication callback for BR channel */
4888e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun         || ltk_derived_lk)
48895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
48915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
48925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
48935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We will save link key only if the user authorized it - BTE report link key in all cases */
48965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE
48975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
48985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
48995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_link_key_callback)
49015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4902e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (ltk_derived_lk)
4903e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4904e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                BTM_TRACE_DEBUG ("btm_sec_link_key_notification()  LTK derived LK is saved already"
4905e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                    " (key_type = %d)", p_dev_rec->link_key_type);
4906e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
4907e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            else
4908e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4909e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4910e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_dev_rec->sec_bd_name,
4911e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_link_key, p_dev_rec->link_key_type);
4912e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
49135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
49145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
49165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
49185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
49205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
49225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
49245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
49265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda)
49275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
49285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
49295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_request()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
49315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
49325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4933b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
4934b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (btm_cb.collision_start_time != 0) &&
4935b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) )
4936b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    {
4937b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req "
4938b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta            "State: %d START_TIMEOUT : %d",
4939b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta             btm_cb.pairing_state, btm_cb.collision_start_time);
4940b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        btsnd_hcic_link_key_neg_reply (p_bda);
4941b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        return;
4942b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    }
49435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
49445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key);
49465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
49475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
49505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (p_bda);
49515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The link key is not in the database and it is not known to the manager */
49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_link_key_neg_reply (p_bda);
49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pairing_timeout
49595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when host does not provide PIN
49615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  within requested time
49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
49665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle)
49675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
49685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
49695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE)
49725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_NO;
49735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
49745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_YES;
49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name[2];
49785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->pairing_tle.param = 0;
49815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */
49825738f83aeb59361a0a2eda2460113f6dc919427The 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.
49835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
49845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (p_cb->pairing_bda);
49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_pairing_timeout()  State: %s   Flags: %u",
49875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags);
49885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->pairing_state)
49905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:
49925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
49935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
49945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:
49965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0)
49975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda);
49985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
49995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that no longer need the PIN */
50005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
50015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
50035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
50045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
50095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:
50175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE);
50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:
50235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda);
50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */
50275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
50295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:
50305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                auth_req |= BTM_AUTH_DD_BOND;
50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps,
50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         BTM_OOB_NONE, auth_req);
50355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:
50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda);
50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */
50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:
50455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* simple pairing failed. Started a 1-sec timer at simple pairing complete.
50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * now it's time to tear down the ACL link*/
50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec == NULL)
50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
50505738f83aeb59361a0a2eda2460113f6dc919427The 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],
50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]);
50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:
505905bb84c66dc4813b5da13a7d2db27e80fb613293Srinu Jella        case BTM_PAIR_STATE_GET_REM_NAME:
50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that timeout has happened while waiting for authentication*/
50615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
50655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
50795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state));
50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pin_code_request
50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests PIN code
50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda)
50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB          *p_cb = &btm_cb;
50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
509957bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#ifdef PORCHE_PAIRING_CONFLICT
510057bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath    UINT8 default_pin_code_len = 4;
510157bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath    PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30};
510257bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#endif
51035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_pin_code_request()  State: %s, BDA:%04x%08x",
51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),
51055738f83aeb59361a0a2eda2460113f6dc919427The 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] );
51065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
51085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0)  &&
51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) )
51115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* fake this out - porshe carkit issue - */
51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//            btm_cb.pairing_state = BTM_PAIR_STATE_IDLE;
51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             if(! btm_cb.pin_code_len_saved)
51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
51165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 btsnd_hcic_pin_code_neg_reply (p_bda);
51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 return;
51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             }
51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             else
51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code);
51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      	         return;
51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             }
51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ)
51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
51285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s",
51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                btm_pair_state_descr(btm_cb.pairing_state));
51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
51325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reply pin code again due to counter in_rand when local initiates pairing */
51335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing");
51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(! btm_cb.pin_code_len_saved)
51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
513657bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
513757bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath                btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code);
51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code);
51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (p_bda);
51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (p_bda);
51525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* received PIN code request. must be non-sm4 */
51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 = BTM_SM4_KNOWN;
51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN);
51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD;
51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
51615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
51625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED))
51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying");
51675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code);
51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use the connecting device's CoD for the connection */
51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN))
51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) )
51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN);
51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We could have started connection after asking user for the PIN code */
51785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len != 0)
51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply");
51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code);
51825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
51845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len_saved = btm_cb.pin_code_len;
51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark that we forwarded received from the user PIN code */
51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = 0;
51895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can change mode back right away, that other connection being established */
51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* is not forced to be secure - found a FW issue, so we can not do this
51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode(); */
51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If pairing disabled OR (no PIN callback and not bonding) */
51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* OR we could not allocate entry in the database reject pairing request */
51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_cb->pairing_disabled
52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (p_cb->api.p_pin_callback == NULL)
52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* OR Microsoft keyboard can for some reason try to establish connection */
52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  the only thing we can do here is to shut it up.  Normally we will be originator */
52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  for keyboard bonding */
52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (!p_dev_rec->is_originator
52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
52075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) )
52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
52105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec);
52115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_neg_reply (p_bda);
52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify upper layer of PIN request and start expiration timer */
52155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
52165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len_saved = 0;
52185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
52195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Pin code request can not come at the same time as connection request */
52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN);
52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if the name is known */
52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Even if name is not known we might not be able to get one */
52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this is the case when we are already getting something from the */
52265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* device, so HCI level is flow controlled */
52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Also cannot send remote name request while paging, i.e. connection is not completed */
52285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
52295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for 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        else
52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name");
52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We received PIN code request for the device with unknown name */
52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* it is not user friendly just to ask for the PIN without name */
52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* try to get name at first */
52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr,
52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_PAGE_SCAN_REP_MODE_R1,
52455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_MANDATARY_PAGE_SCAN_MODE, 0))
52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
52485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[0] = 'f';
52495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[1] = '0';
52505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback");
52515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
52535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_cb->api.p_pin_callback)
52545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name);
52555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
52565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
52605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
52615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
52635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_update_clock_offset
52655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to update clock offset
52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset)
52725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
52735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO     *p_inq_info;
52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL)
52775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
52785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL)
52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
52835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************
52895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C     F U N C T I O N S
52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/
52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_execute_procedure
52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start required security
52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  procedure.  There is a case when multiplexing protocol
52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  calls this function on the originating side, connection to
52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer will not be established.  This function in this
53005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  case performs only authorization.
53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS     - permission is granted
53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED - in process
53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES  - permission declined
53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec)
53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
53095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state);
53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is a chance that we are getting name.  Wait until done. */
53135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != 0)
53145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If any security is required, get the name first */
53175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
53185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start get name");
53215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_get_name (p_dev_rec))
53225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authenticated and authentication is required */
53295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authentication and return PENDING to the caller */
53305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
53315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE)))
53335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
53375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
53385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
53395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
53405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start authentication");
53425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
53445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
53465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not encrypted and encryption is required */
53515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start encryption and return PENDING to the caller */
53525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
53535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT))
53545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT)))
53555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
53565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
53585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
53595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
53615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
53625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start encryption");
53645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_encryption (p_dev_rec))
53665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
53685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5372899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
5373899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
5374899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
5375899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -",
5376899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        "security failure", __FUNCTION__, p_dev_rec->link_key_type);
5377899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return (BTM_FAILED_ON_SECURITY);
5378899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
5379899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
53805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authorized and authorization is required */
53815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authorization and return PENDING to the caller */
53825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
53835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE))
53845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE))))
53855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("service id:%d, is trusted:%d",
53875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->p_cur_service->service_id,
53885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
53895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                      p_dev_rec->p_cur_service->service_id)));
53905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) &&
53915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) &&
53925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
53935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_dev_rec->p_cur_service->service_id) == FALSE))
53945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53955344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: Start authorization");
53965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(btm_sec_start_authorization (p_dev_rec));
53975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All required  security procedures already established */
54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE |
54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE |
54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT |
54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER |
54055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
54065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
54085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: access granted");
54095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_SUCCESS);
54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_get_name
54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start get name procedure
54195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec)
54245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 tempstate = p_dev_rec->sec_state;
54265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME;
54285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Device should be connected, no need to provide correct page params */
54305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* 0 and NULL are as timeout and callback params because they are not used in security get name case */
54315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC,
54325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                0, NULL)) != BTM_CMD_STARTED)
54335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_state = tempstate;
54355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
54365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
54395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authentication
54445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authentication
54465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec)
54515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
54535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btsnd_hcic_auth_request (p_dev_rec->hci_handle));
54555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_encryption
54605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start encryption
54625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec)
54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE))
54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
54705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
54725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
54735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authorization
54795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authorization
54815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec)
54865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    result;
54885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_service_name = NULL;
54895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    service_id;
54905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
54925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE))
54935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_cb.api.p_authorize_callback)
54955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_MODE_UNSUPPORTED);
54965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->p_cur_service)
54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->is_originator)
55015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->orig_service_name;
55025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
55035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->term_service_name;
55045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
55055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = p_dev_rec->p_cur_service->service_id;
55065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
55075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
55085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = 0;
55095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5510ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Send authorization request if not already sent during this service connection */
5511ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
5512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            || p_dev_rec->last_author_service_id != service_id)
5513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
5514ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING;
5515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr,
55165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->dev_class,
55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->sec_bd_name,
55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_service_name,
55195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     service_id,
55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->is_originator);
5521ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5523ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else    /* Already authorized once for this L2CAP bringup */
5524ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
55255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
5526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            return (BTM_SUCCESS);
5527ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5528ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (result == BTM_SUCCESS)
55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED;
5532ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5533ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Save the currently authorized service in case we are asked again by another multiplexer layer */
5534ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (!p_dev_rec->is_originator)
5535ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_dev_rec->last_author_service_id = service_id;
5536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
55375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(result);
55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_start_get_name (p_dev_rec);
55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_are_all_trusted
55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called check if all services are trusted
55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if all are trusted, otherwise FALSE
55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[])
55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT32 trusted_inx;
55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++)
55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL)
55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(FALSE);
55615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_first_serv
55695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the first record in the service database
55715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
55725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
55745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm)
55775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
55795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
55805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
55815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
55835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_ORIG_MASK )
55855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
55865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
55875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
55885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
55915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm)
55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the PSM matches p_out_serv,
55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, just find the first record with the specified PSM */
56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) )
56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_next_serv
56125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the next record in the service database
56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur)
56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec   = &btm_cb.sec_serv_rec[0];
56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               i;
56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
56255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
56275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == p_cur->psm) )
56285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cur != p_serv_rec)
56305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(p_serv_rec);
56325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
56365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_mx_serv
56425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the service database with specified
56445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PSM and multiplexor channel information
56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
56475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
56505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id, UINT32 mx_chan_id)
56515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv;
56535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
56545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
56555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5656444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
56575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && p_out_serv && p_out_serv->psm == psm
56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->mx_proto_id == mx_proto_id
56595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->orig_mx_chan_id == mx_chan_id)
56605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the parameters match p_out_serv,
56625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
56635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
56645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, the old way */
56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == psm)
56715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->mx_proto_id == mx_proto_id)
56725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (( is_originator && (p_serv_rec->orig_mx_chan_id  == mx_chan_id))
56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                || (!is_originator && (p_serv_rec->term_mx_chan_id  == mx_chan_id))))
56745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
56765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
56795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_collision_timeout
56855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Encryption could not start because of the collision
56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  try to do it again
56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle)
56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56945cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5696444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()", __func__);
56975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.sec_collision_tle.param = 0;
56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5699444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec);
57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
57035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no next procedure or start of procedure failed, notify the waiting layer */
57057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE);
57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec)
57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_link_key_callback)
57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->sec_bd_name, p_dev_rec->link_key,
57235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->link_key_type);
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_ReadTrustedMask
57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get trusted mask for the peer device
57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr   - Address of the device
57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          NULL, if the device record is not found.
57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  otherwise, the trusted mask
57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr)
57395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5740444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
5741444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec != NULL)
57425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(p_dev_rec->trusted_mask);
5743444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return NULL;
57445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_restore_mode
57495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the security mode to previous setting
57515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if it was changed during bonding.
57525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
57555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void)
57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode_changed)
57605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = FALSE;
5762444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK));
57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK));
57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_type_changed)
57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_type_changed = FALSE;
57695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type);
57705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_dev_by_sec_state
57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the device database for the device
57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  which is being authenticated or encrypted
57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state)
57855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0];
57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    for (int i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
57895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE)
57915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_dev_rec->sec_state == state))
57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_dev_rec);
57935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_change_pairing_state
58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to change pairing state
58025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state)
58055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state = btm_cb.pairing_state;
58075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  Old: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
5809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  New: %s pairing_flags:0x%x", __func__,
5810444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            btm_pair_state_descr(new_state), btm_cb.pairing_flags);
58115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_state = new_state;
58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_state == BTM_PAIR_STATE_IDLE)
58155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer (&btm_cb.pairing_tle);
58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = 0;
58195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len  = 0;
58205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the the lcb shows we are not bonding */
58225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE);
58235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode();
58255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_check_pending_reqs();
58265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_clear_ssp();
58275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN);
58295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
58315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If transitionng out of idle, mark the lcb as bonding */
58335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state == BTM_PAIR_STATE_IDLE)
58345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE);
58355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_tle.param = (TIMER_PARAM_TYPE)btm_sec_pairing_timeout;
58375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BTM_SEC_TIMEOUT_VALUE);
58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_pair_state_descr
58465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
58485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
58515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state)
58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (state)
58555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_IDLE:                   return("IDLE");
58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_GET_REM_NAME:           return("GET_REM_NAME");
58585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:           return("WAIT_PIN_REQ");
58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:         return("WAIT_LOCAL_PIN");
58605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:   return("WAIT_NUM_CONFIRM");
58615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:              return("KEY_ENTRY");
58625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:     return("WAIT_LOCAL_OOB_RSP");
58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:      return("WAIT_LOCAL_IOCAPS");
58645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_INCOMING_SSP:           return("INCOMING_SSP");
58655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:     return("WAIT_AUTH_COMPLETE");
58665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:        return("WAIT_DISCONNECT");
58675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return("???");
58705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5871104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer    sprintf(btm_cb.state_temp_buffer,"%hhu",state);
58725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_cb.state_temp_buffer);
58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
58755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
58775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_rec_cback_event
58815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function calls the callback function with the given
58835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  result and clear the callback function.
58845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
58865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
588832429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport)
58895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_CALLBACK   *p_callback = p_dev_rec->p_callback;
58915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->p_callback)
58935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
5895e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
58961287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE
5897e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (is_le_transport)
5898e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res);
5899e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        else
59001287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif
5901e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res);
59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_check_pending_reqs();
59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_queue_mx_request
59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
59125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         UINT32 mx_proto_id, UINT32 mx_chan_id,
59165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
59175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf (sizeof(tBTM_SEC_QUEUE_ENTRY));
59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_e)
59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->psm            = psm;
59235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->is_orig        = is_orig;
59245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->p_callback     = p_callback;
59255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->p_ref_data     = p_ref_data;
59265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->mx_proto_id    = mx_proto_id;
59275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->mx_chan_id     = mx_chan_id;
5928444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->transport      = BT_TRANSPORT_BR_EDR;
59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN);
59315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5932444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
5933444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, psm, is_orig, mx_proto_id, mx_chan_id);
59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_enqueue (&btm_cb.sec_pending_q, p_e);
59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
59385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec)
59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK);
59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK);
59475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN rv = FALSE;
59485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((major == BTM_COD_MAJOR_AUDIO)
59505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&  ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) )
59515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x",
5953444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            __func__, major, minor);
59545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.security_mode_changed == FALSE)
59565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
59575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.security_mode_changed = TRUE;
59585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
59595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
59605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_write_auth_enable (TRUE);
59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If we got a PIN, use that, else try to get one */
59695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pin_code_len)
59705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
59715738f83aeb59361a0a2eda2460113f6dc919427The 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);
59725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
59735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
59745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
59755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pin was not supplied - pre-fetch pin code now */
59765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0))
59775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("%s() PIN code callback called", __func__);
59797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL)
59805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
59815738f83aeb59361a0a2eda2460113f6dc919427The 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);
59825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
59835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
59845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rv = TRUE;
59865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rv;
59895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5991444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
5992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
5993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_auth_payload_tout
5994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
5995444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      Processes the HCI Autheniticated Payload Timeout Event
5996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  indicating that a packet containing a valid MIC on the
5997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  connection handle was not received within the programmed
5998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  timeout value. (Spec Default is 30 secs, but can be
5999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  changed via the BTM_SecSetAuthPayloadTimeout() function.
6000444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len)
6003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT16 handle;
6005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    STREAM_TO_UINT16 (handle, p);
6007444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    handle = HCID_GET_HANDLE (handle);
6008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Will be exposed to upper layers in the future if/when determined necessary */
6010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_ERROR ("%s on handle 0x%02x", __func__, handle);
6011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_queue_encrypt_request
6016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      encqueue encryption request when device has active security
6018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  process pending.
6019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6021444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport,
6022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
6023444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY  *p_e;
6025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1);
6026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_e)
6028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6029444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->psm  = 0;  /* if PSM 0, encryption request */
6030444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->p_callback  = p_callback;
6031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->p_ref_data = (void *)(p_e + 1);
6032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        *(UINT8 *)p_e->p_ref_data = *(UINT8 *)(p_ref_data);
6033444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->transport  = transport;
6034444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN);
6035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        GKI_enqueue(&btm_cb.sec_pending_q, p_e);
6036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return TRUE;
6037444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6038444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6039444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return FALSE;
6040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6041444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6042444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6043444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6044899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_peer_sec_caps
6045899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6046899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set sm4 and rmt_sec_caps fields
6047899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  based on the available peer device features.
6048899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6049899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
6050899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6051899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6052899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec)
6053899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6054899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BD_ADDR     rem_bd_addr;
6055899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT8       *p_rem_bd_addr;
6056899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6057899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
6058899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
6059899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
6060899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
6061899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6062899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_TRUE;
6063899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections =
6064899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]));
6065899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6066899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
6067899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6068899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_KNOWN;
6069899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections = FALSE;
6070899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6071899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6072899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", __FUNCTION__,
6073899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                  p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections);
6074899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6075899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6076899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->remote_features_needed)
6077899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6078899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!",
6079899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        __FUNCTION__);
6080899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6081899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr);
6082899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6083899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_io_capabilities_req(p_rem_bd_addr);
6084899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = FALSE;
6085899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6086899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6087899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6088899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6089899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_clean_pending_req_queue
6091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6092444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function cleans up the pending security request when the
6093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  link to the target device dropped.
6094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          void
6096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6097444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6098444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT transport)
6099444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6100444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY    *p_e;
6101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BUFFER_Q                *bq = &btm_cb.sec_pending_q;
6102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq);
6104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_e != NULL)
6106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (memcmp(p_e->bd_addr, remote_bda, BD_ADDR_LEN) == 0
6108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            && p_e->transport == transport
6110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            )
6112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
6113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            (*p_e->p_callback) (remote_bda, transport, p_e->p_ref_data, BTM_ERR_PROCESSING);
6114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            GKI_remove_from_queue(bq, (void *)p_e);
6115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
6116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e);
6117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6118899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6119899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6120899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6121899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6122899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_is_serv_level0
6123899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6124899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the service corresponding
6125899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  to PSM is security mode 4 level 0 service.
6126899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6127899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if the service is security mode 4 level 0 service
6128899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6129899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6130899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0(UINT16 psm)
6131899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6132899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (psm == BT_PSM_SDP)
6133899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6134899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __FUNCTION__, psm);
6135899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return TRUE;
6136899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6137899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return FALSE;
6138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_check_pending_enc_req
6143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to send pending encryption callback if
6145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  waiting
6146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          void
6148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
6151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable)
6152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY    *p_e;
6154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BUFFER_Q                *bq = &btm_cb.sec_pending_q;
6155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT8                   res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING;
6156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq);
6158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    while (p_e != NULL)
6160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0
6162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            && p_e->transport == transport
6164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            )
6166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
61671287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE
61681287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach            UINT8 sec_act = *(UINT8 *)(p_e->p_ref_data);
61691287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif
6170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR
6172444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                || (sec_act == BTM_BLE_SEC_ENCRYPT || sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM)
6174444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                || (sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags
6175444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    & BTM_SEC_LE_AUTHENTICATED)
6176444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji               )
6178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
6179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res);
6180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                GKI_remove_from_queue(bq, (void *)p_e);
6181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
6182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
6183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e);
6184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6185899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6186899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6187899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6188899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6189899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_serv_level4_flags
6190899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6191899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set security mode 4 level 4 flags.
6192899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6193899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          service security requirements updated to include secure
6194899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  connections only mode.
6195899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6196899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6197899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags(UINT16 cur_security, BOOLEAN is_originator)
6198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT16  sec_level4_flags = is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS;
6200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return cur_security | sec_level4_flags;
6202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6203444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
62045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clear_ble_keys
62075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to clear out the BLE keys.
62095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically when devices are removed in BTM_SecDeleteDevice,
62105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or when a new BT Link key is generated.
62115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
62135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
62155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC  *p_dev_rec)
62165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
62175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() Clearing BLE Keys", __func__);
62195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE)
6220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
62215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS));
6222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE)
6224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_ble_resolving_list_remove_dev(p_dev_rec);
6225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
62265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
62275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
62285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_is_a_bonded_dev
62325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description       Is the specified device is a bonded device
62345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - dev is bonded
62365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
62385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda)
62395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
62405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
62425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_bonded= FALSE;
62435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_dev_rec &&
62451287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if (SMP_INCLUDED == TRUE)
62467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))||
62471287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#else
62481287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach        (
62497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
62507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
62515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
62525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_bonded = TRUE;
62535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_bonded=%d", __func__, is_bonded);
62555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(is_bonded);
62565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
62575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_le_capable_dev
6261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description       Is the specified device is dual mode or LE only device
6263ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6264ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE - dev is a dual mode
6265ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6266ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
6267ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda)
6268ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
6269ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
6270ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN le_capable = FALSE;
6271ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6272ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE)
6273e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE)
6274ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        le_capable  = TRUE;
6275ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
6276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return le_capable;
6277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
6278ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
6280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
62815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_bonded_dev
62825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Find a bonded device starting from the specified index
62845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - found a bonded device
62865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6288e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. ChenBOOLEAN btm_sec_find_bonded_dev (UINT8 start_idx, UINT8 *p_found_idx, tBTM_SEC_DEV_REC **p_rec)
62895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
62905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN found= FALSE;
62915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE)
62935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
62945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
62955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS)
62965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
62975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("LE bonded device not found");
62985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return found;
62995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
63005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = &btm_cb.sec_dev_rec[start_idx];
63025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = start_idx; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
63035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
63045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
63055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
63065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_found_idx = i;
6307e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. Chen            *p_rec = p_dev_rec;
63085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
63095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
63105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() found=%d", __func__, found);
63125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
63135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(found);
63145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_use_smp_br_chnl
6319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if SMP BR connection can be used with
6321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the peer.
6322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  Is called when authentication for dedicated bonding is
6323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  successfully completed.
6324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if SMP BR connection can be used (the link key is
6326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         generated from P-256 and the peer supports Security
6327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         Manager over BR).
6328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec)
6331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT32  ext_feat;
6333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT8   chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE];
6334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x", __func__,
6336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->link_key_type);
6337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) &&
6339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
6340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         return FALSE;
6341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask))
6343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT))
6346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6347444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return TRUE;
6349444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6351444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6353444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_is_master
6354444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6355444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if the device is BR/EDR master after
6356444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  pairing is completed.
6357444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6358444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if the device is master.
6359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6361444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec)
6362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
6364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return (p && (p->link_role == BTM_ROLE_MASTER));
6365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6367