15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2008-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 GATT server 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#include <string.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach#define GATT_MTU_REQ_MIN_LEN 2 33ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_enqueue_cmd 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function enqueue the request from client which needs a 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application response, and update the transaction ID. 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 gatt_sr_enqueue_cmd (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 handle) 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_CMD *p_cmd = &p_tcb->sr_cmd; 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id = 0; 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_cmd->op_code == 0) || 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (op_code == GATT_HANDLE_VALUE_CONF)) /* no pending request */ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_CMD_WRITE || 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code == GATT_SIGN_CMD_WRITE || 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code == GATT_REQ_MTU || 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code == GATT_HANDLE_VALUE_CONF) 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_id = ++p_tcb->trans_id; 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->trans_id = ++p_tcb->trans_id; 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->op_code = op_code; 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->handle = handle; 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->status = GATT_NOT_FOUND; 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->trans_id %= GATT_TRANS_ID_MAX; 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_id = p_cmd->trans_id; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return trans_id; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_cmd_empty 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function check the server command queue is empty or not. 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if empty, FALSE if there is pending command. 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_sr_cmd_empty (tGATT_TCB *p_tcb) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_tcb->sr_cmd.op_code == 0); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_dequeue_sr_cmd 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function dequeue the request from command queue. 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_dequeue_sr_cmd (tGATT_TCB *p_tcb) 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Double check in case any buffers are queued */ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG0("gatt_dequeue_sr_cmd" ); 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->sr_cmd.p_rsp_msg) 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR1("free p_tcb->sr_cmd.p_rsp_msg = %d", p_tcb->sr_cmd.p_rsp_msg); 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_tcb->sr_cmd.p_rsp_msg); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_tcb->sr_cmd.multi_rsp_q.p_first) 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_tcb->sr_cmd.multi_rsp_q)); 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset( &p_tcb->sr_cmd, 0, sizeof(tGATT_SR_CMD)); 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function process_read_multi_rsp 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function check the read multiple response. 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN if all replies have been received 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN process_read_multi_rsp (tGATT_SR_CMD *p_cmd, tGATT_STATUS status, 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_RSP *p_msg, UINT16 mtu) 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_RSP *p_rsp; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 ii, total_len, len; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = (BT_HDR *)GKI_getbuf((UINT16)sizeof(tGATTS_RSP)); 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_overflow = FALSE; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG2 ("process_read_multi_rsp status=%d mtu=%d", status, mtu); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf == NULL) 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->status = GATT_INSUF_RESOURCE; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Enqueue the response */ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)p_buf, (const void *)p_msg, sizeof(tGATTS_RSP)); 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&p_cmd->multi_rsp_q, p_buf); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->status = status; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == GATT_SUCCESS) 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG2 ("Multi read count=%d num_hdls=%d", 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->multi_rsp_q.count, p_cmd->multi_req.num_handles); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Wait till we get all the responses */ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cmd->multi_rsp_q.count == p_cmd->multi_req.num_handles) 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = sizeof(BT_HDR) + L2CAP_MIN_OFFSET + mtu; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getbuf(len)) == NULL) 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->status = GATT_INSUF_RESOURCE; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_buf, 0, len); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + p_buf->offset; 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First byte in the response is the opcode */ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = GATT_RSP_READ_MULTI; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 1; 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now walk through the buffers puting the data into the response in order */ 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (ii = 0; ii < p_cmd->multi_req.num_handles; ii++) 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ii==0) 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rsp = (tGATTS_RSP *)GKI_getfirst (&p_cmd->multi_rsp_q); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rsp = (tGATTS_RSP *)GKI_getnext (p_rsp); 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rsp != NULL) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project total_len = (p_buf->len + p_rsp->attr_value.len); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (total_len > mtu) 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just send the partial response for the overflow case */ 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = p_rsp->attr_value.len - (total_len - mtu); 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_overflow = TRUE; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG2 ("multi read overflow available len=%d val_len=%d", len, p_rsp->attr_value.len ); 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = p_rsp->attr_value.len; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rsp->attr_value.handle == p_cmd->multi_req.handles[ii]) 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_rsp->attr_value.value, len); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_overflow) 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += len; 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += len; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->status = GATT_NOT_FOUND; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_overflow) 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->status = GATT_NOT_FOUND; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } /* loop through all handles*/ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Sanity check on the buffer length */ 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf->len == 0) 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("process_read_multi_rsp - nothing found!!"); 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->status = GATT_NOT_FOUND; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG0(" GKI_freebuf (p_buf)"); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_cmd->p_rsp_msg != NULL) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->p_rsp_msg = p_buf; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* any handle read exception occurs, return error */ 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, still waiting */ 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_process_app_rsp 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function checks whether the response message from application 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** match any pending request or not. 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS gatt_sr_process_app_rsp (tGATT_TCB *p_tcb, tGATT_IF gatt_if, 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id, UINT8 op_code, 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status, tGATTS_RSP *p_msg) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS ret_code = GATT_SUCCESS; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1("gatt_sr_process_app_rsp gatt_if=%d", gatt_if); 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_update_cback_cnt(p_tcb, gatt_if, FALSE, FALSE); 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_READ_MULTI) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no error and still waiting, just return */ 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!process_read_multi_rsp (&p_tcb->sr_cmd, status, p_msg, p_tcb->payload_size)) 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(GATT_SUCCESS); 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_PREPARE_WRITE && status == GATT_SUCCESS) 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_update_prep_cnt(p_tcb, gatt_if, TRUE, FALSE); 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_EXEC_WRITE && status != GATT_SUCCESS) 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_reset_cback_cnt(p_tcb); 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.status = status; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_sr_is_cback_cnt_zero(p_tcb) 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && status == GATT_SUCCESS) 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->sr_cmd.p_rsp_msg == NULL) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.p_rsp_msg = attp_build_sr_msg (p_tcb, (UINT8)(op_code + 1), (tGATT_SR_MSG *)p_msg); 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("Exception!!! already has respond message"); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_sr_is_cback_cnt_zero(p_tcb)) 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_tcb->sr_cmd.status == GATT_SUCCESS) && (p_tcb->sr_cmd.p_rsp_msg) ) 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_code = attp_send_sr_msg (p_tcb, p_tcb->sr_cmd.p_rsp_msg); 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.p_rsp_msg = NULL; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_code = gatt_send_error_rsp (p_tcb, status, op_code, p_tcb->sr_cmd.handle, FALSE); 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_dequeue_sr_cmd(p_tcb); 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1("gatt_sr_process_app_rsp ret_code=%d", ret_code); 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret_code; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_process_exec_write_req 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process the execute write request 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from client. 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_process_exec_write_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT8 *p_data) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data, flag, i = 0; 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id = 0; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if; 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 337ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if GATT_CONFORMANCE_TESTING == TRUE 338ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) 339ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 340ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GATT_TRACE_DEBUG2("conf test forced err rsp for %s error status=%d", 341ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta __FUNCTION__,gatt_cb.err_status); 342ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3436975b4d711142b885af479721cada448952c6b41Andre Eisenbach gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, gatt_cb.handle, FALSE); 344ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 345ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 346ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 347ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 348ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8(flag, p); 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mask the flag */ 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flag &= GATT_PREP_WRITE_EXEC; 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no prep write is queued */ 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!gatt_sr_is_prep_cnt_zero(p_tcb)) 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_id = gatt_sr_enqueue_cmd(p_tcb, op_code, 0); 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_copy_prep_cnt_to_cback_cnt(p_tcb); 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<GATT_MAX_APPS; i++) 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->prep_cnt[i]) 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_if = (tGATT_IF) (i+1); 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if); 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_send_req_callback(conn_id, 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_id, 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATTS_REQ_TYPE_WRITE_EXEC, 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (tGATTS_DATA *)&flag); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->prep_cnt[i]= 0; 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* nothing needs to be executed , send response now */ 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("gatt_process_exec_write_req: no prepare write pending"); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_EXEC_WRITE, NULL)) != NULL) 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attp_send_sr_msg (p_tcb, p_buf); 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_process_read_multi_req 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process the read multiple request 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from client. 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_process_read_multi_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT8 *p_data) 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id; 4006975b4d711142b885af479721cada448952c6b41Andre Eisenbach UINT16 handle = 0, ll = len; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data, i_rcb; 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS err = GATT_SUCCESS; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sec_flag, key_size; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_RSP *p_msg; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG0("gatt_process_read_multi_req" ); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.multi_req.num_handles = 0; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_get_sec_info(p_tcb->peer_bda, 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID), 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &sec_flag, 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &key_size); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if GATT_CONFORMANCE_TESTING == TRUE 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1("Conformance tst: forced err rspvofr ReadMultiple: error status=%d", gatt_cb.err_status); 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(handle, p); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, handle, FALSE); 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (ll >= 2 && p_tcb->sr_cmd.multi_req.num_handles < GATT_MAX_READ_MULTI_HANDLES) 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(handle, p); 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((i_rcb = gatt_sr_find_i_rcb_by_handle(handle)) < GATT_MAX_SR_PROFILES) 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.multi_req.handles[p_tcb->sr_cmd.multi_req.num_handles++] = handle; 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check read permission */ 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((err = gatts_read_attr_perm_check( gatt_cb.sr_reg[i_rcb].p_db, 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FALSE, 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_flag, 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_size)) 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project != GATT_SUCCESS) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1("read permission denied : 0x%02x", err); 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* invalid handle */ 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = GATT_INVALID_HANDLE; 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ll -= 2; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ll != 0) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("max attribute handle reached in ReadMultiple Request."); 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->sr_cmd.multi_req.num_handles == 0) 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = GATT_INVALID_HANDLE; 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err == GATT_SUCCESS) 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((trans_id = gatt_sr_enqueue_cmd (p_tcb, op_code, p_tcb->sr_cmd.multi_req.handles[0])) != 0) 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_reset_cback_cnt(p_tcb); /* read multiple use multi_rsp_q's count*/ 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (ll = 0; ll < p_tcb->sr_cmd.multi_req.num_handles; ll ++) 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_msg = (tGATTS_RSP *)GKI_getbuf(sizeof(tGATTS_RSP))) != NULL) 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_msg, 0, sizeof(tGATTS_RSP)) 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ; 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = p_tcb->sr_cmd.multi_req.handles[ll]; 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i_rcb = gatt_sr_find_i_rcb_by_handle(handle); 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->attr_value.handle = handle; 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = gatts_read_attr_value_by_handle(p_tcb, 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.sr_reg[i_rcb].p_db, 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code, 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->attr_value.value, 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_msg->attr_value.len, 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_MAX_ATTR_LEN, 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_flag, 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_size, 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_id); 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err == GATT_SUCCESS) 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_process_app_rsp(p_tcb, gatt_cb.sr_reg[i_rcb].gatt_if ,trans_id, op_code, GATT_SUCCESS, p_msg); 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* either not using or done using the buffer, release it now */ 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_msg); 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = GATT_NO_RESOURCES; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_dequeue_sr_cmd(p_tcb); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = GATT_NO_RESOURCES; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in theroy BUSY is not possible(should already been checked), protected check */ 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err != GATT_SUCCESS && err != GATT_PENDING && err != GATT_BUSY) 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp(p_tcb, err, op_code, handle, FALSE); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_build_primary_service_rsp 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Primamry service request processed internally. Theretically 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** only deal with ReadByTypeVAlue and ReadByGroupType. 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tGATT_STATUS gatt_build_primary_service_rsp (BT_HDR *p_msg, tGATT_TCB *p_tcb, 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 op_code, UINT16 s_hdl, 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 e_hdl, UINT8 *p_data, tBT_UUID value) 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status = GATT_NOT_FOUND; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 handle_len =4, *p ; 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_rcb; 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_INFO *p_list= &gatt_cb.srv_list_info; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_ELEM *p_srv=NULL; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_uuid; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srv = p_list->p_first; 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_srv) 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg); 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->in_use && 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->s_hdl >= s_hdl && 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->s_hdl <= e_hdl && 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->type == GATT_UUID_PRI_SERVICE) 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 550ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach if ((p_uuid = gatts_get_service_uuid (p_rcb->p_db)) != NULL) 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_READ_BY_GRP_TYPE) 553ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach handle_len = 4 + p_uuid->len; 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach /* get the length byte in the repsonse */ 556ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach if (p_msg->offset ==0) 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 558ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach *p ++ = op_code + 1; 559ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach p_msg->len ++; 560ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach p_msg->offset = handle_len; 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 562ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach if (op_code == GATT_REQ_READ_BY_GRP_TYPE) 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 564ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach *p ++ = (UINT8)p_msg->offset; /* length byte */ 565ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach p_msg->len ++; 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 567ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach } 568ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach 569ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach if (p_msg->len + p_msg->offset <= p_tcb->payload_size && 570ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach handle_len == p_msg->offset) 571ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach { 572ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach if (op_code != GATT_REQ_FIND_TYPE_VALUE || 573ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach gatt_uuid_compare(value, *p_uuid)) 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 575ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach UINT16_TO_STREAM(p, p_rcb->s_hdl); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 577ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach if (p_list->p_last_primary == p_srv && 578ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach p_list->p_last_primary == p_list->p_last) 579ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach { 580ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach GATT_TRACE_DEBUG0("Use 0xFFFF for the last primary attribute"); 581ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach UINT16_TO_STREAM(p, 0xFFFF); /* see GATT ERRATA 4065, 4063, ATT ERRATA 4062 */ 582ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach } 583ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach else 584ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach { 585ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach UINT16_TO_STREAM(p, p_rcb->e_hdl); 586ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach } 587ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach 588ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach if (op_code == GATT_REQ_READ_BY_GRP_TYPE) 589ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach gatt_build_uuid_to_stream(&p, *p_uuid); 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 591ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach status = GATT_SUCCESS; 592ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach p_msg->len += p_msg->offset; 593ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach } 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 595ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach else 596ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach break; 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srv = p_srv->p_next; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->offset = L2CAP_MIN_OFFSET; 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_build_find_info_rsp 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description fill the find information response information in the given 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** buffer. 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE: if data filled sucessfully. 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** FALSE: packet full, or format mismatch. 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tGATT_STATUS gatt_build_find_info_rsp(tGATT_SR_REG *p_rcb, BT_HDR *p_msg, UINT16 *p_len, 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 s_hdl, UINT16 e_hdl) 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status = GATT_NOT_FOUND; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = *p_len; 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_ATTR16 *p_attr = NULL; 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 info_pair_len[2] = {4, 18}; 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_rcb->p_db || !p_rcb->p_db->p_attr_list) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check the attribute database */ 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = (tGATT_ATTR16 *) p_rcb->p_db->p_attr_list; 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET + p_msg->len; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_attr) 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->handle > e_hdl) 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->handle >= s_hdl) 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg->offset == 0) 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->offset = (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128) ? GATT_INFO_TYPE_PAIR_128 : GATT_INFO_TYPE_PAIR_16; 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len >= info_pair_len[p_msg->offset - 1]) 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg->offset == GATT_INFO_TYPE_PAIR_16 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, p_attr->handle); 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, p_attr->uuid); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 ) 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, p_attr->handle); 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *) p_attr)->uuid, LEN_UUID_128); 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("format mismatch"); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* format mismatch */ 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->len += info_pair_len[p_msg->offset - 1]; 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len -= info_pair_len[p_msg->offset - 1]; 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_SUCCESS; 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = (tGATT_ATTR16 *)p_attr->p_next; 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = len; 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_internal_read_by_type_req 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description check to see if the ReadByType request can be handled internally. 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tGATT_STATUS gatts_validate_packet_format(UINT8 op_code, UINT16 *p_len, 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 **p_data, tBT_UUID *p_uuid_filter, 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 *p_s_hdl, UINT16 *p_e_hdl) 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS reason = GATT_SUCCESS; 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 uuid_len, s_hdl = 0, e_hdl = 0; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = *p_len; 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = *p_data; 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len >= 4) 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* obtain starting handle, and ending handle */ 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(s_hdl, p); 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(e_hdl, p); 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len -= 4; 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s_hdl > e_hdl || !GATT_HANDLE_IS_VALID(s_hdl) || !GATT_HANDLE_IS_VALID(e_hdl)) 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_INVALID_HANDLE; 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for these PDUs, uuid filter must present */ 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (op_code == GATT_REQ_READ_BY_GRP_TYPE || 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code == GATT_REQ_FIND_TYPE_VALUE || 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code == GATT_REQ_READ_BY_TYPE) 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len >= 2 && p_uuid_filter != NULL) 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_len = (op_code == GATT_REQ_FIND_TYPE_VALUE) ? 2 : len; 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse uuid now */ 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_parse_uuid_from_cmd (p_uuid_filter, uuid_len, &p) == FALSE || 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_uuid_filter->len == 0) 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG0("UUID filter does not exsit"); 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_INVALID_PDU; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len -= p_uuid_filter->len; 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_INVALID_PDU; 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 736ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach else 737ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach reason = GATT_INVALID_PDU; 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data = p; 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = len; 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_s_hdl = s_hdl; 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_e_hdl = e_hdl; 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return reason; 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_process_primary_service_req 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process ReadByGroupType/ReadByTypeValue request, for discover 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** all primary services or discover primary service by UUID request. 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatts_process_primary_service_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT8 *p_data) 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 reason = GATT_INVALID_PDU; 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 s_hdl = 0, e_hdl = 0; 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID uuid, value, primary_service = {LEN_UUID_16, {GATT_UUID_PRI_SERVICE}}; 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_msg = NULL; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 msg_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET); 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = gatts_validate_packet_format(op_code, &len, &p_data, &uuid, &s_hdl, &e_hdl); 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == GATT_SUCCESS) 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_uuid_compare(uuid, primary_service)) 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_FIND_TYPE_VALUE) 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_parse_uuid_from_cmd(&value, len, &p_data) == FALSE) 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_INVALID_PDU; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == GATT_SUCCESS) 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_msg = (BT_HDR *)GKI_getbuf(msg_len)) == NULL) 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("gatts_process_primary_service_req failed. no resources."); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_NO_RESOURCES; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_msg, 0, msg_len); 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = gatt_build_primary_service_rsp (p_msg, p_tcb, op_code, s_hdl, e_hdl, p_data, value); 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_READ_BY_GRP_TYPE) 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_UNSUPPORT_GRP_TYPE; 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1("unexpected ReadByGrpType Group: 0x%04x", uuid.uu.uuid16); 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we do not support ReadByTypeValue with any non-primamry_service type */ 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_NOT_FOUND; 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1("unexpected ReadByTypeValue type: 0x%04x", uuid.uu.uuid16); 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason != GATT_SUCCESS) 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg) GKI_freebuf(p_msg); 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, reason, op_code, s_hdl, FALSE); 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attp_send_sr_msg(p_tcb, p_msg); 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_process_find_info 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process find information request, for discover character 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** descriptors. 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatts_process_find_info(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT8 *p_data) 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 reason = GATT_INVALID_PDU, *p; 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 s_hdl = 0, e_hdl = 0, buf_len; 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_msg = NULL; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_rcb; 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_INFO *p_list= &gatt_cb.srv_list_info; 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_ELEM *p_srv=NULL; 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = gatts_validate_packet_format(op_code, &len, &p_data, NULL, &s_hdl, &e_hdl); 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == GATT_SUCCESS) 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET); 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_msg = (BT_HDR *)GKI_getbuf(buf_len)) == NULL) 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_NO_RESOURCES; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_NOT_FOUND; 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_msg, 0, buf_len); 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET; 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p ++ = op_code + 1; 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->len = 2; 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf_len = p_tcb->payload_size - 2; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srv = p_list->p_first; 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_srv) 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg); 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->in_use && 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !(p_rcb->s_hdl > e_hdl || 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->e_hdl < s_hdl)) 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = gatt_build_find_info_rsp(p_rcb, p_msg, &buf_len, s_hdl, e_hdl); 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == GATT_NO_RESOURCES) 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_SUCCESS; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srv = p_srv->p_next; 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = (UINT8)p_msg->offset; 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->offset = L2CAP_MIN_OFFSET; 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason != GATT_SUCCESS) 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg) GKI_freebuf(p_msg); 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, reason, op_code, s_hdl, FALSE); 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attp_send_sr_msg(p_tcb, p_msg); 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_process_mtu_req 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process excahnge MTU request. 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Only used on LE. 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatts_process_mtu_req (tGATT_TCB *p_tcb, UINT16 len, UINT8 *p_data) 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu = 0; 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data, i; 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BR/EDR conenction, send error response */ 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->att_lcid != L2CAP_ATT_CID) 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, GATT_REQ_NOT_SUPPORTED, GATT_REQ_MTU, 0, FALSE); 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 914ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach else if (len < GATT_MTU_REQ_MIN_LEN) 915ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach { 916ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach GATT_TRACE_ERROR0("invalid MTU request PDU received."); 917ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach gatt_send_error_rsp (p_tcb, GATT_INVALID_PDU, GATT_REQ_MTU, 0, FALSE); 918ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach } 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 921ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach STREAM_TO_UINT16 (mtu, p); 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mtu must be greater than default MTU which is 23/48 */ 9234b63869f02e5860244fcc7f2f62e818ee702a74bAndre Eisenbach if (mtu < GATT_DEF_BLE_MTU_SIZE) 9244b63869f02e5860244fcc7f2f62e818ee702a74bAndre Eisenbach p_tcb->payload_size = GATT_DEF_BLE_MTU_SIZE; 9254b63869f02e5860244fcc7f2f62e818ee702a74bAndre Eisenbach else if (mtu > GATT_MAX_MTU_SIZE) 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->payload_size = GATT_MAX_MTU_SIZE; 9274b63869f02e5860244fcc7f2f62e818ee702a74bAndre Eisenbach else 9284b63869f02e5860244fcc7f2f62e818ee702a74bAndre Eisenbach p_tcb->payload_size = mtu; 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_MTU, (tGATT_SR_MSG *) &p_tcb->payload_size)) != NULL) 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attp_send_sr_msg (p_tcb, p_buf); 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all registered applicaiton with new MTU size. Us a transaction ID */ 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* of 0, as no response is allowed from applcations */ 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.cl_rcb[i].in_use ) 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_cb.cl_rcb[i].gatt_if); 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_send_req_callback(conn_id, 0, GATTS_REQ_TYPE_MTU, 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (tGATTS_DATA *)&p_tcb->payload_size); 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_process_read_by_type_req 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process Read By type request. 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This PDU can be used to perform: 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** - read characteristic value 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** - read characteristic descriptor value 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** - discover characteristic 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** - discover characteristic by UUID 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** - relationship discovery 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatts_process_read_by_type_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT8 *p_data) 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID uuid; 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_rcb; 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 msg_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET), 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf_len, 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_hdl, e_hdl, err_hdl = 0; 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_msg = NULL; 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS reason, ret; 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sec_flag, key_size; 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_INFO *p_list= &gatt_cb.srv_list_info; 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_ELEM *p_srv=NULL; 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = gatts_validate_packet_format(op_code, &len, &p_data, &uuid, &s_hdl, &e_hdl); 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if GATT_CONFORMANCE_TESTING == TRUE 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1("Conformance tst: forced err rsp for ReadByType: error status=%d", gatt_cb.err_status); 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, s_hdl, FALSE); 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == GATT_SUCCESS) 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_msg = (BT_HDR *)GKI_getbuf(msg_len)) == NULL) 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("gatts_process_find_info failed. no resources."); 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_NO_RESOURCES; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_msg, 0, msg_len); 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET; 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p ++ = op_code + 1; 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reserve length byte */ 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->len = 2; 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf_len = p_tcb->payload_size - 2; 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_NOT_FOUND; 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srv = p_list->p_first; 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_srv) 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg); 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->in_use && 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !(p_rcb->s_hdl > e_hdl || 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->e_hdl < s_hdl)) 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_get_sec_info(p_tcb->peer_bda, 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID), 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &sec_flag, 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &key_size); 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = gatts_db_read_attr_value_by_type(p_tcb, 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->p_db, 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code, 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg, 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_hdl, 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project e_hdl, 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid, 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &buf_len, 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_flag, 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_size, 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &err_hdl); 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ret != GATT_NOT_FOUND) 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = ret; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ret == GATT_NO_RESOURCES) 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_SUCCESS; 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ret != GATT_SUCCESS && ret != GATT_NOT_FOUND) 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_hdl = err_hdl; 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srv = p_srv->p_next; 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = (UINT8)p_msg->offset; 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->offset = L2CAP_MIN_OFFSET; 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason != GATT_SUCCESS) 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg) GKI_freebuf(p_msg); 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in theroy BUSY is not possible(should already been checked), protected check */ 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason != GATT_PENDING && reason != GATT_BUSY) 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, reason, op_code, s_hdl, FALSE); 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attp_send_sr_msg(p_tcb, p_msg); 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_process_write_req 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process the write request 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from client. 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatts_process_write_req (tGATT_TCB *p_tcb, UINT8 i_rcb, UINT16 handle, 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 op_code, UINT16 len, UINT8 *p_data) 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_DATA sr_data; 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id; 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status; 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sec_flag, key_size, *p = p_data; 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_sreg; 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&sr_data, 0, sizeof(tGATTS_DATA)); 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (op_code) 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_PREPARE_WRITE: 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sr_data.write_req.is_prep = TRUE; 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(sr_data.write_req.offset, p); 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len -= 2; 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_SIGN_CMD_WRITE: 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_SIGN_CMD_WRITE) 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG0("Write CMD with data sigining" ); 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len -= GATT_AUTH_SIGN_LEN; 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_CMD_WRITE: 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_WRITE: 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_WRITE || op_code == GATT_REQ_PREPARE_WRITE) 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sr_data.write_req.need_rsp = TRUE; 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sr_data.write_req.handle = handle; 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sr_data.write_req.len = len; 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (sr_data.write_req.value, p, len); 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_get_sec_info(p_tcb->peer_bda, 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID), 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &sec_flag, 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &key_size); 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = gatts_write_attr_perm_check (gatt_cb.sr_reg[i_rcb].p_db, 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code, 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sr_data.write_req.offset, 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p, 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len, 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_flag, 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_size); 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == GATT_SUCCESS) 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((trans_id = gatt_sr_enqueue_cmd(p_tcb, op_code, handle)) != 0) 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg = &gatt_cb.sr_reg[i_rcb]; 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_sreg->gatt_if); 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_send_req_callback(conn_id, 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_id, 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATTS_REQ_TYPE_WRITE, 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &sr_data); 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_PENDING; 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("max pending command, send error"); 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_BUSY; /* max pending command, application error */ 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in theroy BUSY is not possible(should already been checked), protected check */ 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != GATT_PENDING && status != GATT_BUSY && 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (op_code == GATT_REQ_PREPARE_WRITE || op_code == GATT_REQ_WRITE)) 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, status, op_code, handle, FALSE); 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_process_read_req 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process the read request 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from client. 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatts_process_read_req(tGATT_TCB *p_tcb, tGATT_SR_REG *p_rcb, UINT8 op_code, 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle, UINT16 len, UINT8 *p_data) 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 buf_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET); 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS reason; 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_msg = NULL; 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sec_flag, key_size, *p; 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 offset = 0, value_len = 0; 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_msg = (BT_HDR *)GKI_getbuf(buf_len)) == NULL) 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("gatts_process_find_info failed. no resources."); 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_NO_RESOURCES; 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_REQ_READ_BLOB) 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(offset, p_data); 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_msg, 0, buf_len); 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET; 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p ++ = op_code + 1; 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->len = 1; 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf_len = p_tcb->payload_size - 1; 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_get_sec_info(p_tcb->peer_bda, 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID), 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &sec_flag, 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &key_size); 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = gatts_read_attr_value_by_handle(p_tcb, 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->p_db, 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code, 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project offset, 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p, 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &value_len, 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf_len, 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_flag, 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_size, 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0); 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->len += value_len; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason != GATT_SUCCESS) 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg) GKI_freebuf(p_msg); 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in theroy BUSY is not possible(should already been checked), protected check */ 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason != GATT_PENDING && reason != GATT_BUSY) 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, reason, op_code, handle, FALSE); 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attp_send_sr_msg(p_tcb, p_msg); 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_process_attribute_req 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process the per attribute handle request 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from client. 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatts_process_attribute_req (tGATT_TCB *p_tcb, UINT8 op_code, 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len, UINT8 *p_data) 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1243ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach UINT16 handle = 0; 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data, i; 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_rcb = gatt_cb.sr_reg; 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status = GATT_INVALID_HANDLE; 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_ATTR16 *p_attr; 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1249ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach if (len < 2) 1250ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach { 1251ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach GATT_TRACE_ERROR0("Illegal PDU length, discard request"); 1252ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach status = GATT_INVALID_PDU; 1253ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach } 1254ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach else 1255ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach { 1256ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach STREAM_TO_UINT16(handle, p); 1257ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach len -= 2; 1258ccf9c15f52eea21858d994601d71308e84c7c859Andre Eisenbach } 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if GATT_CONFORMANCE_TESTING == TRUE 12616975b4d711142b885af479721cada448952c6b41Andre Eisenbach gatt_cb.handle = handle; 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1("Conformance tst: forced err rsp: error status=%d", gatt_cb.err_status); 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, handle, FALSE); 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATT_HANDLE_IS_VALID(handle)) 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_rcb ++) 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->in_use && p_rcb->s_hdl <= handle && p_rcb->e_hdl >= handle) 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = (tGATT_ATTR16 *)p_rcb->p_db->p_attr_list; 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_attr) 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->handle == handle) 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (op_code) 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ: /* read char/char descriptor value */ 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_BLOB: 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_process_read_req(p_tcb, p_rcb, op_code, handle, len, p); 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_WRITE: /* write char/char descriptor value */ 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_CMD_WRITE: 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_SIGN_CMD_WRITE: 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_PREPARE_WRITE: 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_process_write_req(p_tcb, i, handle, op_code, len, p); 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_SUCCESS; 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = (tGATT_ATTR16 *)p_attr->p_next; 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != GATT_SUCCESS && op_code != GATT_CMD_WRITE && op_code != GATT_SIGN_CMD_WRITE) 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, status, op_code, handle, FALSE); 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_proc_srv_chg_ind_ack 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function process the service changed indicaiton ACK 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatts_proc_srv_chg_ind_ack(tGATT_TCB *p_tcb ) 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG_REQ req; 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_buf = NULL; 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG0("gatts_proc_srv_chg_ind_ack"); 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG0("NV update set srv chg = FALSE"); 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->srv_changed = FALSE; 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG)); 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.cb_info.p_srv_chg_callback) 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_UPDATE_CLIENT,&req, NULL); 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_chk_pending_ind 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function check any pending indication needs to be sent if 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** there is a pending indication then sent the indication 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatts_chk_pending_ind(tGATT_TCB *p_tcb ) 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_VALUE *p_buf = (tGATT_VALUE *)GKI_getfirst(&p_tcb->pending_ind_q); 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG0("gatts_chk_pending_ind"); 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf ) 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATTS_HandleValueIndication (p_buf->conn_id, 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->handle, 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len, 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->value); 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(GKI_remove_from_queue (&p_tcb->pending_ind_q, p_buf)); 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_proc_ind_ack 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function process the Indication ack 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE continue to process the indication ack by the aaplication 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if the ACk is not a Service Changed Indication Ack 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN gatts_proc_ind_ack(tGATT_TCB *p_tcb, UINT16 ack_handle) 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN continue_processing = TRUE; 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_DEBUG1 ("gatts_proc_ind_ack ack handle=%d", ack_handle); 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ack_handle == gatt_cb.handle_of_h_r) 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_proc_srv_chg_ind_ack(p_tcb); 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there is no need to inform the application since srv chg is handled internally by GATT */ 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue_processing = FALSE; 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_chk_pending_ind(p_tcb); 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return continue_processing; 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_process_value_conf 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process the handle value confirmation. 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatts_process_value_conf(tGATT_TCB *p_tcb, UINT8 op_code) 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle = p_tcb->indicate_handle; 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id; 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_rcb = gatt_cb.sr_reg; 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN continue_processing; 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_tcb->conf_timer_ent); 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATT_HANDLE_IS_VALID(handle)) 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->indicate_handle = 0; 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue_processing = gatts_proc_ind_ack(p_tcb, handle); 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (continue_processing) 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_rcb ++) 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->in_use && p_rcb->s_hdl <= handle && p_rcb->e_hdl >= handle) 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_id = gatt_sr_enqueue_cmd(p_tcb, op_code, handle); 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_rcb->gatt_if); 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_send_req_callback(conn_id, 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_id, GATTS_REQ_TYPE_CONF, (tGATTS_DATA *)&handle); 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR0("unexpected handle value confirmation"); 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_server_handle_client_req 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to handle the client requests to 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server. 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_server_handle_client_req (tGATT_TCB *p_tcb, UINT8 op_code, 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len, UINT8 *p_data) 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there is pending command, discard this one */ 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!gatt_sr_cmd_empty(p_tcb) && op_code != GATT_HANDLE_VALUE_CONF) 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the size of the message may not be bigger than the local max PDU size*/ 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The message has to be smaller than the agreed MTU, len does not include op code */ 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len >= p_tcb->payload_size) 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_TRACE_ERROR2("server receive invalid PDU size:%d pdu size:%d", len + 1, p_tcb->payload_size ); 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for invalid request expecting response, send it now */ 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code != GATT_CMD_WRITE && 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code != GATT_SIGN_CMD_WRITE && 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project op_code != GATT_HANDLE_VALUE_CONF) 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_error_rsp (p_tcb, GATT_INVALID_PDU, op_code, 0, FALSE); 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, ignore the pkt */ 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (op_code) 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_BY_GRP_TYPE: /* discover primary services */ 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_FIND_TYPE_VALUE: /* discover service by UUID */ 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_process_primary_service_req (p_tcb, op_code, len, p_data); 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_FIND_INFO:/* discover char descrptor */ 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_process_find_info(p_tcb, op_code, len, p_data); 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_BY_TYPE: /* read characteristic value, char descriptor value */ 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* discover characteristic, discover char by UUID */ 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_process_read_by_type_req(p_tcb, op_code, len, p_data); 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ: /* read char/char descriptor value */ 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_BLOB: 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_WRITE: /* write char/char descriptor value */ 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_CMD_WRITE: 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_SIGN_CMD_WRITE: 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_PREPARE_WRITE: 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_process_attribute_req (p_tcb, op_code, len, p_data); 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_HANDLE_VALUE_CONF: 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_process_value_conf (p_tcb, op_code); 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_MTU: 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_process_mtu_req (p_tcb, len, p_data); 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_EXEC_WRITE: 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_process_exec_write_req (p_tcb, op_code, len, p_data); 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_REQ_READ_MULTI: 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_process_read_multi_req (p_tcb, op_code, len, p_data); 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 1519