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 SMP L2Cap interface 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_ble_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "smp_int.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, tBT_TRANSPORT transport); 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf); 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_l2cap_if_init 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called during the SMP task startup 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to register interface functions with L2CAP. 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_l2cap_if_init (void) 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_FIXED_CHNL_REG fixed_reg; 51b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("SMDBG l2c smp_l2cap_if_init"); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.mode = L2CAP_FCR_BASIC_MODE; 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.max_transmit = 0; 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.rtrans_tout = 0; 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.mon_tout = 0; 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.mps = 0; 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.tx_win_sz = 0; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.pL2CA_FixedConn_Cb = smp_connect_cback; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.pL2CA_FixedData_Cb = smp_data_ind; 6117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach fixed_reg.pL2CA_FixedCong_Cb = NULL; /* do not handle congestion on this channel */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.default_idle_tout = 60; /* set 60 seconds timeout, 0xffff default idle timeout */ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, register with L2CAP */ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_RegisterFixedChannel (L2CAP_SMP_CID, &fixed_reg); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_connect_cback 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This callback function is called by L2CAP to indicate that 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SMP channel is 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connected (conn = TRUE)/disconnected (conn = FALSE). 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, 787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport) 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_INT_DATA int_data; 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 83b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("SMDBG l2c smp_connect_cback "); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_BR_EDR) 867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 87b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR ("smp_connect_cback : Wrong transport"); 887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return; 897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) == 0) 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 93b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("smp_connect_cback() for pairing BDA: %08x%04x Event: %s", 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8) + bd_addr[3], 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[4]<<8)+bd_addr[5], (connected) ? "connected" : "disconnected"); 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (connected) 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!p_cb->connect_initialized) 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->connect_initialized = TRUE; 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initiating connection established */ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->role = L2CA_GetBleConnRole(bd_addr); 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize local i/r key to be default keys */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->loc_r_key = p_cb->loc_i_key = SMP_SEC_DEFAULT_KEY; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->loc_auth_req = p_cb->peer_auth_req = SMP_DEFAULT_AUTH_REQ; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cb_evt = SMP_IO_CAP_REQ_EVT; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_L2CAP_CONN_EVT, NULL); 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_data.reason = reason; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Disconnected while doing security */ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_L2CAP_DISCONN_EVT, &int_data); 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_data_ind 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when data is received from L2CAP on 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SMP channel. 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf) 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)(p_buf + 1) + p_buf->offset; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cmd ; 137b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("SMDBG l2c smp_data_ind"); 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 139b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("Got smp_data_ind"); 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8(cmd, p); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* sanity check */ 1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((SMP_OPCODE_MAX <= cmd) || (cmd == 0)) 1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 146b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_WARNING( "Ignore received command with RESERVED code 0x%02x", cmd); 1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta GKI_freebuf (p_buf); 1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return; 1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reject the pairing request if there is an on-going SMP pairing */ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SMP_OPCODE_PAIRING_REQ == cmd || SMP_OPCODE_SEC_REQ == cmd) 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->state == SMP_ST_IDLE) 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->role = L2CA_GetBleConnRole(bd_addr); 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_cb->pairing_bda[0], bd_addr, BD_ADDR_LEN); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN)) 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta GKI_freebuf (p_buf); 1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta smp_reject_unexp_pair_req(bd_addr); 1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* else, out of state pairing request/security request received, passed into SM */ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN) == 0) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_cb->state != SMP_ST_RELEASE_DELAY) 1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btu_stop_timer (&p_cb->rsp_timer_ent); 173db2bdd59473d02d195c73e2bd67adf6a03a34ed6Mudumba Ananth btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD, 174db2bdd59473d02d195c73e2bd67adf6a03a34ed6Mudumba Ananth SMP_WAIT_FOR_RSP_TOUT); 1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_cb->rcvd_cmd_code = cmd; 1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_cb->rcvd_cmd_len = (UINT8) p_buf->len; 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, cmd, p); 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 184