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 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason); 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; 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT0 ("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; 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.default_idle_tout = 60; /* set 60 seconds timeout, 0xffff default idle timeout */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, register with L2CAP */ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_RegisterFixedChannel (L2CAP_SMP_CID, &fixed_reg); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_connect_cback 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This callback function is called by L2CAP to indicate that 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SMP channel is 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connected (conn = TRUE)/disconnected (conn = FALSE). 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason) 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_INT_DATA int_data; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT0 ("SMDBG l2c smp_connect_cback "); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) == 0) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT3 ("smp_connect_cback() for pairing BDA: %08x%04x Event: %s", 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8) + bd_addr[3], 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[4]<<8)+bd_addr[5], (connected) ? "connected" : "disconnected"); 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (connected) 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!p_cb->connect_initialized) 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->connect_initialized = TRUE; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initiating connection established */ 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->role = L2CA_GetBleConnRole(bd_addr); 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize local i/r key to be default keys */ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->loc_r_key = p_cb->loc_i_key = SMP_SEC_DEFAULT_KEY; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->loc_auth_req = p_cb->peer_auth_req = SMP_DEFAULT_AUTH_REQ; 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cb_evt = SMP_IO_CAP_REQ_EVT; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_L2CAP_CONN_EVT, NULL); 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_data.reason = reason; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Disconnected while doing security */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_L2CAP_DISCONN_EVT, &int_data); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_data_ind 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when data is received from L2CAP on 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SMP channel. 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf) 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)(p_buf + 1) + p_buf->offset; 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cmd ; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT0 ("SMDBG l2c smp_data_ind"); 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT0 ("Got smp_data_ind"); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8(cmd, p); 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reject the pairing request if there is an on-going SMP pairing */ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SMP_OPCODE_PAIRING_REQ == cmd || SMP_OPCODE_SEC_REQ == cmd) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->state == SMP_ST_IDLE) 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->role = L2CA_GetBleConnRole(bd_addr); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_cb->pairing_bda[0], bd_addr, BD_ADDR_LEN); 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN)) 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->failure = SMP_PAIR_NOT_SUPPORT; 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN) == 0) 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_cb->rsp_timer_ent); 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, cmd, p); 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 160