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 utility functions
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
295cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <ctype.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_ble_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "smp_int.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_PAIRING_REQ_SIZE    7
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_CONFIRM_CMD_SIZE    (BT_OCTET16_LEN + 1)
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_INIT_CMD_SIZE       (BT_OCTET16_LEN + 1)
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_ENC_INFO_SIZE       (BT_OCTET16_LEN + 1)
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_MASTER_ID_SIZE      (BT_OCTET8_LEN + 2 + 1)
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_ID_INFO_SIZE        (BT_OCTET16_LEN + 1)
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_ID_ADDR_SIZE        (BD_ADDR_LEN + 1 + 1)
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_SIGN_INFO_SIZE      (BT_OCTET16_LEN + 1)
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SMP_PAIR_FAIL_SIZE      2
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for action functions */
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef BT_HDR * (*tSMP_CMD_ACT)(UINT8 cmd_code, tSMP_CB *p_cb);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_pairing_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_confirm_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_rand_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_pairing_fail(UINT8 cmd_code, tSMP_CB *p_cb);
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_identity_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_encrypt_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_security_request(UINT8 cmd_code, tSMP_CB *p_cb);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_signing_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_master_id_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_id_addr_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tSMP_CMD_ACT smp_cmd_build_act[] =
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_pairing_cmd,      /* 0x01: pairing request */
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_pairing_cmd,      /* 0x02: pairing response */
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_confirm_cmd,      /* 0x03: pairing confirm */
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_rand_cmd,         /* 0x04: pairing initializer request */
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_pairing_fail,     /* 0x05: pairing failure */
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_encrypt_info_cmd, /* 0x06: security information command */
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_master_id_cmd,    /* 0x07: master identity command */
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_identity_info_cmd,  /* 0x08: identity information command */
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_id_addr_cmd,          /* 0x09: signing information */
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_signing_info_cmd,    /* 0x0A: signing information */
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_build_security_request    /* 0x0B: security request */
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_send_msg_to_L2CAP
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send message to L2CAP.
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  smp_send_msg_to_L2CAP(BD_ADDR rem_bda, BT_HDR *p_toL2CAP)
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              l2cap_ret;
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
90b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_send_msg_to_L2CAP");
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((l2cap_ret = L2CA_SendFixedChnlData (L2CAP_SMP_CID, rem_bda, p_toL2CAP)) == L2CAP_DW_FAILED)
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
94b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_ERROR("SMP   failed to pass msg:0x%0x to L2CAP",
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset));
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(p_toL2CAP);
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_send_cmd
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      send a SMP command on L2CAP channel.
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN smp_send_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN sent = FALSE;
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 failure = SMP_PAIR_INTERNAL_ERR;
116b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_send_cmd on l2cap cmd_code=0x%x", cmd_code);
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( cmd_code < SMP_OPCODE_MAX &&
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         smp_cmd_build_act[cmd_code] != NULL)
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf = (*smp_cmd_build_act[cmd_code])(cmd_code, p_cb);
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_buf != NULL &&
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_send_msg_to_L2CAP(p_cb->pairing_bda, p_buf))
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sent = TRUE;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&p_cb->rsp_timer_ent);
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             SMP_WAIT_FOR_RSP_TOUT);
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!sent)
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return sent;
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_rsp_timeout
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Called when SMP wait for SMP command response timer expires
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_rsp_timeout(TIMER_LIST_ENT *p_tle)
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_CB   *p_cb = &smp_cb;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 failure = SMP_RSP_TIMEOUT;
1555cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
157b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_rsp_timeout state:%d", p_cb->state);
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (smp_get_state() == SMP_ST_RELEASE_DELAY)
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_RELEASE_DELAY_TOUT_EVT, NULL);
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_pairing_req_cmd
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build pairing request command.
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR * smp_build_pairing_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
180b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_pairing_cmd");
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIRING_REQ_SIZE + L2CAP_MIN_OFFSET)) != NULL)
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, cmd_code);
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, p_cb->loc_io_caps);
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, p_cb->loc_oob_flag);
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, p_cb->loc_auth_req);
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, p_cb->loc_enc_size);
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, p_cb->loc_i_key);
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, p_cb->loc_r_key);
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* 1B ERR_RSP op code + 1B cmd_op_code + 2B handle + 1B status */
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_PAIRING_REQ_SIZE;
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_confirm_cmd
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build confirm request command.
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_confirm_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
2125cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
2135cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
214b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_confirm_cmd");
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_CONFIRM_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL)
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_CONFIRM);
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_STREAM (p, p_cb->confirm, BT_OCTET16_LEN);
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_CONFIRM_CMD_SIZE;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_rand_cmd
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build Initializer command.
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_rand_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
2395cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
2405cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
241b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_rand_cmd");
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_INIT_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL)
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_INIT);
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_STREAM (p, p_cb->rand, BT_OCTET16_LEN);
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_INIT_CMD_SIZE;
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_encrypt_info_cmd
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build security information command.
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_encrypt_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
2665cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
2675cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
268b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_encrypt_info_cmd");
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ENC_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_ENCRYPT_INFO);
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_STREAM (p, p_cb->ltk, BT_OCTET16_LEN);
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_ENC_INFO_SIZE;
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_master_id_cmd
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build security information command.
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_master_id_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
2935cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
2945cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
295b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_master_id_cmd ");
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_MASTER_ID_SIZE + L2CAP_MIN_OFFSET)) != NULL)
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_MASTER_ID);
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM (p, p_cb->ediv);
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_STREAM (p, p_cb->enc_rand, BT_OCTET8_LEN);
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_MASTER_ID_SIZE;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_identity_info_cmd
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build identity information command.
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_identity_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16  irk;
3225cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
3235cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
3245cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
325b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_identity_info_cmd");
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_GetDeviceIDRoot(irk);
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_IDENTITY_INFO);
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_STREAM (p,  irk, BT_OCTET16_LEN);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_ID_INFO_SIZE;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_id_addr_cmd
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build identity address information command.
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_id_addr_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
352ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR     static_addr;
3535cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
3545cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
355ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
356b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_id_addr_cmd");
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_ADDR_SIZE + L2CAP_MIN_OFFSET)) != NULL)
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_ID_ADDR);
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, 0);     /* TODO: update with local address type */
363ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTM_GetLocalDeviceAddr(static_addr);
364ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BDADDR_TO_STREAM (p, static_addr);
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_ID_ADDR_SIZE;
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_signing_info_cmd
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build signing information command.
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_signing_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
3845cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
385ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
386b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_signing_info_cmd");
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_SIGN_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_SIGN_INFO);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_STREAM (p, p_cb->csrk, BT_OCTET16_LEN);
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_SIGN_INFO_SIZE;
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_pairing_fail
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build Pairing Fail command.
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_pairing_fail(UINT8 cmd_code, tSMP_CB *p_cb)
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
4115cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
4125cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
413b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_pairing_fail");
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL)
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_PAIRING_FAILED);
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, p_cb->failure);
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = SMP_PAIR_FAIL_SIZE;
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_build_security_request
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Build security request command.
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BT_HDR * smp_build_security_request(UINT8 cmd_code, tSMP_CB *p_cb)
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf = NULL ;
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
4385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(cmd_code);
4395cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
440b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_build_security_request");
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 2 + L2CAP_MIN_OFFSET)) != NULL)
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p, SMP_OPCODE_SEC_REQ);
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (p,  p_cb->loc_auth_req);
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = L2CAP_MIN_OFFSET;
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = 2;
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
452b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_EVENT("opcode=%d auth_req=0x%x",SMP_OPCODE_SEC_REQ,  p_cb->loc_auth_req );
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_convert_string_to_tk
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to convert a 6 to 16 digits numeric
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  character string into SMP TK.
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_convert_string_to_tk(BT_OCTET16 tk, UINT32 passkey)
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = tk;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_KEY    key;
474b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_convert_string_to_tk");
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM(p, passkey);
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    key.key_type    = SMP_KEY_TYPE_TK;
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    key.p_data      = tk;
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key);
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         smp_mask_enc_key
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to mask off the encryption key based
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on the maximum encryption key size.
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_mask_enc_key(UINT8 loc_enc_size, UINT8 * p_data)
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
496b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_mask_enc_key");
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (loc_enc_size < BT_OCTET16_LEN)
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (; loc_enc_size < BT_OCTET16_LEN; loc_enc_size ++)
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * (p_data + loc_enc_size) = 0;
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_xor_128
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      utility function to do an biteise exclusive-OR of two bit
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  strings of the length of BT_OCTET16_LEN.
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_xor_128(BT_OCTET16 a, BT_OCTET16 b)
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i, *aa = a, *bb = b;
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
518b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_xor_128");
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BT_OCTET16_LEN; i++)
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        aa[i] = aa[i] ^ bb[i];
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_cb_cleanup
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Clean up SMP control block
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_cb_cleanup(tSMP_CB   *p_cb)
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_CALLBACK   *p_callback = p_cb->p_callback;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           trace_level = p_cb->trace_level;
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
540b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_cb_cleanup");
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_cb, 0, sizeof(tSMP_CB));
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->p_callback = p_callback;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->trace_level = trace_level;
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_reset_control_value
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to reset the control block value when
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pairing procedure finished.
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_reset_control_value(tSMP_CB *p_cb)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
558b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_reset_control_value");
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer (&p_cb->rsp_timer_ent);
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_CONFORMANCE_TESTING == TRUE
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
562b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT("smp_cb.remove_fixed_channel_disable=%d", smp_cb.remove_fixed_channel_disable);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!smp_cb.remove_fixed_channel_disable)
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_RemoveFixedChnl (L2CAP_SMP_CID, p_cb->pairing_bda);
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
569b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_EVENT("disable the removal of the fixed channel");
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We can tell L2CAP to remove the fixed channel (if it has one) */
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_RemoveFixedChnl (L2CAP_SMP_CID, p_cb->pairing_bda);
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb_cleanup(p_cb);
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_proc_pairing_cmpl
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process pairing complete
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_pairing_cmpl(tSMP_CB *p_cb)
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_EVT_DATA   evt_data = {0};
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_pairing_cmpl ");
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.cmplt.reason = p_cb->status;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->status == SMP_SUCCESS)
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.cmplt.sec_level = p_cb->sec_level;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.cmplt.is_pair_cancel  = FALSE;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->is_pair_cancel)
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.cmplt.is_pair_cancel = TRUE;
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
608b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("send SMP_COMPLT_EVT reason=0x%0x sec_level=0x%0x",
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      evt_data.cmplt.reason,
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      evt_data.cmplt.sec_level );
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->p_callback)
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cb->p_callback) (SMP_COMPLT_EVT, p_cb->pairing_bda, &evt_data);
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0 /* TESTING CODE : as a master, reencrypt using LTK */
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (evt_data.cmplt.reason == 0 && p_cb->role == HCI_ROLE_MASTER)
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_start_encrypt(p_cb->pairing_bda, FALSE, NULL);
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_reset_control_value(p_cb);
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6248fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta/*******************************************************************************
6258fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**
6268fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Function         smp_reject_unexp_pair_req
6278fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**
6288fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Description      send pairing failure to an unexpected pairing request during
6298fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**                  an active pairing process.
6308fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**
6318fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Returns          void
6328fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**
6338fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta*******************************************************************************/
6348fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid smp_reject_unexp_pair_req(BD_ADDR bd_addr)
6358fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta{
6368fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    BT_HDR *p_buf;
6378fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    UINT8   *p;
6388fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
6398fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL)
6408fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
6418fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
6428fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
6438fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        UINT8_TO_STREAM (p, SMP_OPCODE_PAIRING_FAILED);
6448fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        UINT8_TO_STREAM (p, SMP_PAIR_NOT_SUPPORT);
6458fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
6468fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        p_buf->offset = L2CAP_MIN_OFFSET;
6478fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        p_buf->len = SMP_PAIR_FAIL_SIZE;
6488fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
6498fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        smp_send_msg_to_L2CAP(bd_addr, p_buf);
6508fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
6518fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta}
6528fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_CONFORMANCE_TESTING == TRUE
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_set_test_confirm_value
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the test confirm value
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_set_test_confirm_value(BOOLEAN enable, UINT8 *p_c_val)
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
665b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG("smp_set_test_confirm_value enable=%d", enable);
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb.enable_test_confirm_val = enable;
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(smp_cb.test_confirm, p_c_val, BT_OCTET16_LEN);
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_set_test_confirm_value
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the test rand value
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_set_test_rand_value(BOOLEAN enable, UINT8 *p_c_val)
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
682b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG("smp_set_test_rand_value enable=%d", enable);
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb.enable_test_rand_val = enable;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(smp_cb.test_rand, p_c_val, BT_OCTET16_LEN);
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_set_test_pair_fail_status
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the test fairing fair status
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_set_test_pair_fail_status (BOOLEAN enable, UINT8 status)
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
699b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG("smp_set_test_confirm_value enable=%d", enable);
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb.enable_test_pair_fail = enable;
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb.pair_fail_status = status;
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_set_test_pair_fail_status
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to disable the removal of fixed channel
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  in  smp_reset_control_value
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_remove_fixed_channel_disable (BOOLEAN disable)
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
715b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG("smp_remove_fixed_channel_disable disable =%d", disable);
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb.remove_fixed_channel_disable = disable;
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
718ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
719ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
720ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         smp_skip_compare_check
721ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
722ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function is called to skip the compare value check
723ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
724ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
725ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
727ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid smp_skip_compare_check(BOOLEAN enable)
728ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
729b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG("smp_skip_compare_check enable=%d", enable);
730ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    smp_cb.skip_test_compare_check = enable;
731ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
738