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