gatt_api.c revision 258c2538e3b62a8cdb403f2730c45d721e5292b4
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  this file contains GATT interface functions
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_api.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_SetTraceLevel
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sets the trace level.  If called with
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a value of 0xFF, it simply returns the current trace level.
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Input Parameters:
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      level:  The level to set the GATT tracing to:
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      0xff-returns the current setting.
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      0-turns off tracing.
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 1-Errors.
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 2-Warnings.
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 3-APIs.
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 4-Events.
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 5-Debug.
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          The new or current trace level
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 GATT_SetTraceLevel (UINT8 new_level)
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_level != 0xFF)
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_cb.trace_level = new_level;
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(gatt_cb.trace_level);
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  GATT SERVER API
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_AddHandleRange
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function add the allocated handles range for the specifed
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  application UUID, service UUID and service instance
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        p_hndl_range:   pointer to allocated handles information
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if handle range is added sucessfully; otherwise FALSE.
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN GATTS_AddHandleRange(tGATTS_HNDL_RANGE *p_hndl_range)
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM *p_buf;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN status= FALSE;
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = gatt_alloc_hdl_buffer()) != NULL)
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->asgn_range = *p_hndl_range;
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status  = gatt_add_an_item_to_list(&gatt_cb.hdl_list_info, p_buf);
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_NVRegister
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Application manager calls this function to register for
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  NV save callback function.  There can be one and only one
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  NV save callback function.
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        p_cb_info : callback informaiton
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  GATTS_NVRegister (tGATT_APPL_INFO *p_cb_info)
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN status= FALSE;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb_info)
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_cb.cb_info = *p_cb_info;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = TRUE;
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_init_srv_chg();
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_CreateService
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to reserve a block of handles for a service.
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  *** It should be called only once per service instance  ***
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        gatt_if       : application if
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_svc_uuid    : service UUID
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  svc_inst      : instance of the service inside the application
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  num_handles   : number of handles needed by the service.
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_pri        : is a primary service or not.
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          service handle if sucessful, otherwise 0.
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GATTS_CreateService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid,
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            UINT16 svc_inst, UINT16 num_handles, BOOLEAN is_pri)
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_INFO     *p_list_info= &gatt_cb.hdl_list_info;
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM     *p_list=NULL;
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  s_hdl=0;
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN                 save_hdl=FALSE;
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_PENDING_NEW_SRV_START      *p_buf=NULL;
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG              *p_reg = gatt_get_regcb(gatt_if);
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID     *p_app_uuid128;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
154b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTS_CreateService" );
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reg == NULL)
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
158b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("Inavlid gatt_if=%d", gatt_if);
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(0);
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_app_uuid128 = &p_reg->app_uuid128;
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) != NULL)
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        s_hdl = p_list->asgn_range.s_handle;
167b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG ("Service already been created!!");
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_svc_uuid->len == LEN_UUID_16) && (p_svc_uuid->uu.uuid16 == UUID_SERVCLASS_GATT_SERVER))
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s_hdl=  gatt_cb.hdl_cfg.gatt_start_hdl;
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((p_svc_uuid->len == LEN_UUID_16) && (p_svc_uuid->uu.uuid16 == UUID_SERVCLASS_GAP_SERVER))
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s_hdl= gatt_cb.hdl_cfg.gap_start_hdl;
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_list = p_list_info->p_first;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_list)
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s_hdl = p_list->asgn_range.e_handle + 1;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (s_hdl < gatt_cb.hdl_cfg.app_start_hdl)
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s_hdl= gatt_cb.hdl_cfg.app_start_hdl;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            save_hdl = TRUE;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check for space */
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (num_handles > (0xFFFF - s_hdl + 1))
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
199b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR ("GATTS_ReserveHandles: no handles, s_hdl: %u  needed: %u", s_hdl, num_handles);
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(0);
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_list = gatt_alloc_hdl_buffer()) == NULL)
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* No free entry */
206b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR ("GATTS_ReserveHandles: no free handle blocks");
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(0);
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->asgn_range.app_uuid128 = *p_app_uuid128;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->asgn_range.svc_uuid    = *p_svc_uuid;
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->asgn_range.svc_inst    = svc_inst;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->asgn_range.s_handle    = s_hdl;
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->asgn_range.e_handle    = s_hdl+num_handles-1;
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->asgn_range.is_primary  = is_pri;
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_add_an_item_to_list(p_list_info, p_list);
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (save_hdl)
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (gatt_cb.cb_info.p_nv_save_callback)
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*gatt_cb.cb_info.p_nv_save_callback)(TRUE, &p_list->asgn_range);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* add a pending new  service change item to the list */
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (p_buf = gatt_add_pending_new_srv_start(&p_list->asgn_range)) == NULL)
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* No free entry */
227b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_ERROR ("gatt_add_pending_new_srv_start: no free blocks");
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_list)
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_remove_an_item_from_list(p_list_info, p_list);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_free_hdl_buffer(p_list);
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(0);
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
237b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG ("Add a new srv chg item");
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!gatts_init_service_db(&p_list->svc_db, p_svc_uuid, is_pri, s_hdl , num_handles))
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
243b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("GATTS_ReserveHandles: service DB initialization failed");
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_list)
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_remove_an_item_from_list(p_list_info, p_list);
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_free_hdl_buffer(p_list);
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_buf)
251258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov            osi_freebuf(fixed_queue_try_remove_from_queue(gatt_cb.pending_new_srv_start_q, p_buf));
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(0);
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("GATTS_CreateService(success): handles needed:%u s_hdl=%u e_hdl=%u %s[%x] is_primary=%d",
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       num_handles, p_list->asgn_range.s_handle , p_list->asgn_range.e_handle,
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       ((p_list->asgn_range.svc_uuid.len == 2) ? "uuid16": "uuid128" ),
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_list->asgn_range.svc_uuid.uu.uuid16,
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_list->asgn_range.is_primary);
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(s_hdl);
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_AddIncludeService
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add an included service.
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        service_handle : To which service this included service is added to.
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  include_svc_handle    : included service handle.
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          included service attribute handle. If 0, add included service
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  fail.
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GATTS_AddIncludeService (UINT16 service_handle, UINT16 include_svc_handle)
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM  *p_decl, *p_incl_decl;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
284b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("Service not created");
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_incl_decl = gatt_find_hdl_buffer_by_handle(include_svc_handle)) == NULL)
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
289b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("Included Service not created");
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return gatts_add_included_service(&p_decl->svc_db,
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_incl_decl->asgn_range.s_handle,
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_incl_decl->asgn_range.e_handle,
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_incl_decl->asgn_range.svc_uuid);
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_AddCharacteristic
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a characteristic into a service.
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It will add a characteristic declaration and characteristic
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  value declaration into the service database identified by the
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service handle.
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        service_handle : To which service this included service is added to.
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  char_uuid : Characteristic UUID.
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  perm      : Characteristic value declaration attribute permission.
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  property  : Characteristic Properties
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Characteristic value declaration attribute handle. 0 if failed.
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GATTS_AddCharacteristic (UINT16 service_handle, tBT_UUID *p_char_uuid,
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                tGATT_PERM perm,tGATT_CHAR_PROP property)
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM  *p_decl;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
322b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("Service not created");
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* data validity checking */
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (  ((property & GATT_CHAR_PROP_BIT_AUTH) && !(perm & GATT_WRITE_SIGNED_PERM)) ||
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          ((perm & GATT_WRITE_SIGNED_PERM) && !(property & GATT_CHAR_PROP_BIT_AUTH)) )
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
329b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("Invalid configuration property=0x%x perm=0x%x ", property, perm);
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0;
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return gatts_add_characteristic(&p_decl->svc_db,
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    perm,
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    property,
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_char_uuid);
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_AddCharDescriptor
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a characteristic descriptor
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  into a service database. Add descriptor should follow add char
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to which it belongs, and next add char should be done only
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  after all add descriptors for the previous char.
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        service_handle  : To which service this characteristic descriptor
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    is added to.
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  perm            : Characteristic value declaration attribute
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    permission.
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_descr_uuid    : Characteristic descriptor UUID
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         Characteristic descriptor attribute handle. 0 if add
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                 characteristic descriptor failed.
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GATTS_AddCharDescriptor (UINT16 service_handle,
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 tGATT_PERM perm,
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 tBT_UUID  * p_descr_uuid)
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM  *p_decl;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
365b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("Service not created");
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_descr_uuid == NULL ||
3697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (p_descr_uuid->len != LEN_UUID_128 && p_descr_uuid->len !=  LEN_UUID_16
3707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         && p_descr_uuid->len !=  LEN_UUID_32))
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
372b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("Illegal parameter");
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0;
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return gatts_add_char_descr(&p_decl->svc_db,
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                perm,
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                p_descr_uuid);
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_DeleteService
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to delete a service.
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        gatt_if       : application interface
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_svc_uuid    : service UUID
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  svc_inst      : instance of the service inside the application
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if operation succeed, FALSE if handle block was not found.
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN GATTS_DeleteService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid, UINT16 svc_inst)
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_INFO             *p_list_info= &gatt_cb.hdl_list_info;
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM             *p_list=NULL;
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                           i_sreg;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_PENDING_NEW_SRV_START    *p_buf;
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID *p_app_uuid128;
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
404b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("GATTS_DeleteService");
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reg == NULL)
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
408b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("Applicaiton not foud");
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_app_uuid128 = &p_reg->app_uuid128;
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) == NULL)
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
415b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("No Service found");
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_buf = gatt_sr_is_new_srv_chg(&p_list->asgn_range.app_uuid128,
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         &p_list->asgn_range.svc_uuid,
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_list->asgn_range.svc_inst)) != NULL)
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
423b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG ("Delete a new service changed item - the service has not yet started");
424258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov        osi_freebuf(fixed_queue_try_remove_from_queue(gatt_cb.pending_new_srv_start_q, p_buf));
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_proc_srv_chg();
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((i_sreg = gatt_sr_find_i_rcb_by_app_id (p_app_uuid128,
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                p_svc_uuid,
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                svc_inst)) != GATT_MAX_SR_PROFILES)
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GATTS_StopService(gatt_cb.sr_reg[i_sreg].s_hdl);
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
438b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("released handles s_hdl=%u e_hdl=%u",
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_list->asgn_range.s_handle , p_list->asgn_range.e_handle  );
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_list->asgn_range.s_handle >= gatt_cb.hdl_cfg.app_start_hdl)
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && gatt_cb.cb_info.p_nv_save_callback)
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*gatt_cb.cb_info.p_nv_save_callback)(FALSE, &p_list->asgn_range);
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_remove_an_item_from_list(p_list_info, p_list);
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_free_hdl_buffer(p_list);
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_StartService
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start a service with GATT
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        gatt_if : service handle.
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_cback       : application service callback functions.
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sup_transport : supported transport(s) for this primary service
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** return           GATT_SUCCESS if sucessfully started; otherwise error code.
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTS_StartService (tGATT_IF gatt_if, UINT16 service_handle,
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 tGATT_TRANSPORT sup_transport)
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_SR_REG            *p_sreg;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM      *p_list=NULL;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                    i_sreg;
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID                *p_uuid;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG              *p_reg = gatt_get_regcb(gatt_if);
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_PENDING_NEW_SRV_START *p_buf;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
475b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTS_StartService");
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reg == NULL)
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Not found  */
480b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("Applicaiton not found ");
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_NOT_FOUND;
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_list = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Not found  */
487b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("no service found");
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_NOT_FOUND;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (gatt_sr_find_i_rcb_by_app_id (&p_list->asgn_range.app_uuid128,
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      &p_list->asgn_range.svc_uuid,
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_list->asgn_range.svc_inst) != GATT_MAX_SR_PROFILES)
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
495b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("Duplicate Service start - Service already started");
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_SERVICE_STARTED;
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*this is a new application servoce start */
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((i_sreg = gatt_sr_alloc_rcb(p_list)) ==  GATT_MAX_SR_PROFILES)
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
502b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("GATTS_StartService: no free server registration block");
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_NO_RESOURCES;
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_sreg = &gatt_cb.sr_reg[i_sreg];
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_sreg->gatt_if = gatt_if;
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (sup_transport)
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_TRANSPORT_BR_EDR:
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case GATT_TRANSPORT_LE_BR_EDR:
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_sreg->type == GATT_UUID_PRI_SERVICE)
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_uuid = gatts_get_service_uuid (p_sreg->p_db);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_sreg->sdp_handle = gatt_add_sdp_record(p_uuid, p_sreg->s_hdl, p_sreg->e_hdl);
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatts_update_srv_list_elem(i_sreg, p_sreg->s_hdl,
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               p_list->asgn_range.is_primary);
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_add_a_srv_to_list(&gatt_cb.srv_list_info, &gatt_cb.srv_list[i_sreg]);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
529b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("allocated i_sreg=%d ",i_sreg);
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
531b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("s_hdl=%d e_hdl=%d type=0x%x svc_inst=%d sdp_hdl=0x%x",
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_sreg->s_hdl,p_sreg->e_hdl,
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_sreg->type,  p_sreg->service_instance,
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_sreg->sdp_handle);
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_buf = gatt_sr_is_new_srv_chg(&p_list->asgn_range.app_uuid128,
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         &p_list->asgn_range.svc_uuid,
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_list->asgn_range.svc_inst)) != NULL)
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_proc_srv_chg();
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remove the new service element after the srv changed processing is completed*/
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
544258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov        osi_freebuf(fixed_queue_try_remove_from_queue(gatt_cb.pending_new_srv_start_q, p_buf));
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return GATT_SUCCESS;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_StopService
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to stop a service
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter         service_handle : this is the start handle of a service
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GATTS_StopService (UINT16 service_handle)
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           ii = gatt_sr_find_i_rcb_by_handle(service_handle);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
564b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API("GATTS_StopService %u", service_handle);
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Index 0 is reserved for GATT, and is never stopped */
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (ii > 0) && (ii < GATT_MAX_SR_PROFILES) && (gatt_cb.sr_reg[ii].in_use) )
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_cb.sr_reg[ii].sdp_handle)
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            SDP_DeleteRecord(gatt_cb.sr_reg[ii].sdp_handle);
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_remove_a_srv_from_list(&gatt_cb.srv_list_info, &gatt_cb.srv_list[ii]);
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_cb.srv_list[ii].in_use = FALSE;
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (&gatt_cb.sr_reg[ii], 0, sizeof(tGATT_SR_REG));
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
579b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATTS_StopService service_handle: %u is not in use", service_handle);
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTs_HandleValueIndication
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends a handle value indication to a client.
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        conn_id: connection identifier.
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  attr_handle: Attribute handle of this handle value indication.
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  val_len: Length of the indicated attribute value.
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_val: Pointer to the indicated attribute value data.
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if sucessfully sent or queued; otherwise error code.
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id,  UINT16 attr_handle, UINT16 val_len, UINT8 *p_val)
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tGATT_STATUS    cmd_status = GATT_NO_RESOURCES;
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE      indication;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *p_msg;
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE     *p_buf;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF         gatt_if = GATT_GET_GATT_IF(conn_id);
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
609b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTS_HandleValueIndication");
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_reg == NULL) || (p_tcb == NULL))
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
612b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("GATTS_HandleValueIndication Unknown  conn_id: %u ", conn_id);
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(tGATT_STATUS) GATT_INVALID_CONN_ID;
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
61517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
61617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    if (! GATT_HANDLE_IS_VALID (attr_handle))
61717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        return GATT_ILLEGAL_PARAMETER;
61817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    indication.conn_id  = conn_id;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    indication.handle   = attr_handle;
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    indication.len      = val_len;
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (indication.value, p_val, val_len);
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    indication.auth_req = GATT_AUTH_REQ_NONE;
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    if (GATT_HANDLE_IS_VALID(p_tcb->indicate_handle))
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6274dcde90649cc51ca815a50d338a73adb408ab258Matthew Xie        GATT_TRACE_DEBUG ("Add a pending indication");
62817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        if ((p_buf = gatt_add_pending_ind(p_tcb, &indication)) !=NULL)
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
63017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cmd_status = GATT_SUCCESS;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
63417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cmd_status = GATT_NO_RESOURCES;
63517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        }
63617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    }
63717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    else
63817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    {
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
64017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        if ( (p_msg = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_IND, (tGATT_SR_MSG *)&indication)) != NULL)
64117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        {
64217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cmd_status = attp_send_sr_msg (p_tcb, p_msg);
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
64417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            if (cmd_status == GATT_SUCCESS || cmd_status == GATT_CONGESTED)
64517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            {
64617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach                p_tcb->indicate_handle = indication.handle;
64717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach                gatt_start_conf_timer(p_tcb);
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return cmd_status;
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_HandleValueNotification
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends a handle value notification to a client.
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        conn_id: connection identifier.
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  attr_handle: Attribute handle of this handle value indication.
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  val_len: Length of the indicated attribute value.
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_val: Pointer to the indicated attribute value data.
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if sucessfully sent; otherwise error code.
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTS_HandleValueNotification (UINT16 conn_id, UINT16 attr_handle,
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT16 val_len, UINT8 *p_val)
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS    cmd_sent = GATT_ILLEGAL_PARAMETER;
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *p_buf;
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE     notif;
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF         gatt_if = GATT_GET_GATT_IF(conn_id);
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
679b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTS_HandleValueNotification");
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_reg == NULL) || (p_tcb == NULL))
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
683b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("GATTS_HandleValueNotification Unknown  conn_id: %u ", conn_id);
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(tGATT_STATUS) GATT_INVALID_CONN_ID;
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATT_HANDLE_IS_VALID (attr_handle))
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        notif.handle    = attr_handle;
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        notif.len       = val_len;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (notif.value, p_val, val_len);
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        notif.auth_req = GATT_AUTH_REQ_NONE;;
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if ((p_buf = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_NOTIF, (tGATT_SR_MSG *)&notif))
6957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                   != NULL)
6967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
6977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            cmd_sent = attp_send_sr_msg (p_tcb, p_buf);
6987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
6997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
7007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            cmd_sent = GATT_NO_RESOURCES;
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return cmd_sent;
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTS_SendRsp
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends the server response to client.
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        conn_id: connection identifier.
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trans_id: transaction id
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  status: response status
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_msg: pointer to message parameters structure.
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if sucessfully sent; otherwise error code.
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTS_SendRsp (UINT16 conn_id,  UINT32 trans_id,
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            tGATT_STATUS status, tGATTS_RSP *p_msg)
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS cmd_sent = GATT_ILLEGAL_PARAMETER;
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF         gatt_if = GATT_GET_GATT_IF(conn_id);
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
728b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTS_SendRsp: conn_id: %u  trans_id: %u  Status: 0x%04x",
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     conn_id, trans_id, status);
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_reg == NULL) || (p_tcb == NULL))
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
733b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("GATTS_SendRsp Unknown  conn_id: %u ", conn_id);
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(tGATT_STATUS) GATT_INVALID_CONN_ID;
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb->sr_cmd.trans_id != trans_id)
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
739b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("GATTS_SendRsp conn_id: %u  waiting for op_code = %02x",
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           conn_id, p_tcb->sr_cmd.op_code);
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(GATT_WRONG_STATE);
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Process App response */
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cmd_sent = gatt_sr_process_app_rsp (p_tcb,  gatt_if, trans_id, p_tcb->sr_cmd.op_code, status, p_msg);
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return cmd_sent;
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* GATT Profile Srvr Functions */
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*                                                                             */
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*                   GATT CLIENT APIs                                          */
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*                                                                             */
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTC_ConfigureMTU
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to configure the ATT MTU size.
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       conn_id: connection identifier.
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mtu    - attribute MTU size..
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if command started successfully.
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_ConfigureMTU (UINT16 conn_id, UINT16 mtu)
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           ret = GATT_NO_RESOURCES;
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF        gatt_if=GATT_GET_GATT_IF(conn_id);
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB    *p_clcb;
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
783b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTC_ConfigureMTU conn_id=%d mtu=%d", conn_id, mtu );
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
785cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth    /* Validate that the link is BLE, not BR/EDR */
786cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth    if (p_tcb->transport != BT_TRANSPORT_LE)
787cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth    {
788cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth        return GATT_ERROR;
789cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth    }
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_tcb == NULL) || (p_reg==NULL) || (mtu < GATT_DEF_BLE_MTU_SIZE) || (mtu > GATT_MAX_MTU_SIZE))
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_ILLEGAL_PARAMETER;
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (gatt_is_clcb_allocated(conn_id))
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
798b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATTC_ConfigureMTU GATT_BUSY conn_id = %d", conn_id);
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_BUSY;
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL)
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->p_tcb->payload_size = mtu;
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->operation = GATTC_OPTYPE_CONFIG;
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ret = attp_send_cl_msg (p_clcb->p_tcb, p_clcb->clcb_idx, GATT_REQ_MTU, (tGATT_CL_MSG *)&mtu);
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTC_Discover
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to do a discovery procedure on ATT server.
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       conn_id: connection identifier.
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  disc_type:discovery type.
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_param: parameters of discovery requirement.
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if command received/sent successfully.
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_Discover (UINT16 conn_id, tGATT_DISC_TYPE disc_type,
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             tGATT_DISC_PARAM *p_param)
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS    status = GATT_SUCCESS;
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB      *p_clcb;
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF        gatt_if=GATT_GET_GATT_IF(conn_id);
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
837b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTC_Discover conn_id=%d disc_type=%d",conn_id, disc_type);
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_tcb == NULL) || (p_reg==NULL) ||(p_param == NULL) ||
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         (disc_type >= GATT_DISC_MAX))
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
842b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATTC_Discover Illegal param: disc_type %d conn_id = %d", disc_type, conn_id);
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_ILLEGAL_PARAMETER;
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (gatt_is_clcb_allocated(conn_id))
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
849b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATTC_Discover GATT_BUSY conn_id = %d", conn_id);
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_BUSY;
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL )
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!GATT_HANDLE_IS_VALID(p_param->s_handle) ||
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            !GATT_HANDLE_IS_VALID(p_param->e_handle) ||
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* search by type does not have a valid UUID param */
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (disc_type == GATT_DISC_SRVC_BY_UUID &&
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             p_param->service.len == 0))
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
862ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            gatt_clcb_dealloc(p_clcb);
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return GATT_ILLEGAL_PARAMETER;
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->operation  = GATTC_OPTYPE_DISCOVERY;
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->op_subtype = disc_type;
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->s_handle   = p_param->s_handle;
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->e_handle   = p_param->e_handle;
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->uuid       = p_param->service;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_act_discovery(p_clcb);
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = GATT_NO_RESOURCES;
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTC_Read
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the value of an attribute from
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the server.
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       conn_id: connection identifier.
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type    - attribute read type.
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_read  - read operation parameters.
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if command started successfully.
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_Read (UINT16 conn_id, tGATT_READ_TYPE type, tGATT_READ_PARAM *p_read)
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS status = GATT_SUCCESS;
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB          *p_clcb;
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_READ_MULTI    *p_read_multi;
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF            gatt_if=GATT_GET_GATT_IF(conn_id);
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               tcb_idx = GATT_GET_TCB_IDX(conn_id);
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB           *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG           *p_reg = gatt_get_regcb(gatt_if);
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
906b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTC_Read conn_id=%d type=%d", conn_id, type);
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_tcb == NULL) || (p_reg==NULL) || (p_read == NULL) || ((type >= GATT_READ_MAX) || (type == 0)))
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
910b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATT_Read Illegal param: conn_id %d, type 0%d,", conn_id, type);
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_ILLEGAL_PARAMETER;
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (gatt_is_clcb_allocated(conn_id))
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
916b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATTC_Read GATT_BUSY conn_id = %d", conn_id);
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_BUSY;
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_clcb = gatt_clcb_alloc(conn_id)) != NULL  )
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->operation = GATTC_OPTYPE_READ;
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->op_subtype = type;
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->auth_req = p_read->by_handle.auth_req;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->counter = 0;
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (type)
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_READ_BY_TYPE:
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_READ_CHAR_VALUE:
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->s_handle = p_read->service.s_handle;
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->e_handle = p_read->service.e_handle;
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&p_clcb->uuid, &p_read->service.uuid, sizeof(tBT_UUID));
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_READ_MULTIPLE:
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->s_handle = 0;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* copy multiple handles in CB */
938258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov                p_read_multi = (tGATT_READ_MULTI *)osi_getbuf(sizeof(tGATT_READ_MULTI));
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->p_attr_buf = (UINT8*)p_read_multi;
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (p_read_multi, &p_read->read_multiple, sizeof(tGATT_READ_MULTI));
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_READ_BY_HANDLE:
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_READ_PARTIAL:
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memset(&p_clcb->uuid, 0, sizeof(tBT_UUID));
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->s_handle = p_read->by_handle.handle;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (type == GATT_READ_PARTIAL)
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_clcb->counter = p_read->partial.offset;
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start security check */
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_security_check_start(p_clcb) == FALSE)
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = GATT_NO_RESOURCES;
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_clcb_dealloc(p_clcb);
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = GATT_NO_RESOURCES;
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTC_Write
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to write the value of an attribute to
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the server.
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       conn_id: connection identifier.
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type    - attribute write type.
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_write  - write operation parameters.
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if command started successfully.
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_Write (UINT16 conn_id, tGATT_WRITE_TYPE type, tGATT_VALUE *p_write)
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS status = GATT_SUCCESS;
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB      *p_clcb;
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE     *p;
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF        gatt_if=GATT_GET_GATT_IF(conn_id);
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_tcb == NULL) || (p_reg==NULL) || (p_write == NULL) ||
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ((type != GATT_WRITE) && (type != GATT_WRITE_PREPARE) && (type != GATT_WRITE_NO_RSP)) )
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
996b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATT_Write Illegal param: conn_id %d, type 0%d,", conn_id, type);
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_ILLEGAL_PARAMETER;
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (gatt_is_clcb_allocated(conn_id))
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1002b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_BUSY;
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL )
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->operation  = GATTC_OPTYPE_WRITE;
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->op_subtype = type;
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->auth_req = p_write->auth_req;
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1012258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov        if (( p_clcb->p_attr_buf = (UINT8 *)osi_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL)
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p_clcb->p_attr_buf, (void *)p_write, sizeof(tGATT_VALUE));
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p =  (tGATT_VALUE *)p_clcb->p_attr_buf;
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (type == GATT_WRITE_PREPARE)
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->start_offset = p_write->offset;
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p->offset = 0;
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (gatt_security_check_start(p_clcb) == FALSE)
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = GATT_NO_RESOURCES;
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = GATT_NO_RESOURCES;
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == GATT_NO_RESOURCES)
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_clcb_dealloc(p_clcb);
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = GATT_NO_RESOURCES;
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTC_ExecuteWrite
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send an Execute write request to
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the server.
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       conn_id: connection identifier.
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_execute - to execute or cancel the prepare write requet(s)
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if command started successfully.
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_ExecuteWrite (UINT16 conn_id, BOOLEAN is_execute)
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS status = GATT_SUCCESS;
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB      *p_clcb;
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_EXEC_FLAG flag;
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF        gatt_if=GATT_GET_GATT_IF(conn_id);
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1067b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTC_ExecuteWrite conn_id=%d is_execute=%d", conn_id, is_execute);
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_tcb == NULL) || (p_reg==NULL) )
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1071b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATTC_ExecuteWrite Illegal param: conn_id %d", conn_id);
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_ILLEGAL_PARAMETER;
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (gatt_is_clcb_allocated(conn_id))
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1077b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GATT_BUSY;
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL)
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->operation  = GATTC_OPTYPE_EXE_WRITE;
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        flag = is_execute ? GATT_PREP_WRITE_EXEC : GATT_PREP_WRITE_CANCEL;
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_send_queue_write_cancel (p_clcb->p_tcb, p_clcb, flag);
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1089b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("Unable to allocate client CB for conn_id %d ", conn_id);
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = GATT_NO_RESOURCES;
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATTC_SendHandleValueConfirm
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a handle value confirmation
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  as response to a handle value notification from server.
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       conn_id: connection identifier.
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  handle: the handle of the attribute confirmation.
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if command started successfully.
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_SendHandleValueConfirm (UINT16 conn_id, UINT16 handle)
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS    ret = GATT_ILLEGAL_PARAMETER;
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB     *p_tcb=gatt_get_tcb_by_idx(GATT_GET_TCB_IDX(conn_id));
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1113b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATTC_SendHandleValueConfirm conn_id=%d handle=0x%x", conn_id, handle);
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tcb->ind_count > 0 )
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&p_tcb->ind_ack_timer_ent);
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1121b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG ("notif_count=%d ", p_tcb->ind_count);
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send confirmation now */
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ret = attp_send_cl_msg(p_tcb, 0, GATT_HANDLE_VALUE_CONF, (tGATT_CL_MSG *)&handle);
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->ind_count = 0;
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1130b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG ("GATTC_SendHandleValueConfirm - conn_id: %u - ignored not waiting for indicaiton ack", conn_id);
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ret = GATT_SUCCESS;
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1136b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("GATTC_SendHandleValueConfirm - Unknown conn_id: %u", conn_id);
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*                                                                             */
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*                   GATT  APIs                                                */
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*                                                                             */
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_SetIdleTimeout
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function (common to both client and server) sets the idle
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  timeout for a tansport connection
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        bd_addr:   target device bd address.
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  idle_tout: timeout value in seconds.
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout, tBT_TRANSPORT transport)
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb;
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         status = FALSE;
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, transport)) != NULL)
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tcb->att_lcid == L2CAP_ATT_CID)
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = L2CA_SetFixedChannelTout (bd_addr, L2CAP_ATT_CID, idle_tout);
1170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (idle_tout == GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP)
1172444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                L2CA_SetIdleTimeoutByBdAddr(p_tcb->peer_bda,
1173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP, BT_TRANSPORT_LE);
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = L2CA_SetIdleTimeout (p_tcb->att_lcid, idle_tout, FALSE);
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1181b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_SetIdleTimeout idle_tout=%d status=%d(1-OK 0-not performed)",
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    idle_tout, status);
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_Register
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to register an  application
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with GATT
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        p_app_uuid128: Application UUID
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_cb_info: callback functions.
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          0 for error, otherwise the index of the client registered with GATT
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_IF GATT_Register (tBT_UUID *p_app_uuid128, tGATT_CBACK *p_cb_info)
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG    *p_reg;
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8        i_gatt_if=0;
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF     gatt_if=0;
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1205b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_Register");
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_dbg_display_uuid(*p_app_uuid128);
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++)
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_reg->in_use  && !memcmp(p_app_uuid128->uu.uuid128, p_reg->app_uuid128.uu.uuid128, LEN_UUID_128))
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1212b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("application already registered.");
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return 0;
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++)
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_reg->in_use)
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(p_reg, 0 , sizeof(tGATT_REG));
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            i_gatt_if++;              /* one based number */
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_reg->app_uuid128 =  *p_app_uuid128;
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_if            =
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_reg->gatt_if     = (tGATT_IF)i_gatt_if;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_reg->app_cb      = *p_cb_info;
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_reg->in_use      = TRUE;
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1232b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("allocated gatt_if=%d", gatt_if);
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return gatt_if;
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_Deregister
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function deregistered the application from GATT.
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       gatt_if: applicaiton interface.
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GATT_Deregister (tGATT_IF gatt_if)
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb;
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB       *p_clcb;
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           i, ii, j;
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_SR_REG    *p_sreg;
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1256b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_Deregister gatt_if=%d", gatt_if);
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Index 0 is GAP and is never deregistered */
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (gatt_if == 0) || (p_reg == NULL) )
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1260b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("GATT_Deregister with invalid gatt_if: %u", gatt_if);
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stop all services  */
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* todo an applcaiton can not be deregistered if its services is also used by other application
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      deregisteration need to bed performed in an orderly fashion
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      no check for now */
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (ii = 0, p_sreg = gatt_cb.sr_reg; ii < GATT_MAX_SR_PROFILES; ii++, p_sreg++)
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_sreg->in_use && (p_sreg->gatt_if == gatt_if))
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GATTS_StopService(p_sreg->s_hdl);
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free all services db buffers if owned by this application */
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_free_srvc_db_buffer_app_id(&p_reg->app_uuid128);
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* When an application deregisters, check remove the link associated with the app */
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0, p_tcb = gatt_cb.tcb; i < GATT_MAX_PHY_CHANNEL; i++, p_tcb++)
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tcb->in_use)
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (gatt_get_ch_state(p_tcb) != GATT_CH_CLOSE)
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_update_app_use_link_flag(gatt_if, p_tcb,  FALSE, FALSE);
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!gatt_num_apps_hold_link(p_tcb))
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* this will disconnect the link or cancel the pending connect request at lower layer*/
12927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    gatt_disconnect(p_tcb);
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (j = 0, p_clcb= &gatt_cb.clcb[j]; j < GATT_CL_MAX_LCB; j++, p_clcb++)
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_clcb->in_use &&
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_clcb->p_reg->gatt_if == gatt_if) &&
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_clcb->p_tcb->tcb_idx == p_tcb->tcb_idx))
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13025fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu                    btu_stop_timer(&p_clcb->rsp_timer_ent);
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_clcb_dealloc (p_clcb);
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
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    gatt_deregister_bgdev_list(gatt_if);
1311e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    /* update the listen mode */
1312602162a13c6ed8abae53aee6deeda48b79f30911Zhihai Xu#if (defined(BLE_PERIPHERAL_MODE_SUPPORT) && (BLE_PERIPHERAL_MODE_SUPPORT == TRUE))
1313e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    GATT_Listen(gatt_if, FALSE, NULL);
1314eeeac99328c23304ab24698331b6600f3b545700Andre Eisenbach#endif
1315e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (p_reg, 0, sizeof(tGATT_REG));
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_StartIf
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after registration to start receiving
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callbacks for registered interface.  Function may call back
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with connection status and queued notifications
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        gatt_if: applicaiton interface.
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1330accf8811ddb623ea50b23b4dd9609661b6bf4718Steve Gu** Returns          None.
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GATT_StartIf (tGATT_IF gatt_if)
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG   *p_reg;
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB   *p_tcb;
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR     bda;
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       start_idx, found_idx;
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      conn_id;
13407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tGATT_TRANSPORT transport ;
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1342b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_StartIf gatt_if=%d", gatt_if);
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_reg = gatt_get_regcb(gatt_if)) != NULL)
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        start_idx = 0;
13467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport))
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_tcb = gatt_find_tcb_by_addr(bda, transport);
1349ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_reg->app_cb.p_conn_cb && p_tcb)
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if);
13527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*p_reg->app_cb.p_conn_cb)(gatt_if, bda, conn_id, TRUE, 0, transport);
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            start_idx = ++found_idx;
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_Connect
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1364ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function initiate a connecttion to a remote device on GATT
1365ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  channel.
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       gatt_if: applicaiton interface
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr: peer device address.
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_direct: is a direct conenection or a background auto connection
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if connection started; FALSE if connection start failure.
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct, tBT_TRANSPORT transport)
13757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG    *p_reg;
13777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN status = FALSE;
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1379b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_Connect gatt_if=%d", gatt_if);
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure app is registered */
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1384b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATT_Connect - gatt_if =%d is not registered", gatt_if);
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_direct)
13897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        status = gatt_act_connect (p_reg, bd_addr, transport);
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
13917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
13927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (transport == BT_TRANSPORT_LE)
1393ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        status = gatt_update_auto_connect_dev(gatt_if,TRUE, bd_addr, TRUE);
13947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
13957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1396b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("Unsupported transport for background connection");
13977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
13987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_CancelConnect
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function terminate the connection initaition to a remote
1409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  device on GATT channel.
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       gatt_if: client interface. If 0 used as unconditionally disconnect,
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          typically used for direct connection cancellation.
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr: peer device address.
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if connection started; FALSE if connection start failure.
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct){
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG     *p_reg;
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB     *p_tcb;
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       status = TRUE;
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF      temp_gatt_if;
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8         start_idx, found_idx;
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1425b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_CancelConnect gatt_if=%d", gatt_if);
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((gatt_if != 0) && ((p_reg = gatt_get_regcb(gatt_if)) == NULL))
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1429b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATT_CancelConnect - gatt_if =%d is not registered", gatt_if);
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_direct)
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!gatt_if)
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1437b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG("GATT_CancelConnect - unconditional");
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            start_idx = 0;
14397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* only LE connection can be cancelled */
14407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_tcb && gatt_num_apps_hold_link(p_tcb))
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                while (status && gatt_find_app_hold_link(p_tcb, start_idx, &found_idx, &temp_gatt_if))
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    status = gatt_cancel_open(temp_gatt_if, bd_addr);
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    start_idx = ++found_idx;
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1451b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_ERROR("GATT_CancelConnect - no app found");
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = FALSE;
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = gatt_cancel_open(gatt_if, bd_addr);
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!gatt_if)
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (gatt_get_num_apps_for_bg_dev(bd_addr))
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                while (gatt_find_app_for_bg_dev(bd_addr, &temp_gatt_if))
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_remove_bg_dev_for_app(temp_gatt_if, bd_addr);
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1471b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_ERROR("GATT_CancelConnect -no app associated with the bg device for unconditional removal");
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = FALSE;
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = gatt_remove_bg_dev_for_app(gatt_if, bd_addr);
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_Disconnect
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1488ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function disconnect the GATT channel for this registered
1489ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  application.
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       conn_id: connection identifier.
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_SUCCESS if disconnected.
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATT_Disconnect (UINT16 conn_id)
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS    ret = GATT_ILLEGAL_PARAMETER;
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb=NULL;
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF        gatt_if=GATT_GET_GATT_IF(conn_id);
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8          tcb_idx = GATT_GET_TCB_IDX(conn_id);
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1503b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_Disconnect conn_id=%d ", conn_id);
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tcb = gatt_get_tcb_by_idx(tcb_idx);
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE);
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!gatt_num_apps_hold_link(p_tcb))
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            gatt_disconnect(p_tcb);
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ret = GATT_SUCCESS;
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_GetConnectionInfor
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function use conn_id to find its associated BD address and applciation
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  interface
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters        conn_id: connection id  (input)
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                   p_gatt_if: applicaiton interface (output)
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                   bd_addr: peer device address. (output)
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE the ligical link information is found for conn_id
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_addr,
15357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                tBT_TRANSPORT *p_transport)
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF        gatt_if = GATT_GET_GATT_IF(conn_id);
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb= gatt_get_tcb_by_idx(tcb_idx);
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         status=FALSE;
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1544b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_GetConnectionInfor conn_id=%d", conn_id);
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb && p_reg )
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(bd_addr, p_tcb->peer_bda, BD_ADDR_LEN);
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_gatt_if = gatt_if;
15507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        *p_transport = p_tcb->transport;
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = TRUE;
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         GATT_GetConnIdIfConnected
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function find the conn_id if the logical link for BD address
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and applciation interface is connected
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters        gatt_if: applicaiton interface (input)
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                   bd_addr: peer device address. (input)
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                   p_conn_id: connection id  (output)
15677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                   transport: transport option
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15696975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Returns          TRUE the logical link is connected
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_conn_id,
15737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  tBT_TRANSPORT transport)
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
15767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tGATT_TCB       *p_tcb= gatt_find_tcb_by_addr(bd_addr, transport);
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         status=FALSE;
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reg && p_tcb && (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) )
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if);
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = TRUE;
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1585b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_GetConnIdIfConnected status=%d", status);
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
1591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         GATT_Listen
1593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function start or stop LE advertisement and listen for
1595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  connection.
1596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters       gatt_if: applicaiton interface
1598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  p_bd_addr: listen for specific address connection, or NULL for
1599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                             listen to all device connection.
1600e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**                  start: start or stop listening.
1601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE if advertisement is started; FALSE if adv start failure.
1603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
1605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN GATT_Listen (tGATT_IF gatt_if, BOOLEAN start, BD_ADDR_PTR bd_addr)
1606ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
1607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tGATT_REG    *p_reg;
1608ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1609b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("GATT_Listen gatt_if=%d", gatt_if);
1610ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1611ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Make sure app is registered */
1612ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
1613ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1614b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("GATT_Listen - gatt_if =%d is not registered", gatt_if);
1615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return(FALSE);
1616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1618ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (bd_addr != NULL)
1619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1620f1c764fab01c929f71e185b97433bf40938026d3Sharvil Nanavati        gatt_update_auto_connect_dev(gatt_if,start, bd_addr, FALSE);
1621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1622ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
1623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_reg->listening = start ? GATT_LISTEN_TO_ALL : GATT_LISTEN_TO_NONE;
1625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
16277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return gatt_update_listen_mode();
1628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1632