15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach * Copyright (C) 2008-2014 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 ATT protocol functions 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 BLE_INCLUDED == TRUE 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define GATT_HDR_FIND_TYPE_VALUE_LEN 21 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define GATT_OP_CODE_SIZE 1 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************** 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** ATT protocl message building utility * 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project***********************************************************************/ 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_mtu_exec_cmd 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a exchange MTU request 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_mtu_cmd(UINT8 op_code, UINT16 rx_mtu) 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + GATT_HDR_SIZE + L2CAP_MIN_OFFSET)) != NULL) 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, op_code); 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, rx_mtu); 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = GATT_HDR_SIZE; /* opcode + 2 bytes mtu */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_exec_write_cmd 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a execute write request or response. 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_exec_write_cmd (UINT8 op_code, UINT8 flag) 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_BUF_POOL_ID)) != NULL) 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = GATT_OP_CODE_SIZE; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, op_code); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_EXEC_WRITE) 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flag &= GATT_PREP_WRITE_EXEC; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, flag); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += 1; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_err_cmd 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a exchange MTU request 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_err_cmd(UINT8 cmd_code, UINT16 err_handle, UINT8 reason) 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + 5)) != NULL) 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, GATT_RSP_ERROR); 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, cmd_code); 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, err_handle); 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, reason); 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* GATT_HDR_SIZE (1B ERR_RSP op code+ 2B handle) + 1B cmd_op_code + 1B status */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = GATT_HDR_SIZE + 1 + 1; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_browse_cmd 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a read information request or read by type request 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_browse_cmd(UINT8 op_code, UINT16 s_hdl, UINT16 e_hdl, tBT_UUID uuid) 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 8 + L2CAP_MIN_OFFSET)) != NULL) 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Describe the built message location and size */ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = GATT_OP_CODE_SIZE + 4; 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, op_code); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, s_hdl); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, e_hdl); 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += gatt_build_uuid_to_stream(&p, uuid); 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_read_handles_cmd 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a read by type and value request. 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the command buffer. 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBT_HDR *attp_build_read_by_type_value_cmd (UINT16 payload_size, tGATT_FIND_TYPE_VALUE *p_value_type) 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = p_value_type->value_len; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + payload_size + L2CAP_MIN_OFFSET))) != NULL) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 5; /* opcode + s_handle + e_handle */ 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, GATT_REQ_FIND_TYPE_VALUE); 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, p_value_type->s_handle); 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, p_value_type->e_handle); 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += gatt_build_uuid_to_stream(&p, p_value_type->uuid); 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_value_type->value_len + p_buf->len > payload_size ) 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = payload_size - p_buf->len; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_value_type->value, len); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += len; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_read_multi_cmd 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a read multiple request 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_read_multi_cmd(UINT16 payload_size, UINT16 num_handle, UINT16 *p_handle) 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p, i = 0; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + num_handle * 2 + 1 + L2CAP_MIN_OFFSET))) != NULL) 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 1; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, GATT_REQ_READ_MULTI); 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < num_handle && p_buf->len + 2 <= payload_size; i ++) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, *(p_handle + i)); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += 2; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_handle_cmd 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a read /read blob request 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_handle_cmd(UINT8 op_code, UINT16 handle, UINT16 offset) 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 5 + L2CAP_MIN_OFFSET)) != NULL) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, op_code); 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 1; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, handle); 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += 2; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_READ_BLOB) 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, offset); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += 2; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_opcode_cmd 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a request/response with opcode only. 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_opcode_cmd(UINT8 op_code) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 1 + L2CAP_MIN_OFFSET)) != NULL) 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, op_code); 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 1; 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_value_cmd 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build a attribute value request 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_value_cmd (UINT16 payload_size, UINT8 op_code, UINT16 handle, 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 offset, UINT16 len, UINT8 *p_data) 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = NULL; 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p, *pp, pair_len, *p_pair_len; 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + payload_size + L2CAP_MIN_OFFSET))) != NULL) 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = pp =(UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, op_code); 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 1; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_RSP_READ_BY_TYPE) 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_pair_len = p; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pair_len = len + 2; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, pair_len); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += 1; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code != GATT_RSP_READ_BLOB && op_code != GATT_RSP_READ) 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, handle); 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += 2; 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_PREPARE_WRITE ||op_code == GATT_RSP_PREPARE_WRITE ) 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, offset); 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += 2; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len > 0 && p_data != NULL) 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ensure data not exceed MTU size */ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (payload_size - p_buf->len < len) 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = payload_size - p_buf->len; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update handle value pair length */ 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_RSP_READ_BY_TYPE) 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_pair_len = (len + 2); 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 338b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING("attribute value too long, to be truncated to %d", len); 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, p_data, len); 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += len; 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Function attp_send_msg_to_l2cap 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send message to L2CAP. 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 35517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre EisenbachtGATT_STATUS attp_send_msg_to_l2cap(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP) 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 l2cap_ret; 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->att_lcid == L2CAP_ATT_CID) 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cap_ret = L2CA_SendFixedChnlData (L2CAP_ATT_CID, p_tcb->peer_bda, p_toL2CAP); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cap_ret = (UINT16) L2CA_DataWrite (p_tcb->att_lcid, p_toL2CAP); 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2cap_ret == L2CAP_DW_FAILED) 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 367b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("ATT failed to pass msg:0x%0x to L2CAP", 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset)); 36917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach return GATT_INTERNAL_ERROR; 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach else if (l2cap_ret == L2CAP_DW_CONGESTED) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3734dcde90649cc51ca815a50d338a73adb408ab258Matthew Xie GATT_TRACE_DEBUG("ATT congested, message accepted"); 37417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach return GATT_CONGESTED; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach return GATT_SUCCESS; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_build_sr_msg 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Build ATT Server PDUs. 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *attp_build_sr_msg(tGATT_TCB *p_tcb, UINT8 op_code, tGATT_SR_MSG *p_msg) 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_cmd = NULL; 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 offset = 0; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (op_code) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_RSP_READ_BLOB: 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_RSP_PREPARE_WRITE: 395b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_EVENT ("ATT_RSP_READ_BLOB/GATT_RSP_PREPARE_WRITE: len = %d offset = %d", 396ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_msg->attr_value.len, p_msg->attr_value.offset); 397ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta offset = p_msg->attr_value.offset; 398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* Coverity: [FALSE-POSITIVE error] intended fall through */ 399ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* Missing break statement between cases in switch statement */ 400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* fall through */ 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_RSP_READ_BY_TYPE: 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_RSP_READ: 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_HANDLE_VALUE_NOTIF: 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_HANDLE_VALUE_IND: 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_value_cmd(p_tcb->payload_size, 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code, 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->attr_value.handle, 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project offset, 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->attr_value.len, 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->attr_value.value); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_RSP_WRITE: 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_opcode_cmd(op_code); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_RSP_ERROR: 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_err_cmd(p_msg->error.cmd_code, p_msg->error.handle, p_msg->error.reason); 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_RSP_EXEC_WRITE: 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_exec_write_cmd(op_code, 0); 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_RSP_MTU: 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_mtu_cmd(op_code, p_msg->mtu); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 430b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("attp_build_sr_msg: unknown op code = %d", op_code); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cmd) 435b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("No resources"); 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_cmd; 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_send_sr_msg 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends the server response or indication message 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to client. 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter p_tcb: pointer to the connecton control block. 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_msg: pointer to message parameters structure. 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if sucessfully sent; otherwise error code. 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS attp_send_sr_msg (tGATT_TCB *p_tcb, BT_HDR *p_msg) 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS cmd_sent = GATT_NO_RESOURCES; 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb != NULL) 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg != NULL) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->offset = L2CAP_MIN_OFFSET; 46317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach cmd_sent = attp_send_msg_to_l2cap (p_tcb, p_msg); 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return cmd_sent; 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_cl_send_cmd 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a ATT command or enqueue it. 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Returns GATT_SUCCESS if command sent 47617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** GATT_CONGESTED if command sent but channel congested 47717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** GATT_CMD_STARTED if command queue up in GATT 47817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** GATT_ERROR if command sending failure 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 48117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre EisenbachtGATT_STATUS attp_cl_send_cmd(tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 cmd_code, BT_HDR *p_cmd) 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 48317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tGATT_STATUS att_ret = GATT_SUCCESS; 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb != NULL) 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmd_code &= ~GATT_AUTH_SIGN_MASK; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach /* no pending request or value confirmation */ 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->pending_cl_req == p_tcb->next_slot_inq || 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmd_code == GATT_HANDLE_VALUE_CONF) 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach att_ret = attp_send_msg_to_l2cap(p_tcb, p_cmd); 49417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (att_ret == GATT_CONGESTED || att_ret == GATT_SUCCESS) 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do not enq cmd if handle value confirmation or set request */ 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cmd_code != GATT_HANDLE_VALUE_CONF && cmd_code != GATT_CMD_WRITE) 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4995fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu gatt_start_rsp_timer (clcb_idx); 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cmd_enq(p_tcb, clcb_idx, FALSE, cmd_code, NULL); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project att_ret = GATT_INTERNAL_ERROR; 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 507ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta att_ret = GATT_CMD_STARTED; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cmd_enq(p_tcb, clcb_idx, TRUE, cmd_code, p_cmd); 510ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 51317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach att_ret = GATT_ERROR; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return att_ret; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function attp_send_cl_msg 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends the client request or confirmation message 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to server. 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter p_tcb: pointer to the connectino control block. 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** clcb_idx: clcb index 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** op_code: message op code. 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_msg: pointer to message parameters structure. 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if sucessfully sent; otherwise error code. 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS attp_send_cl_msg (tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, tGATT_CL_MSG *p_msg) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status = GATT_NO_RESOURCES; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_cmd = NULL; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 offset = 0, handle; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb != NULL) 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (op_code) 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_MTU: 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg->mtu <= GATT_MAX_MTU_SIZE) 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->payload_size = p_msg->mtu; 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_mtu_cmd(GATT_REQ_MTU, p_msg->mtu); 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_ILLEGAL_PARAMETER; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_FIND_INFO: 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_BY_TYPE: 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_BY_GRP_TYPE: 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATT_HANDLE_IS_VALID (p_msg->browse.s_handle) && 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_HANDLE_IS_VALID (p_msg->browse.e_handle) && 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->browse.s_handle <= p_msg->browse.e_handle) 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_browse_cmd(op_code, 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->browse.s_handle, 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->browse.e_handle, 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->browse.uuid); 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_ILLEGAL_PARAMETER; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_BLOB: 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project offset = p_msg->read_blob.offset; 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ: 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = (op_code == GATT_REQ_READ) ? p_msg->handle: p_msg->read_blob.handle; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* handle checking */ 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATT_HANDLE_IS_VALID (handle)) 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_handle_cmd(op_code, handle, offset); 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_ILLEGAL_PARAMETER; 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_HANDLE_VALUE_CONF: 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_opcode_cmd(op_code); 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_PREPARE_WRITE: 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project offset = p_msg->attr_value.offset; 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_WRITE: 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_CMD_WRITE: 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_SIGN_CMD_WRITE: 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATT_HANDLE_IS_VALID (p_msg->attr_value.handle)) 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_value_cmd (p_tcb->payload_size, 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code, p_msg->attr_value.handle, 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project offset, 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->attr_value.len, 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->attr_value.value); 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_ILLEGAL_PARAMETER; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_EXEC_WRITE: 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_exec_write_cmd(op_code, p_msg->exec_write); 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_FIND_TYPE_VALUE: 6107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_cmd = attp_build_read_by_type_value_cmd(p_tcb->payload_size, &p_msg->find_type_value); 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_MULTI: 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd = attp_build_read_multi_cmd(p_tcb->payload_size, 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->read_multi.num_handles, 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->read_multi.handles); 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cmd != NULL) 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = attp_cl_send_cmd(p_tcb, clcb_idx, op_code, p_cmd); 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 629b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Peer device not connected"); 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 635