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