15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  this file contains the main GATT client 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 <string.h>
307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#include "bt_utils.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define GATT_WRITE_LONG_HDR_SIZE    5 /* 1 opcode + 2 handle + 2 offset */
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define GATT_READ_CHAR_VALUE_HDL    (GATT_READ_CHAR_VALUE | 0x80)
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define GATT_READ_INC_SRV_UUID128   (GATT_DISC_INC_SRVC   | 0x90)
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach#define GATT_PREP_WRITE_RSP_MIN_LEN 4
39ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach#define GATT_NOTIFICATION_MIN_LEN 2
40ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach#define GATT_WRITE_RSP_MIN_LEN  2
41ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach#define GATT_INFO_RSP_MIN_LEN   1
42ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach#define GATT_MTU_RSP_MIN_LEN    2
43ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach#define GATT_READ_BY_TYPE_RSP_MIN_LEN    1
44ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                       G L O B A L      G A T T       D A T A                 *
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*********************************************************************************/
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_send_prepare_write(tGATT_TCB  *p_tcb, tGATT_CLCB *p_clcb);
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8   disc_type_to_att_opcode[GATT_DISC_MAX] =
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_REQ_READ_BY_GRP_TYPE,     /*  GATT_DISC_SRVC_ALL = 1, */
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_REQ_FIND_TYPE_VALUE,      /*  GATT_DISC_SRVC_BY_UUID,  */
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_REQ_READ_BY_TYPE,         /*  GATT_DISC_INC_SRVC,      */
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_REQ_READ_BY_TYPE,         /*  GATT_DISC_CHAR,          */
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_REQ_FIND_INFO             /*  GATT_DISC_CHAR_DSCPT,    */
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 disc_type_to_uuid[GATT_DISC_MAX] =
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* reserved */
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_UUID_PRI_SERVICE, /* <service> DISC_SRVC_ALL */
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_UUID_PRI_SERVICE, /* <service> for DISC_SERVC_BY_UUID */
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_UUID_INCLUDE_SERVICE, /* <include_service> for DISC_INC_SRVC */
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_UUID_CHAR_DECLARE,   /* <characteristic> for DISC_CHAR */
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0                   /* no type filtering for DISC_CHAR_DSCPT */
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_act_discovery
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      GATT discovery operation.
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_act_discovery(tGATT_CLCB *p_clcb)
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       op_code = disc_type_to_att_opcode[p_clcb->op_subtype];
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CL_MSG   cl_req;
846975b4d711142b885af479721cada448952c6b41Andre Eisenbach    tGATT_STATUS    st;
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->s_handle <= p_clcb->e_handle && p_clcb->s_handle != 0)
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&cl_req, 0, sizeof(tGATT_CL_MSG));
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cl_req.browse.s_handle = p_clcb->s_handle;
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cl_req.browse.e_handle = p_clcb->e_handle;
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disc_type_to_uuid[p_clcb->op_subtype] != 0)
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cl_req.browse.uuid.len = 2;
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cl_req.browse.uuid.uu.uuid16 = disc_type_to_uuid[p_clcb->op_subtype];
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->op_subtype == GATT_DISC_SRVC_BY_UUID) /* fill in the FindByTypeValue request info*/
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cl_req.find_type_value.uuid.len = 2;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cl_req.find_type_value.uuid.uu.uuid16 = disc_type_to_uuid[p_clcb->op_subtype];
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cl_req.find_type_value.s_handle = p_clcb->s_handle;
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cl_req.find_type_value.e_handle = p_clcb->e_handle;
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cl_req.find_type_value.value_len = p_clcb->uuid.len;
1067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* if service type is 32 bits UUID, convert it now */
1077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (p_clcb->uuid.len == LEN_UUID_32)
1087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
1097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                cl_req.find_type_value.value_len = LEN_UUID_128;
1107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                gatt_convert_uuid32_to_uuid128(cl_req.find_type_value.value, p_clcb->uuid.uu.uuid32);
1117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
1127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            else
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (cl_req.find_type_value.value,  &p_clcb->uuid.uu, p_clcb->uuid.len);
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1166975b4d711142b885af479721cada448952c6b41Andre Eisenbach        st = attp_send_cl_msg(p_clcb->p_tcb, p_clcb->clcb_idx, op_code, &cl_req);
1176975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1186975b4d711142b885af479721cada448952c6b41Andre Eisenbach        if (st !=  GATT_SUCCESS && st != GATT_CMD_STARTED)
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_end_operation(p_clcb, GATT_ERROR, NULL);
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* end of handle range */
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_end_operation(p_clcb, GATT_SUCCESS, NULL);
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_act_read
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      GATT read operation.
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_act_read (tGATT_CLCB *p_clcb, UINT16 offset)
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB  *p_tcb = p_clcb->p_tcb;
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   rt = GATT_INTERNAL_ERROR;
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CL_MSG  msg;
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8        op_code = 0;
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&msg, 0, sizeof(tGATT_CL_MSG));
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_clcb->op_subtype)
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_READ_CHAR_VALUE:
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_READ_BY_TYPE:
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_code = GATT_REQ_READ_BY_TYPE;
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.browse.s_handle = p_clcb->s_handle;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.browse.e_handle = p_clcb->e_handle;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clcb->op_subtype == GATT_READ_BY_TYPE)
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&msg.browse.uuid, &p_clcb->uuid, sizeof(tBT_UUID));
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                msg.browse.uuid.len = LEN_UUID_16;
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                msg.browse.uuid.uu.uuid16 = GATT_UUID_CHAR_DECLARE;
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_READ_CHAR_VALUE_HDL:
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_READ_BY_HANDLE:
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!p_clcb->counter)
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                op_code = GATT_REQ_READ;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                msg.handle = p_clcb->s_handle;
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!p_clcb->first_read_blob_after_read)
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_clcb->first_read_blob_after_read = TRUE;
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_clcb->first_read_blob_after_read = FALSE;
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
175b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_DEBUG("gatt_act_read first_read_blob_after_read=%d",
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_clcb->first_read_blob_after_read);
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                op_code = GATT_REQ_READ_BLOB;
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                msg.read_blob.offset = offset;
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                msg.read_blob.handle = p_clcb->s_handle;
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->op_subtype &= ~ 0x80;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_READ_PARTIAL:
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_code = GATT_REQ_READ_BLOB;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.read_blob.handle = p_clcb->s_handle;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.read_blob.offset = offset;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_READ_MULTIPLE:
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_code = GATT_REQ_READ_MULTI;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (&msg.read_multi, p_clcb->p_attr_buf, sizeof(tGATT_READ_MULTI));
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_READ_INC_SRV_UUID128:
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_code = GATT_REQ_READ;
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.handle = p_clcb->s_handle;
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->op_subtype &= ~ 0x90;
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
202b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("Unknown read type: %d", p_clcb->op_subtype);
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2066975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if (op_code != 0)
2076975b4d711142b885af479721cada448952c6b41Andre Eisenbach        rt = attp_send_cl_msg(p_tcb, p_clcb->clcb_idx, op_code, &msg);
2086975b4d711142b885af479721cada448952c6b41Andre Eisenbach
2096975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if ( op_code == 0 || (rt != GATT_SUCCESS && rt != GATT_CMD_STARTED))
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_end_operation(p_clcb, rt, NULL);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_act_write
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      GATT write operation.
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid gatt_act_write (tGATT_CLCB *p_clcb, UINT8 sec_act)
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB           *p_tcb = p_clcb->p_tcb;
2276975b4d711142b885af479721cada448952c6b41Andre Eisenbach    UINT8               rt = GATT_SUCCESS, op_code = 0;
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE         *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_attr)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (p_clcb->op_subtype)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_WRITE_NO_RSP:
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->s_handle = p_attr->handle;
236ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                op_code = (sec_act == GATT_SEC_SIGN_DATA) ? GATT_SIGN_CMD_WRITE : GATT_CMD_WRITE;
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rt = gatt_send_write_msg(p_tcb,
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_clcb->clcb_idx,
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         op_code,
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_attr->handle,
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_attr->len,
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         0,
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_attr->value);
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_WRITE:
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->len <= (p_tcb->payload_size - GATT_HDR_SIZE))
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_clcb->s_handle = p_attr->handle;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rt = gatt_send_write_msg(p_tcb,
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_clcb->clcb_idx,
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             GATT_REQ_WRITE,
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_attr->handle,
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_attr->len,
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             0,
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_attr->value);
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else /* prepare write for long attribute */
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_send_prepare_write(p_tcb, p_clcb);
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_WRITE_PREPARE:
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_send_prepare_write(p_tcb, p_clcb);
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rt = GATT_INTERNAL_ERROR;
271b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_ERROR("Unknown write type: %d", p_clcb->op_subtype);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rt = GATT_INTERNAL_ERROR;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    if ((rt != GATT_SUCCESS  && rt != GATT_CMD_STARTED && rt != GATT_CONGESTED)
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (rt != GATT_CMD_STARTED && p_clcb->op_subtype == GATT_WRITE_NO_RSP))
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (rt != GATT_SUCCESS)
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
283b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("gatt_act_write() failed op_code=0x%x", op_code);
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_end_operation(p_clcb, rt, NULL);
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_send_queue_write_cancel
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      send queue write cancel
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_send_queue_write_cancel (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, tGATT_EXEC_FLAG flag)
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       rt ;
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
301b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_send_queue_write_cancel ");
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rt = attp_send_cl_msg(p_tcb, p_clcb->clcb_idx, GATT_REQ_EXEC_WRITE, (tGATT_CL_MSG *)&flag);
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (rt != GATT_SUCCESS)
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_end_operation(p_clcb, rt, NULL);
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_check_write_long_terminate
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      To terminate write long or not.
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE: write long is terminated; FALSE keep sending.
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_check_write_long_terminate(tGATT_TCB  *p_tcb, tGATT_CLCB *p_clcb, tGATT_VALUE *p_rsp_value)
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE         *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf;
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             exec = FALSE;
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_EXEC_FLAG     flag = GATT_PREP_WRITE_EXEC;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
325b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_check_write_long_terminate ");
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check the first write response status */
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rsp_value != NULL)
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rsp_value->handle != p_attr->handle ||
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rsp_value->len != p_clcb->counter ||
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcmp(p_rsp_value->value, p_attr->value + p_attr->offset, p_rsp_value->len))
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* data does not match    */
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->status = GATT_ERROR;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            flag = GATT_PREP_WRITE_CANCEL;
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            exec = TRUE;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* response checking is good */
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->status = GATT_SUCCESS;
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* update write offset and check if end of attribute value */
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_attr->offset += p_rsp_value->len) >= p_attr->len)
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                exec = TRUE;
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (exec)
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_send_queue_write_cancel (p_tcb, p_clcb, flag);
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_send_prepare_write
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send prepare write.
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_send_prepare_write(tGATT_TCB  *p_tcb, tGATT_CLCB *p_clcb)
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE  *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  to_send, offset;
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   rt = GATT_SUCCESS;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   type = p_clcb->op_subtype;
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
369b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_send_prepare_write type=0x%x", type );
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    to_send = p_attr->len - p_attr->offset;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (to_send > (p_tcb->payload_size - GATT_WRITE_LONG_HDR_SIZE)) /* 2 = UINT16 offset bytes  */
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        to_send = p_tcb->payload_size - GATT_WRITE_LONG_HDR_SIZE;
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clcb->s_handle = p_attr->handle;
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    offset = p_attr->offset;
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (type == GATT_WRITE_PREPARE)
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        offset += p_clcb->start_offset;
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
383b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("offset =0x%x len=%d", offset, to_send );
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rt = gatt_send_write_msg(p_tcb,
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             p_clcb->clcb_idx,
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             GATT_REQ_PREPARE_WRITE,
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             p_attr->handle,
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             to_send,                           /* length */
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             offset,                            /* used as offset */
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             p_attr->value + p_attr->offset);   /* data */
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* remember the write long attribute length */
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clcb->counter = to_send;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3966975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if (rt != GATT_SUCCESS && rt != GATT_CMD_STARTED)
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_end_operation(p_clcb, rt, NULL);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
402ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_find_type_value_rsp
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle find by type value response.
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid gatt_process_find_type_value_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT16 len, UINT8 *p_data)
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_DISC_RES      result;
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p = p_data;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(p_tcb);
4197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
420b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_process_find_type_value_rsp ");
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* unexpected response */
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->operation != GATTC_OPTYPE_DISCOVERY || p_clcb->op_subtype != GATT_DISC_SRVC_BY_UUID)
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memset (&result, 0, sizeof(tGATT_DISC_RES));
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.type.len = 2;
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.type.uu.uuid16 = GATT_UUID_PRI_SERVICE;
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* returns a series of handle ranges */
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (len >= 4)
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16 (result.handle, p);
433ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        STREAM_TO_UINT16 (result.value.group_value.e_handle, p);
434ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy (&result.value.group_value.service_type,  &p_clcb->uuid, sizeof(tBT_UUID));
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
436ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        len -= 4;
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->p_reg->app_cb.p_disc_res_cb)
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_clcb->p_reg->app_cb.p_disc_res_cb)(p_clcb->conn_id, p_clcb->op_subtype, &result);
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* last handle  + 1 */
443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_clcb->s_handle = (result.value.group_value.e_handle == 0) ? 0 : (result.value.group_value.e_handle + 1);
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initiate another request */
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_act_discovery(p_clcb) ;
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_read_info_rsp
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle the read information
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  response.
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid gatt_process_read_info_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
4597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                UINT16 len, UINT8 *p_data)
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_DISC_RES  result;
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data, uuid_len = 0, type;
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(p_tcb);
4657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(op_code);
4667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
467ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    if (len < GATT_INFO_RSP_MIN_LEN)
468ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    {
469b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("invalid Info Response PDU received, discard.");
470ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach        gatt_end_operation(p_clcb, GATT_INVALID_PDU, NULL);
471ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach        return;
472ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    }
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* unexpected response */
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->operation != GATTC_OPTYPE_DISCOVERY || p_clcb->op_subtype != GATT_DISC_CHAR_DSCPT)
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(type, p);
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    len -= 1;
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (type == GATT_INFO_TYPE_PAIR_16)
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uuid_len = LEN_UUID_16;
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (type == GATT_INFO_TYPE_PAIR_128)
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uuid_len = LEN_UUID_128;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (len >= uuid_len + 2)
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16 (result.handle, p);
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (uuid_len > 0)
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!gatt_parse_uuid_from_cmd(&result.type, uuid_len, &p))
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (&result.type, &p_clcb->uuid, sizeof(tBT_UUID));
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len -= (uuid_len + 2);
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->p_reg->app_cb.p_disc_res_cb)
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_clcb->p_reg->app_cb.p_disc_res_cb)(p_clcb->conn_id, p_clcb->op_subtype, &result);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clcb->s_handle = (result.handle == 0) ? 0 :(result.handle + 1);
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initiate another request */
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_act_discovery(p_clcb) ;
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_proc_disc_error_rsp
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function process the read by type response and send another
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  request if needed.
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid gatt_proc_disc_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 opcode,
5187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              UINT16 handle, UINT8 reason)
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS    status = (tGATT_STATUS) reason;
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(p_tcb);
5237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(handle);
5247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
525b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_proc_disc_error_rsp reason: %02x cmd_code %04x", reason, opcode);
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (opcode)
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_REQ_READ_BY_GRP_TYPE:
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_REQ_FIND_TYPE_VALUE:
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_REQ_READ_BY_TYPE:
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_REQ_FIND_INFO:
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (reason == GATT_NOT_FOUND)
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = GATT_SUCCESS;
536b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_DEBUG("Discovery completed");
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
540b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("Incorrect discovery opcode %04x",   opcode);
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_end_operation(p_clcb, status, NULL);
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_error_rsp
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle the error response
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid gatt_process_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
5587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                            UINT16 len, UINT8 *p_data)
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   opcode, reason, * p= p_data;
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  handle;
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE  *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf;
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(op_code);
5657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(len);
5667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
567b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_process_error_rsp ");
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(opcode, p);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16(handle, p);
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(reason, p);
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY)
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        gatt_proc_disc_error_rsp(p_tcb, p_clcb, opcode, handle, reason);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_clcb->operation == GATTC_OPTYPE_WRITE) &&
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (p_clcb->op_subtype == GATT_WRITE) &&
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (opcode == GATT_REQ_PREPARE_WRITE) &&
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (p_attr) &&
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (handle == p_attr->handle)  )
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->status = reason;
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_send_queue_write_cancel(p_tcb, p_clcb, GATT_PREP_WRITE_CANCEL);
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((p_clcb->operation == GATTC_OPTYPE_READ) &&
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 ((p_clcb->op_subtype == GATT_READ_CHAR_VALUE_HDL) ||
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  (p_clcb->op_subtype == GATT_READ_BY_HANDLE)) &&
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (opcode == GATT_REQ_READ_BLOB) &&
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 p_clcb->first_read_blob_after_read &&
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (reason == GATT_NOT_LONG))
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p_clcb->p_attr_buf);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_end_operation(p_clcb, reason, NULL);
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_prep_write_rsp
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle the read response
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_process_prep_write_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  UINT16 len, UINT8 *p_data)
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE  value = {0};
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8        *p= p_data;
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
616b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_ERROR("value resp op_code = %s len = %d", gatt_dbg_op_name(op_code), len);
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
618ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    if (len < GATT_PREP_WRITE_RSP_MIN_LEN)
619ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    {
620b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("illegal prepare write response length, discard");
621ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach        gatt_end_operation(p_clcb, GATT_INVALID_PDU, &value);
622ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach        return;
623ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    }
624ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16 (value.handle, p);
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16 (value.offset, p);
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    value.len = len - 4;
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (value.value, p, value.len);
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->op_subtype == GATT_WRITE_PREPARE)
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->status = GATT_SUCCESS;
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* application should verify handle offset
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           and value are matched or not */
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_end_operation(p_clcb, p_clcb->status, &value);
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_clcb->op_subtype == GATT_WRITE )
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!gatt_check_write_long_terminate(p_tcb, p_clcb, &value))
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_send_prepare_write(p_tcb, p_clcb);
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_notification
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle the handle value indication
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or handle value notification.
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_process_notification(tGATT_TCB *p_tcb, UINT8 op_code,
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               UINT16 len, UINT8 *p_data)
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE     value = {0};
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg;
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          conn_id;
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS    encrypt_status;
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p= p_data, i,
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event = (op_code == GATT_HANDLE_VALUE_NOTIF) ? GATTC_OPTYPE_NOTIFICATION : GATTC_OPTYPE_INDICATION;
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
668b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_process_notification ");
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
670ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    if (len < GATT_NOTIFICATION_MIN_LEN)
671ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    {
672b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("illegal notification PDU length, discard");
673ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach        return;
674ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    }
675ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16 (value.handle, p);
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    value.len = len - 2;
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (value.value, p, value.len);
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!GATT_HANDLE_IS_VALID(value.handle))
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* illegal handle, send ack now */
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (op_code == GATT_HANDLE_VALUE_IND)
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attp_send_cl_msg(p_tcb, 0, GATT_HANDLE_VALUE_CONF, NULL);
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (event == GATTC_OPTYPE_INDICATION)
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tcb->ind_count)
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* this is an error case that receiving an indication but we
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               still has an indication not being acked yet.
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               For now, just log the error reset the counter.
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               Later we need to disconnect the link unconditionally.
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
697b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("gatt_process_notification rcv Ind. but ind_count=%d (will reset ind_count)",  p_tcb->ind_count);
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb->ind_count = 0;
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* should notify all registered client with the handle value notificaion/indication
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       Note: need to do the indication count and start timer first then do callback
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     */
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0, p_reg = gatt_cb.cl_rcb; i < GATT_MAX_APPS; i++, p_reg++)
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_reg->in_use && p_reg->app_cb.p_cmpl_cb && (event == GATTC_OPTYPE_INDICATION))
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->ind_count++;
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (event == GATTC_OPTYPE_INDICATION)
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start a timer for app confirmation */
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tcb->ind_count > 0)
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_start_ind_ack_timer(p_tcb);
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* no app to indicate, or invalid handle */
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attp_send_cl_msg(p_tcb, 0, GATT_HANDLE_VALUE_CONF, NULL);
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
721ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    encrypt_status = gatt_get_link_encrypt_status(p_tcb);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0, p_reg = gatt_cb.cl_rcb; i < GATT_MAX_APPS; i++, p_reg++)
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_reg->in_use && p_reg->app_cb.p_cmpl_cb)
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if);
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_reg->app_cb.p_cmpl_cb) (conn_id, event, encrypt_status, (tGATT_CL_COMPLETE *)&value);
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_read_by_type_rsp
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle the read by type response.
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  read by type can be used for discovery, or read by type or
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  read characteristic value.
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_process_read_by_type_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT16 len, UINT8 *p_data)
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_DISC_RES      result;
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_DISC_VALUE    record_value;
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p = p_data, value_len, handle_len = 2;
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              handle = 0;
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* discovery procedure and no callback function registered */
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((!p_clcb->p_reg) || (!p_clcb->p_reg->app_cb.p_disc_res_cb)) && (p_clcb->operation == GATTC_OPTYPE_DISCOVERY))
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
756ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    if (len < GATT_READ_BY_TYPE_RSP_MIN_LEN)
757ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    {
758b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("Illegal ReadByType/ReadByGroupType Response length, discard");
759ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach        gatt_end_operation(p_clcb, GATT_INVALID_PDU, NULL);
760ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach        return;
761ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    }
762ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(value_len, p);
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((value_len > (p_tcb->payload_size - 2)) || (value_len > (len-1))  )
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this is an error case that server's response containing a value length which is larger than MTU-2
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           or value_len > message total length -1 */
769b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("gatt_process_read_by_type_rsp: Discard response op_code=%d vale_len=%d > (MTU-2=%d or msg_len-1=%d)",
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          op_code, value_len, (p_tcb->payload_size - 2), (len-1));
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_end_operation(p_clcb, GATT_ERROR, NULL);
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (op_code == GATT_RSP_READ_BY_GRP_TYPE)
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        handle_len = 4;
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    value_len -= handle_len; /* substract the handle pairs bytes */
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    len -= 1;
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (len >= (handle_len + value_len))
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(handle, p);
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!GATT_HANDLE_IS_VALID(handle))
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_end_operation(p_clcb, GATT_INVALID_HANDLE, NULL);
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&result, 0, sizeof(tGATT_DISC_RES));
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&record_value, 0, sizeof(tGATT_DISC_VALUE));
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result.handle = handle;
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result.type.len = 2;
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result.type.uu.uuid16 = disc_type_to_uuid[p_clcb->op_subtype];
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* discover all services */
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY &&
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->op_subtype == GATT_DISC_SRVC_ALL &&
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_code == GATT_RSP_READ_BY_GRP_TYPE)
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16(handle, p);
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!GATT_HANDLE_IS_VALID(handle))
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_end_operation(p_clcb, GATT_INVALID_HANDLE, NULL);
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                record_value.group_value.e_handle = handle;
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!gatt_parse_uuid_from_cmd(&record_value.group_value.service_type, value_len, &p))
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
815b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                    GATT_TRACE_ERROR("discover all service response parsing failure");
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* discover included service */
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && p_clcb->op_subtype == GATT_DISC_INC_SRVC)
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16(record_value.incl_service.s_handle, p);
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16(record_value.incl_service.e_handle, p);
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!GATT_HANDLE_IS_VALID(record_value.incl_service.s_handle) ||
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                !GATT_HANDLE_IS_VALID(record_value.incl_service.e_handle))
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_end_operation(p_clcb, GATT_INVALID_HANDLE, NULL);
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(value_len == 6)
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT16(record_value.incl_service.service_type.uu.uuid16, p);
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                record_value.incl_service.service_type.len = LEN_UUID_16;
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (value_len == 4)
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->s_handle = record_value.incl_service.s_handle;
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->read_uuid128.wait_for_read_rsp = TRUE;
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->read_uuid128.next_disc_start_hdl = handle + 1;
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&p_clcb->read_uuid128.result, &result, sizeof(result));
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&p_clcb->read_uuid128.result.value, &record_value, sizeof (result.value));
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->op_subtype |= 0x90;
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_act_read(p_clcb, 0);
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
851b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati               GATT_TRACE_ERROR("gatt_process_read_by_type_rsp INCL_SRVC failed with invalid data value_len=%d", value_len);
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               gatt_end_operation(p_clcb, GATT_INVALID_PDU, (void *)p);
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               return;
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* read by type */
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_clcb->operation == GATTC_OPTYPE_READ && p_clcb->op_subtype == GATT_READ_BY_TYPE)
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->counter = len - 2;
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->s_handle = handle;
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( p_clcb->counter == (p_clcb->p_tcb->payload_size -4))
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->op_subtype = GATT_READ_BY_HANDLE;
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!p_clcb->p_attr_buf)
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_clcb->p_attr_buf = (UINT8 *)GKI_getbuf(GATT_MAX_ATTR_LEN);
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_clcb->p_attr_buf && p_clcb->counter <= GATT_MAX_ATTR_LEN)
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memcpy(p_clcb->p_attr_buf, p, p_clcb->counter);
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_act_read(p_clcb, p_clcb->counter);
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   gatt_end_operation(p_clcb, GATT_INTERNAL_ERROR, (void *)p);
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p);
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8806975b4d711142b885af479721cada448952c6b41Andre Eisenbach        else /* discover characterisitic */
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT8 (record_value.dclr_value.char_prop, p);
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16(record_value.dclr_value.val_handle, p);
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!GATT_HANDLE_IS_VALID(record_value.dclr_value.val_handle))
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_end_operation(p_clcb, GATT_INVALID_HANDLE, NULL);
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
889ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (!gatt_parse_uuid_from_cmd(&record_value.dclr_value.char_uuid, (UINT16)(value_len - 3), &p))
890ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
891ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                gatt_end_operation(p_clcb, GATT_SUCCESS, NULL);
892ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* invalid format, and skip the result */
893ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return;
894ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* UUID not matching */
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!gatt_uuid_compare(record_value.dclr_value.char_uuid, p_clcb->uuid))
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                len -= (value_len + 2);
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                continue; /* skip the result, and look for next one */
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (p_clcb->operation == GATTC_OPTYPE_READ)
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* UUID match for read characteristic value */
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* only read the first matching UUID characteristic value, and
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  discard the rest results */
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->s_handle = record_value.dclr_value.val_handle;
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->op_subtype |= 0x80;
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_act_read(p_clcb, 0);
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len -= (value_len + handle_len);
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* result is (handle, 16bits UUID) pairs */
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (&result.value, &record_value, sizeof (result.value));
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send callback if is discover procedure */
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && p_clcb->p_reg->app_cb.p_disc_res_cb)
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_clcb->p_reg->app_cb.p_disc_res_cb)(p_clcb->conn_id, p_clcb->op_subtype, &result);
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clcb->s_handle = (handle == 0) ? 0 : (handle + 1);
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY)
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initiate another request */
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_act_discovery(p_clcb) ;
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* read characteristic value */
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_act_read(p_clcb, 0);
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_read_rsp
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle the read BLOB response
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid gatt_process_read_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb,  UINT8 op_code,
9477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                           UINT16 len, UINT8 *p_data)
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      offset = p_clcb->counter;
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       * p= p_data;
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(op_code);
9537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->operation == GATTC_OPTYPE_READ)
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->op_subtype != GATT_READ_BY_HANDLE)
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->counter = len;
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p);
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* allocate GKI buffer holding up long attribute value  */
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!p_clcb->p_attr_buf)
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->p_attr_buf = (UINT8 *)GKI_getbuf(GATT_MAX_ATTR_LEN);
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* copy attrobute value into cb buffer  */
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clcb->p_attr_buf && offset < GATT_MAX_ATTR_LEN)
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((len + offset) > GATT_MAX_ATTR_LEN)
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len = GATT_MAX_ATTR_LEN - offset;
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->counter += len;
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_clcb->p_attr_buf + offset, p, len);
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send next request if needed  */
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (len == (p_tcb->payload_size - 1) && /* full packet for read or read blob rsp */
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len + offset < GATT_MAX_ATTR_LEN)
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
983b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                    GATT_TRACE_DEBUG("full pkt issue read blob for remianing bytes old offset=%d len=%d new offset=%d",
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      offset, len, p_clcb->counter);
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_act_read(p_clcb, p_clcb->counter);
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else /* end of request, send callback */
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p_clcb->p_attr_buf);
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else /* exception, should not happen */
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
994b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_ERROR("attr offset = %d p_attr_buf = %d ", offset, p_clcb->p_attr_buf);
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_end_operation(p_clcb, GATT_NO_RESOURCES, (void *)p_clcb->p_attr_buf);
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY &&
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->op_subtype == GATT_DISC_INC_SRVC &&
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->read_uuid128.wait_for_read_rsp )
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->s_handle = p_clcb->read_uuid128.next_disc_start_hdl;
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->read_uuid128.wait_for_read_rsp = FALSE;
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (len == LEN_UUID_128)
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_clcb->read_uuid128.result.value.incl_service.service_type.uu.uuid128, p, len);
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->read_uuid128.result.value.incl_service.service_type.len = LEN_UUID_128;
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( p_clcb->p_reg->app_cb.p_disc_res_cb)
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*p_clcb->p_reg->app_cb.p_disc_res_cb)(p_clcb->conn_id, p_clcb->op_subtype, &p_clcb->read_uuid128.result);
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_act_discovery(p_clcb) ;
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_end_operation(p_clcb, GATT_INVALID_PDU, (void *)p);
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_handle_rsp
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle the write response
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1036ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbachvoid gatt_process_handle_rsp(tGATT_CLCB *p_clcb)
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1038ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    gatt_end_operation(p_clcb, GATT_SUCCESS, NULL);
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_process_mtu_rsp
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process the configure MTU response.
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_process_mtu_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT16 len, UINT8 *p_data)
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 mtu;
1053ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    tGATT_STATUS    status = GATT_SUCCESS;
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1055ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    if (len < GATT_MTU_RSP_MIN_LEN)
1056ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    {
1057b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("invalid MTU response PDU received, discard.");
1058ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach        status = GATT_INVALID_PDU;
1059ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    }
1060ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    else
1061ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    {
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16(mtu, p_data);
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mtu < p_tcb->payload_size && mtu >= GATT_DEF_BLE_MTU_SIZE)
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb->payload_size = mtu;
1066ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    }
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1068ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach    gatt_end_operation(p_clcb, status, NULL);
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_cmd_to_rsp_code
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function convert a ATT command op code into the corresponding
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  response code assume no error occurs.
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          response code.
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_cmd_to_rsp_code (UINT8 cmd_code)
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   rsp_code  = 0;
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (cmd_code > 1 && cmd_code != GATT_CMD_WRITE)
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rsp_code = cmd_code + 1;
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rsp_code;
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_cl_send_next_cmd_inq
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Find next command in queue and sent to server
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if command sent, otherwise FALSE.
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_cl_send_next_cmd_inq(tGATT_TCB *p_tcb)
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CMD_Q  *p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req];
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     sent = FALSE;
1103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8       rsp_code;
1104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tGATT_CLCB   *p_clcb = NULL;
110517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tGATT_STATUS att_ret = GATT_SUCCESS;
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (!sent &&
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           p_tcb->pending_cl_req != p_tcb->next_slot_inq &&
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           p_cmd->to_send && p_cmd->p_cmd != NULL)
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
111117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        att_ret = attp_send_msg_to_l2cap(p_tcb, p_cmd->p_cmd);
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
111317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        if (att_ret == GATT_SUCCESS || att_ret == GATT_CONGESTED)
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
111517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            sent = TRUE;
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cmd->to_send = FALSE;
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cmd->p_cmd = NULL;
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1119ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* dequeue the request if is write command or sign write */
1120ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_cmd->op_code != GATT_CMD_WRITE && p_cmd->op_code != GATT_SIGN_CMD_WRITE)
1121ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
11225fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu                gatt_start_rsp_timer (p_cmd->clcb_idx);
1123ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
1124ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
1125ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
1126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_clcb = gatt_cmd_dequeue(p_tcb, &rsp_code);
1127ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1128ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* if no ack needed, keep sending */
112917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach                if (att_ret == GATT_SUCCESS)
113017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach                    sent = FALSE;
113117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
1132ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req];
1133ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* send command complete callback here */
113417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach                gatt_end_operation(p_clcb, att_ret, NULL);
1135ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1139b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("gatt_cl_send_next_cmd_inq: L2CAP sent error");
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(p_cmd, 0, sizeof(tGATT_CMD_Q));
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->pending_cl_req ++;
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req];
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1145ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return sent;
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_client_handle_server_rsp
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle the server response to
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  client.
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_client_handle_server_rsp (tGATT_TCB *p_tcb, UINT8 op_code,
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT16 len, UINT8 *p_data)
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB   *p_clcb = NULL;
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8        rsp_code;
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (op_code != GATT_HANDLE_VALUE_IND && op_code != GATT_HANDLE_VALUE_NOTIF)
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb = gatt_cmd_dequeue(p_tcb, &rsp_code);
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rsp_code = gatt_cmd_to_rsp_code(rsp_code);
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb == NULL || (rsp_code != op_code && op_code != GATT_RSP_ERROR))
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1175b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_WARNING ("ATT - Ignore wrong response. Receives (%02x) \
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                Request(%02x) Ignored", op_code, rsp_code);
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11815fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        {
11825fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu            btu_stop_timer (&p_clcb->rsp_timer_ent);
11835fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu            p_clcb->retry_count = 0;
11845fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        }
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the size of the message may not be bigger than the local max PDU size*/
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The message has to be smaller than the agreed MTU, len does not count op_code */
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len >= p_tcb->payload_size)
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1190b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("invalid response/indicate pkt size: %d, PDU size: %d", len + 1, p_tcb->payload_size);
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (op_code != GATT_HANDLE_VALUE_NOTIF &&
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_code != GATT_HANDLE_VALUE_IND)
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_end_operation(p_clcb, GATT_ERROR, NULL);
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (op_code)
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_ERROR:
12007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                gatt_process_error_rsp(p_tcb, p_clcb, op_code, len, p_data);
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_MTU:       /* 2 bytes mtu */
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_process_mtu_rsp(p_tcb, p_clcb, len ,p_data);
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_FIND_INFO:
12087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                gatt_process_read_info_rsp(p_tcb, p_clcb, op_code, len, p_data);
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_READ_BY_TYPE:
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_READ_BY_GRP_TYPE:
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_process_read_by_type_rsp(p_tcb, p_clcb, op_code, len, p_data);
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_READ:
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_READ_BLOB:
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_READ_MULTI:
12197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                gatt_process_read_rsp(p_tcb, p_clcb, op_code, len, p_data);
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_FIND_TYPE_VALUE: /* disc service with UUID */
12237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                gatt_process_find_type_value_rsp(p_tcb, p_clcb, len, p_data);
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_WRITE:
1227ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach                gatt_process_handle_rsp(p_clcb);
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_PREPARE_WRITE:
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_process_prep_write_rsp(p_tcb, p_clcb, op_code, len, p_data);
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_RSP_EXEC_WRITE:
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_end_operation(p_clcb, p_clcb->status, NULL);
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_HANDLE_VALUE_NOTIF:
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_HANDLE_VALUE_IND:
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_process_notification(p_tcb, op_code, len, p_data);
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
1244b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_ERROR("Unknown opcode = %d", op_code);
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (op_code != GATT_HANDLE_VALUE_IND && op_code != GATT_HANDLE_VALUE_NOTIF)
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_cl_send_next_cmd_inq(p_tcb);
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BLE_INCLUDED */
1258